use of javax.websocket.CloseReason in project undertow by undertow-io.
the class WebsocketStressTestCase method websocketFragmentationStressTestCase.
@Test
public void websocketFragmentationStressTestCase() throws Exception {
final ByteArrayOutputStream out = new ByteArrayOutputStream();
final CountDownLatch done = new CountDownLatch(1);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; ++i) {
sb.append("message ");
sb.append(i);
}
String toSend = sb.toString();
final Session session = defaultContainer.connectToServer(new Endpoint() {
@Override
public void onOpen(Session session, EndpointConfig config) {
session.addMessageHandler(new MessageHandler.Partial<byte[]>() {
@Override
public void onMessage(byte[] bytes, boolean b) {
try {
out.write(bytes);
} catch (IOException e) {
e.printStackTrace();
done.countDown();
}
if (b) {
done.countDown();
}
}
});
}
@Override
public void onClose(Session session, CloseReason closeReason) {
done.countDown();
}
@Override
public void onError(Session session, Throwable thr) {
thr.printStackTrace();
done.countDown();
}
}, null, new URI("ws://" + DefaultServer.getHostAddress("default") + ":" + DefaultServer.getHostPort("default") + "/ws/stress"));
OutputStream stream = session.getBasicRemote().getSendStream();
for (int i = 0; i < toSend.length(); ++i) {
stream.write(toSend.charAt(i));
stream.flush();
}
stream.close();
assertTrue(done.await(40, TimeUnit.SECONDS));
assertEquals(toSend, new String(out.toByteArray()));
}
use of javax.websocket.CloseReason in project undertow by undertow-io.
the class ServerWebSocketContainer method pause.
/**
* Pauses the container
* @param listener
*/
public synchronized void pause(PauseListener listener) {
closed = true;
if (configuredServerEndpoints.isEmpty()) {
listener.paused();
return;
}
if (listener != null) {
pauseListeners.add(listener);
}
for (ConfiguredServerEndpoint endpoint : configuredServerEndpoints) {
for (final Session session : endpoint.getOpenSessions()) {
((UndertowSession) session).getExecutor().execute(new Runnable() {
@Override
public void run() {
try {
session.close(new CloseReason(CloseReason.CloseCodes.GOING_AWAY, ""));
} catch (Exception e) {
JsrWebSocketLogger.ROOT_LOGGER.couldNotCloseOnUndeploy(e);
}
}
});
}
}
Runnable done = new Runnable() {
int count = configuredServerEndpoints.size();
@Override
public synchronized void run() {
List<PauseListener> copy = null;
synchronized (ServerWebSocketContainer.this) {
count--;
if (count == 0) {
copy = new ArrayList<>(pauseListeners);
pauseListeners.clear();
}
}
if (copy != null) {
for (PauseListener p : copy) {
p.paused();
}
}
}
};
for (ConfiguredServerEndpoint endpoint : configuredServerEndpoints) {
endpoint.notifyClosed(done);
}
}
use of javax.websocket.CloseReason in project undertow by undertow-io.
the class JsrWebSocketServer07Test method testCloseFrame.
@org.junit.Test
public void testCloseFrame() throws Exception {
final int code = 1000;
final String reasonText = "TEST";
final AtomicReference<CloseReason> reason = new AtomicReference<>();
ByteBuffer payload = ByteBuffer.allocate(reasonText.length() + 2);
payload.putShort((short) code);
payload.put(reasonText.getBytes(StandardCharsets.UTF_8));
payload.flip();
final AtomicBoolean connected = new AtomicBoolean(false);
final FutureResult<?> latch = new FutureResult<>();
final CountDownLatch clientLatch = new CountDownLatch(1);
final AtomicInteger closeCount = new AtomicInteger();
class TestEndPoint extends Endpoint {
@Override
public void onOpen(final Session session, EndpointConfig config) {
connected.set(true);
}
@Override
public void onClose(Session session, CloseReason closeReason) {
closeCount.incrementAndGet();
reason.set(closeReason);
clientLatch.countDown();
}
}
ServerWebSocketContainer builder = new ServerWebSocketContainer(TestClassIntrospector.INSTANCE, DefaultServer.getWorkerSupplier(), DefaultServer.getBufferPool(), Collections.emptyList(), false, false);
builder.addEndpoint(ServerEndpointConfig.Builder.create(TestEndPoint.class, "/").configurator(new InstanceConfigurator(new TestEndPoint())).build());
deployServlet(builder);
WebSocketTestClient client = new WebSocketTestClient(getVersion(), new URI("ws://" + DefaultServer.getHostAddress("default") + ":" + DefaultServer.getHostPort("default") + "/"));
client.connect();
client.send(new CloseWebSocketFrame(code, reasonText), new FrameChecker(CloseWebSocketFrame.class, payload.array(), latch));
// FIXME UNDERTOW-1862 assertEquals(DONE, latch.getIoFuture().await());
latch.getIoFuture().await();
clientLatch.await();
assertEquals(code, reason.get().getCloseCode().getCode());
assertEquals(reasonText, reason.get().getReasonPhrase());
assertEquals(1, closeCount.get());
client.destroy();
}
use of javax.websocket.CloseReason in project undertow by undertow-io.
the class JsrWebSocketServer07Test method testCloseFrameWithoutReasonBody.
/**
* Section 5.5.1 of RFC 6455 says the reason body is optional
*/
@org.junit.Test
public void testCloseFrameWithoutReasonBody() throws Exception {
final int code = 1000;
final AtomicReference<CloseReason> reason = new AtomicReference<>();
ByteBuffer payload = ByteBuffer.allocate(2);
payload.putShort((short) code);
payload.flip();
final AtomicBoolean connected = new AtomicBoolean(false);
final FutureResult<?> latch = new FutureResult<>();
final CountDownLatch clientLatch = new CountDownLatch(1);
final AtomicInteger closeCount = new AtomicInteger();
class TestEndPoint extends Endpoint {
@Override
public void onOpen(final Session session, EndpointConfig config) {
connected.set(true);
}
@Override
public void onClose(Session session, CloseReason closeReason) {
closeCount.incrementAndGet();
reason.set(closeReason);
clientLatch.countDown();
}
}
ServerWebSocketContainer builder = new ServerWebSocketContainer(TestClassIntrospector.INSTANCE, DefaultServer.getWorkerSupplier(), DefaultServer.getBufferPool(), Collections.emptyList(), false, false);
builder.addEndpoint(ServerEndpointConfig.Builder.create(TestEndPoint.class, "/").configurator(new InstanceConfigurator(new TestEndPoint())).build());
deployServlet(builder);
WebSocketTestClient client = new WebSocketTestClient(getVersion(), new URI("ws://" + DefaultServer.getHostAddress("default") + ":" + DefaultServer.getHostPort("default") + "/"));
client.connect();
client.send(new CloseWebSocketFrame(code, null), new FrameChecker(CloseWebSocketFrame.class, payload.array(), latch));
assertEquals(DONE, latch.getIoFuture().await(10, TimeUnit.SECONDS));
clientLatch.await();
assertEquals(code, reason.get().getCloseCode().getCode());
assertEquals("", reason.get().getReasonPhrase());
assertEquals(1, closeCount.get());
client.destroy();
}
use of javax.websocket.CloseReason in project undertow by undertow-io.
the class FrameHandler method onFullCloseMessage.
@Override
protected void onFullCloseMessage(final WebSocketChannel channel, final BufferedBinaryMessage message) {
if (session.isSessionClosed()) {
// we have already handled this when we sent the close frame
message.getData().free();
return;
}
final Pooled<ByteBuffer[]> pooled = message.getData();
final ByteBuffer singleBuffer = toBuffer(pooled.getResource());
final ByteBuffer toSend = singleBuffer.duplicate();
// send the close immediatly
WebSockets.sendClose(toSend, channel, null);
session.getContainer().invokeEndpointMethod(executor, new Runnable() {
@Override
public void run() {
try {
if (singleBuffer.remaining() > 1) {
final CloseReason.CloseCode code = CloseReason.CloseCodes.getCloseCode(singleBuffer.getShort());
final String reasonPhrase = singleBuffer.remaining() > 1 ? new UTF8Output(singleBuffer).extract() : null;
session.closeInternal(new CloseReason(code, reasonPhrase));
} else {
session.closeInternal(new CloseReason(CloseReason.CloseCodes.NO_STATUS_CODE, null));
}
} catch (IOException e) {
invokeOnError(e);
} finally {
pooled.close();
}
}
});
}
Aggregations