@Test public void testServerWebsocketReceivePongExceedsMaxFrameSize() { String pingBody = randomAlphaString(113); Integer maxFrameSize = 64; Buffer ping1 = Buffer.buffer(Buffer.buffer(pingBody.getBytes()).getBytes(0, maxFrameSize)); Buffer ping2 = Buffer.buffer(Buffer.buffer(pingBody.getBytes()).getBytes(maxFrameSize, pingBody.length())); server = vertx.createHttpServer(new HttpServerOptions().setIdleTimeout(1).setPort(DEFAULT_HTTP_PORT).setHost(HttpTestBase.DEFAULT_HTTP_HOST).setMaxWebsocketFrameSize(maxFrameSize)); server.websocketHandler(ws -> { List<Buffer> pongs = new ArrayList<>(); ws.pongHandler(pong -> { pongs.add(pong); if (pongs.size() == 2) { assertEquals(pongs, Arrays.asList(ping1, ping2)); testComplete(); } }); }).listen(v -> { client.websocket(DEFAULT_HTTP_PORT, HttpTestBase.DEFAULT_HTTP_HOST, "/", ws -> { try { ws.writeFrame(new WebSocketFrameImpl(FrameType.PONG, ping1.copy().getByteBuf(), false)); ws.writeFrame(new WebSocketFrameImpl(FrameType.PONG, ping2.copy().getByteBuf(), true)); } catch(Throwable t) { fail(t); } }); }); await(); }
@Test public void testClientWebsocketReceivePingExceedsMaxFrameSize() { String pingBody = randomAlphaString(113); Integer maxFrameSize = 64; Buffer ping1 = Buffer.buffer(Buffer.buffer(pingBody.getBytes()).getBytes(0, maxFrameSize)); Buffer ping2 = Buffer.buffer(Buffer.buffer(pingBody.getBytes()).getBytes(maxFrameSize, pingBody.length())); server = vertx.createHttpServer(new HttpServerOptions().setIdleTimeout(1).setPort(DEFAULT_HTTP_PORT).setHost(HttpTestBase.DEFAULT_HTTP_HOST).setMaxWebsocketFrameSize(maxFrameSize)); server.websocketHandler(ws -> { }).listen(onSuccess(v -> { client.websocket(DEFAULT_HTTP_PORT, HttpTestBase.DEFAULT_HTTP_HOST, "/", ws -> { List<Buffer> pongs = new ArrayList<>(); ws.pongHandler(pong -> { pongs.add(pong); if (pongs.size() == 2) { assertEquals(pongs, Arrays.asList(ping1, ping2)); testComplete(); } }); try { ws.writeFrame(new WebSocketFrameImpl(FrameType.PING, ping1.copy().getByteBuf(), false)); ws.writeFrame(new WebSocketFrameImpl(FrameType.PING, ping2.copy().getByteBuf(), true)); } catch(Throwable t) { fail(t); } }); })); await(); }
@Test public void testServerWebsocketReceivePingExceedsMaxFrameSize() { String pingBody = randomAlphaString(113); Integer maxFrameSize = 64; Buffer ping1 = Buffer.buffer(Buffer.buffer(pingBody.getBytes()).getBytes(0, maxFrameSize)); Buffer ping2 = Buffer.buffer(Buffer.buffer(pingBody.getBytes()).getBytes(maxFrameSize, pingBody.length())); server = vertx.createHttpServer(new HttpServerOptions().setIdleTimeout(1).setPort(DEFAULT_HTTP_PORT).setHost(HttpTestBase.DEFAULT_HTTP_HOST).setMaxWebsocketFrameSize(maxFrameSize)); server.websocketHandler(ws -> { }).listen(onSuccess(v -> { client.websocket(DEFAULT_HTTP_PORT, HttpTestBase.DEFAULT_HTTP_HOST, "/", ws -> { List<Buffer> pongs = new ArrayList<>(); ws.pongHandler(pong -> { pongs.add(pong); if (pongs.size() == 2) { assertEquals(pongs, Arrays.asList(ping1, ping2)); testComplete(); } }); try { ws.writeFrame(new WebSocketFrameImpl(FrameType.PING, ping1.copy().getByteBuf(), false)); ws.writeFrame(new WebSocketFrameImpl(FrameType.PING, ping2.copy().getByteBuf(), true)); } catch(Throwable t) { fail(t); } }); })); await(); }
@Test public void testClientWebsocketSendPingExceeds125Bytes() { //Netty will prevent us from encoding a pingBody greater than 126 bytes by silently throwing an error in the background String pingBody = randomAlphaString(126); Integer maxFrameSize = 256; server = vertx.createHttpServer(new HttpServerOptions().setIdleTimeout(1).setPort(DEFAULT_HTTP_PORT).setHost(HttpTestBase.DEFAULT_HTTP_HOST).setMaxWebsocketFrameSize(maxFrameSize)); server.websocketHandler(ws -> { }).listen(onSuccess(v -> { client.websocket(DEFAULT_HTTP_PORT, HttpTestBase.DEFAULT_HTTP_HOST, "/", ws -> { ws.pongHandler(buffer -> fail()); ws.writeFrame(WebSocketFrame.pingFrame(Buffer.buffer(pingBody))); vertx.setTimer(2000, id -> testComplete()); }); })); await(); }
@Test public void testClientWebsocketSendPongExceeds125Bytes() { //Netty will prevent us from encoding a pingBody greater than 126 bytes by silently throwing an error in the background String pingBody = randomAlphaString(126); Integer maxFrameSize = 256; server = vertx.createHttpServer(new HttpServerOptions().setIdleTimeout(1).setPort(DEFAULT_HTTP_PORT).setHost(HttpTestBase.DEFAULT_HTTP_HOST).setMaxWebsocketFrameSize(maxFrameSize)); server.websocketHandler(ws -> { ws.pongHandler(buff -> fail()); vertx.setTimer(2000, id -> testComplete()); }).listen(onSuccess(v -> { client.websocket(DEFAULT_HTTP_PORT, HttpTestBase.DEFAULT_HTTP_HOST, "/", ws -> { ws.writeFrame(WebSocketFrame.pongFrame(Buffer.buffer(pingBody))); }); })); await(); }
ws.writeFrame(frame); if (j == frames - 1) { sent.add(currentSent.get());
ws.writeFrame(WebSocketFrame.binaryFrame(buff, true)); }; wsProvider.apply(client).
private void sendHeartbeat(WebSocket ws) { try { ws.writeFrame(new WebSocketFrameImpl(FrameType.PING)); EventManager.post(new ConnSuccEvent()); } catch (IllegalStateException e) { EventManager.post(new ConnFailEvent("heartbeat fail, " + e.getMessage())); LOGGER.error("heartbeat fail", e); } }
private void testError(String msg, String expectedErr) throws Exception { CountDownLatch latch = new CountDownLatch(1); client.websocket(websocketURI, ws -> { ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg, true)); ws.handler(buff -> { String str = buff.toString(); JsonObject received = new JsonObject(str); assertEquals("err", received.getString("type")); assertEquals(expectedErr, received.getString("body")); latch.countDown(); }); }); awaitLatch(latch); }
@Test public void testTextFrameSockJs() throws InterruptedException { String serverPath = "/text-sockjs"; setupSockJsServer(serverPath, this::echoRequest); List<Buffer> receivedMessages = new ArrayList<>(); WebSocket openedWebSocket = setupSockJsClient(serverPath, receivedMessages); String messageToSend = "[\"testMessage\"]"; openedWebSocket.writeFrame(WebSocketFrame.textFrame(messageToSend, true)); await(5, TimeUnit.SECONDS); assertEquals("Client should have received 2 messages: the reply and the close.", 2, receivedMessages.size()); Buffer expectedReply = Buffer.buffer("a" + messageToSend); assertEquals("Client reply should have matched request", expectedReply, receivedMessages.get(0)); assertEquals("Final message should have been a close", SOCKJS_CLOSE_REPLY, receivedMessages.get(1)); }
@Test public void testTextFrameRawWebSocket() throws InterruptedException { String serverPath = "/textecho"; setupSockJsServer(serverPath, this::echoRequest); String message = "hello"; AtomicReference<String> receivedReply = new AtomicReference<>(); WebSocket ws = setupRawWebsocketClient(serverPath); ws.handler(replyBuffer -> receivedReply.set(replyBuffer.toString())); ws.writeFrame(WebSocketFrame.textFrame(message, true)); await(5, TimeUnit.SECONDS); assertEquals("Client reply should have matched request", message, receivedReply.get()); }
@Test public void testHookCreateSocketRejected() throws Exception { CountDownLatch latch = new CountDownLatch(2); sockJSHandler.bridge(allAccessOptions, be -> { if (be.type() == BridgeEventType.SOCKET_CREATED) { be.complete(false); latch.countDown(); } else { be.complete(true); } }); client.websocket(websocketURI, ws -> { JsonObject msg = new JsonObject().put("type", "send").put("address", addr).put("body", "foobar"); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg.encode(), true)); ws.closeHandler(v -> latch.countDown()); }); awaitLatch(latch); }
@Test public void testMaxAddressLength() throws Exception { CountDownLatch latch = new CountDownLatch(1); sockJSHandler.bridge(new BridgeOptions(allAccessOptions).setMaxAddressLength(10)); client.websocket(websocketURI, ws -> { JsonObject msg = new JsonObject().put("type", "register").put("address", "someaddressyqgyuqwdyudyug"); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg.encode(), true)); ws.handler(buff -> { String str = buff.toString(); JsonObject received = new JsonObject(str); assertEquals("err", received.getString("type")); assertEquals("max_address_length_reached", received.getString("body")); latch.countDown(); }); }); awaitLatch(latch); }
private void testReceiveFail(String address, Object body) throws Exception { CountDownLatch latch = new CountDownLatch(1); client.websocket(websocketURI, ws -> { // Register JsonObject msg = new JsonObject().put("type", "register").put("address", address); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg.encode(), true)); ws.handler(buff -> fail("Shouldn't receive anything")); // Wait a bit to allow the handler to be setup on the server, then send message from eventbus vertx.setTimer(200, tid -> { vertx.eventBus().send(address, body); vertx.setTimer(200, tid2 -> latch.countDown()); }); }); awaitLatch(latch); }
private void testSend(String address, Object body, boolean headers) throws Exception { CountDownLatch latch = new CountDownLatch(1); client.websocket(websocketURI, ws -> { MessageConsumer<Object> consumer = vertx.eventBus().consumer(address); consumer.handler(msg -> { Object receivedBody = msg.body(); assertEquals(body, receivedBody); if (headers) { checkHeaders(msg); } consumer.unregister(v -> latch.countDown()); }); JsonObject msg = new JsonObject().put("type", "send").put("address", address).put("body", body); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg.encode(), true)); }); awaitLatch(latch); }
@Test public void testCombineMultipleFramesIntoASingleMessage() throws Exception { socketHandler = () -> { return socket -> socket.handler(buf -> { assertEquals("Hello World", buf.toString()); testComplete(); }); }; startServers(); client.websocket("/test/400/8ne8e94a/websocket", ws -> { ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame("[\"Hello", false)); ws.writeFrame(io.vertx.core.http.WebSocketFrame.continuationFrame(Buffer.buffer(" World\"]"), true)); ws.close(); }); await(); } }
@Test public void testSendWebsocketContinuationFrames() { // Use raw websocket transport client.websocket("/echo/websocket", ws -> { int size = 65535; Buffer buffer1 = TestUtils.randomBuffer(size); Buffer buffer2 = TestUtils.randomBuffer(size); ws.writeFrame(io.vertx.core.http.WebSocketFrame.binaryFrame(buffer1, false)); ws.writeFrame(io.vertx.core.http.WebSocketFrame.continuationFrame(buffer2, true)); Buffer received = Buffer.buffer(); ws.handler(buff -> { received.appendBuffer(buff); if (received.length() == size * 2) { testComplete(); } }); }); await(); }
@Test public void testClientWebsocketSendPingExceeds125Bytes() { //Netty will prevent us from encoding a pingBody greater than 126 bytes by silently throwing an error in the background String pingBody = randomAlphaString(126); Integer maxFrameSize = 256; server = vertx.createHttpServer(new HttpServerOptions().setIdleTimeout(1).setPort(DEFAULT_HTTP_PORT).setHost(HttpTestBase.DEFAULT_HTTP_HOST).setMaxWebsocketFrameSize(maxFrameSize)); server.websocketHandler(ws -> { }).listen(onSuccess(v -> { client.websocket(DEFAULT_HTTP_PORT, HttpTestBase.DEFAULT_HTTP_HOST, "/", ws -> { ws.pongHandler(buffer -> fail()); ws.writeFrame(WebSocketFrame.pingFrame(Buffer.buffer(pingBody))); vertx.setTimer(2000, id -> testComplete()); }); })); await(); }
@Test public void testClientWebsocketSendPongExceeds125Bytes() { //Netty will prevent us from encoding a pingBody greater than 126 bytes by silently throwing an error in the background String pingBody = randomAlphaString(126); Integer maxFrameSize = 256; server = vertx.createHttpServer(new HttpServerOptions().setIdleTimeout(1).setPort(DEFAULT_HTTP_PORT).setHost(HttpTestBase.DEFAULT_HTTP_HOST).setMaxWebsocketFrameSize(maxFrameSize)); server.websocketHandler(ws -> { ws.pongHandler(buff -> fail()); vertx.setTimer(2000, id -> testComplete()); }).listen(onSuccess(v -> { client.websocket(DEFAULT_HTTP_PORT, HttpTestBase.DEFAULT_HTTP_HOST, "/", ws -> { ws.writeFrame(WebSocketFrame.pongFrame(Buffer.buffer(pingBody))); }); })); await(); }
@Test public void testCookiesRemoved() throws Exception { router.route("/cookiesremoved/*").handler(SockJSHandler.create(vertx) .socketHandler(sock -> { MultiMap headers = sock.headers(); String cookieHeader = headers.get("cookie"); assertNotNull(cookieHeader); assertEquals("JSESSIONID=wibble", cookieHeader); testComplete(); })); MultiMap headers = new CaseInsensitiveHeaders(); headers.add("cookie", "JSESSIONID=wibble"); headers.add("cookie", "flibble=floob"); client.websocket("/cookiesremoved/websocket", headers, ws -> { String frame = "foo"; ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(frame, true)); }); await(); }