@Override public JsonObject decodeFromWire(int pos, Buffer buffer) { int length = buffer.getInt(pos); pos += 4; return new JsonObject(buffer.slice(pos, pos + length)); }
@Override public JsonArray decodeFromWire(int pos, Buffer buffer) { int length = buffer.getInt(pos); pos += 4; return new JsonArray(buffer.slice(pos, pos + length)); }
private byte[] readBytes(int len) throws VertxException { if (pos + len > in.length()) { throw new VertxException("Invalid DER: stream too short, missing tag"); } Buffer s = in.slice(pos, pos + len); pos += len; return s.getBytes(); }
private void direct(Buffer buffer) throws Exception { int pos = 0; int length = buffer.getInt(pos); pos += 4; consume(new JsonObject(buffer.slice(pos, pos + length))); } }
/** * 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 testPartialH2CAmbiguousRequest() throws Exception { server.requestHandler(req -> { assertEquals("POST", req.rawMethod()); testComplete(); }); Buffer fullRequest = Buffer.buffer("POST /whatever HTTP/1.1\r\n\r\n"); startServer(); NetClient client = vertx.createNetClient(); client.connect(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, onSuccess(so -> { so.write(fullRequest.slice(0, 1)); vertx.setTimer(1000, id -> { so.write(fullRequest.slice(1, fullRequest.length())); }); })); await(); }
req.setChunked(true); for (int i = 0; i < buffer.length() / 8192; i++) { req.write(buffer.slice(i * 8192, (i + 1) * 8192)); Thread.sleep(0, 100);
request.response().setChunked(true); for (int i = 0; i < buffer.length() / 8192; i++) { request.response().write(buffer.slice(i * 8192, (i + 1) * 8192));
@Test public void testSlice1() throws Exception { Buffer buff = TestUtils.randomBuffer(100); Buffer sliced = buff.slice(); assertEquals(buff, sliced); long rand = TestUtils.randomLong(); sliced.setLong(0, rand); assertEquals(rand, buff.getLong(0)); buff.appendString(TestUtils.randomUnicodeString(100)); assertEquals(100, sliced.length()); }
@Test public void testSlice2() throws Exception { Buffer buff = TestUtils.randomBuffer(100); Buffer sliced = buff.slice(10, 20); for (int i = 0; i < 10; i++) { assertEquals(buff.getByte(10 + i), sliced.getByte(i)); } long rand = TestUtils.randomLong(); sliced.setLong(0, rand); assertEquals(rand, buff.getLong(10)); buff.appendString(TestUtils.randomUnicodeString(100)); assertEquals(10, sliced.length()); }
@Override public JsonObject decodeFromWire(int pos, Buffer buffer) { int length = buffer.getInt(pos); pos += 4; return new JsonObject(buffer.slice(pos, pos + length)); }
@Override public JsonArray decodeFromWire(int pos, Buffer buffer) { int length = buffer.getInt(pos); pos += 4; return new JsonArray(buffer.slice(pos, pos + length)); }
private byte[] readBytes(int len) throws VertxException { if (pos + len > in.length()) { throw new VertxException("Invalid DER: stream too short, missing tag"); } Buffer s = in.slice(pos, pos + len); pos += len; return s.getBytes(); }
private void direct(Buffer buffer) throws Exception { int pos = 0; int length = buffer.getInt(pos); pos += 4; consume(new JsonObject(buffer.slice(pos, pos + length))); } }
/** * 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); } }
/** * Writing multiple continuation frames from the client side should result in a single message on the server side * after the frames are re-combined */ @Test public void testCombineBinaryContinuationFramesRawWebSocket() throws InterruptedException { String serverPath = "/combine"; AtomicReference<Buffer> serverReceivedMessage = new AtomicReference<>(); setupSockJsServer(serverPath, (sock, requestBuffer) -> { serverReceivedMessage.set(requestBuffer); sock.write(Buffer.buffer("reply")); sock.close(); }); Buffer largeMessage = Buffer.buffer(TestUtils.randomAlphaString(30)); WebSocketFrame frame1 = WebSocketFrame.binaryFrame(largeMessage.slice(0, 10), false); WebSocketFrame frame2 = WebSocketFrame.continuationFrame(largeMessage.slice(10, 20), false); WebSocketFrame frame3 = WebSocketFrame.continuationFrame(largeMessage.slice(20, largeMessage.length()), true); WebSocket ws = setupRawWebsocketClient(serverPath); ws.writeFrame(frame1); ws.writeFrame(frame2); ws.writeFrame(frame3); await(5, TimeUnit.SECONDS); assertEquals("Server did not combine continuation frames correctly", largeMessage, serverReceivedMessage.get()); }
@Test public void testPartialH2CAmbiguousRequest() throws Exception { server.requestHandler(req -> { assertEquals("POST", req.rawMethod()); testComplete(); }); Buffer fullRequest = Buffer.buffer("POST /whatever HTTP/1.1\r\n\r\n"); startServer(); NetClient client = vertx.createNetClient(); client.connect(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, onSuccess(so -> { so.write(fullRequest.slice(0, 1)); vertx.setTimer(1000, id -> { so.write(fullRequest.slice(1, fullRequest.length())); }); })); await(); }
@Test public void testCombineTextFrameSockJs() throws InterruptedException { String serverPath = "/text-combine-sockjs"; setupSockJsServer(serverPath, this::echoRequest); List<Buffer> receivedMessages = new ArrayList<>(); WebSocket openedWebSocket = setupSockJsClient(serverPath, receivedMessages); Buffer largeMessage = Buffer.buffer("[\"" + TestUtils.randomAlphaString(30) + "\"]"); WebSocketFrame frame1 = new WebSocketFrameImpl(FrameType.TEXT, largeMessage.slice(0, 10).getByteBuf(), false); WebSocketFrame frame2 = WebSocketFrame.continuationFrame(largeMessage.slice(10, 20), false); WebSocketFrame frame3 = WebSocketFrame.continuationFrame(largeMessage.slice(20, largeMessage.length()), true); log.debug("Client sending " + frame1.textData()); openedWebSocket.writeFrame(frame1); log.debug("Client sending " + frame2.textData()); openedWebSocket.writeFrame(frame2); log.debug("Client sending " + frame3.textData()); openedWebSocket.writeFrame(frame3); await(5, TimeUnit.SECONDS); assertEquals("Client should have received 2 messages: the reply and the close.", 2, receivedMessages.size()); Buffer expectedReply = Buffer.buffer("a" + largeMessage.toString()); 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 testSlice1() throws Exception { Buffer buff = TestUtils.randomBuffer(100); Buffer sliced = buff.slice(); assertEquals(buff, sliced); long rand = TestUtils.randomLong(); sliced.setLong(0, rand); assertEquals(rand, buff.getLong(0)); buff.appendString(TestUtils.randomUnicodeString(100)); assertEquals(100, sliced.length()); }
@Test public void testSlice2() throws Exception { Buffer buff = TestUtils.randomBuffer(100); Buffer sliced = buff.slice(10, 20); for (int i = 0; i < 10; i++) { assertEquals(buff.getByte(10 + i), sliced.getByte(i)); } long rand = TestUtils.randomLong(); sliced.setLong(0, rand); assertEquals(rand, buff.getLong(10)); buff.appendString(TestUtils.randomUnicodeString(100)); assertEquals(10, sliced.length()); }