@Override public WebSocketFrame textFrame(String str, boolean isFinal) { return new WebSocketFrameImpl(str, isFinal); }
@Override public WebSocketFrame pongFrame(Buffer data) { return new WebSocketFrameImpl(FrameType.PONG, data.getByteBuf(), true); } }
@Override public WebSocketFrame continuationFrame(Buffer data, boolean isFinal) { return new WebSocketFrameImpl(FrameType.CONTINUATION, data.getByteBuf(), isFinal); }
@Override public WebSocketFrame binaryFrame(Buffer data, boolean isFinal) { return new WebSocketFrameImpl(FrameType.BINARY, data.getByteBuf(), isFinal); }
@Override public WebSocketFrame pingFrame(Buffer data) { return new WebSocketFrameImpl(FrameType.PING, data.getByteBuf(), true); }
private void writeTextFrameInternal(String str) { WebSocketFrame frame = new WebSocketFrameImpl(str); writeFrame(frame); }
private void writeBinaryFrameInternal(Buffer data) { ByteBuf buf = data.getByteBuf(); WebSocketFrame frame = new WebSocketFrameImpl(FrameType.BINARY, buf); writeFrame(frame); }
WebSocketFrameInternal decodeFrame(WebSocketFrame msg) { ByteBuf payload = safeBuffer(msg, chctx.alloc()); boolean isFinal = msg.isFinalFragment(); FrameType frameType; if (msg instanceof BinaryWebSocketFrame) { frameType = FrameType.BINARY; } else if (msg instanceof CloseWebSocketFrame) { frameType = FrameType.CLOSE; } else if (msg instanceof PingWebSocketFrame) { frameType = FrameType.PING; } else if (msg instanceof PongWebSocketFrame) { frameType = FrameType.PONG; } else if (msg instanceof TextWebSocketFrame) { frameType = FrameType.TEXT; } else if (msg instanceof ContinuationWebSocketFrame) { frameType = FrameType.CONTINUATION; } else { throw new IllegalStateException("Unsupported websocket msg " + msg); } return new WebSocketFrameImpl(frameType, payload, isFinal); }
/** * Splits the provided buffer into multiple frames (which do not exceed the maximum web socket frame size) * and writes them in order to the socket. */ private void writePartialMessage(FrameType frameType, Buffer data, int offset) { int end = offset + maxWebSocketFrameSize; boolean isFinal; if (end >= data.length()) { end = data.length(); isFinal = true; } else { isFinal = false; } Buffer slice = data.slice(offset, end); WebSocketFrame frame; if (offset == 0 || !supportsContinuation) { frame = new WebSocketFrameImpl(frameType, slice.getByteBuf(), isFinal); } else { frame = WebSocketFrame.continuationFrame(slice, isFinal); } writeFrame(frame); int newOffset = offset + maxWebSocketFrameSize; if (!isFinal) { writePartialMessage(frameType, data, newOffset); } }
@Test public void testClientWebsocketReceivePongExceedsMaxFrameSize() { 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 -> { 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); } }).listen(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(); } }); }); }); await(); }
@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(); }
@Override public WebSocketFrame textFrame(String str, boolean isFinal) { return new WebSocketFrameImpl(str, isFinal); }
@Override public WebSocketFrame pongFrame(Buffer data) { return new WebSocketFrameImpl(FrameType.PONG, data.getByteBuf(), true); } }
private void writeTextFrameInternal(String str) { WebSocketFrame frame = new WebSocketFrameImpl(str); writeFrame(frame); }
@Override public WebSocketFrame continuationFrame(Buffer data, boolean isFinal) { return new WebSocketFrameImpl(FrameType.CONTINUATION, data.getByteBuf(), isFinal); }
@Override public WebSocketFrame pingFrame(Buffer data) { return new WebSocketFrameImpl(FrameType.PING, data.getByteBuf(), true); }
private void writeBinaryFrameInternal(Buffer data) { ByteBuf buf = data.getByteBuf(); WebSocketFrame frame = new WebSocketFrameImpl(FrameType.BINARY, buf); writeFrame(frame); }
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); } }