NetSocket clientSocket = req.netSocket(); clientSocket.write("HTTP/1.0 200 Connection established\n\n"); NetSocket serverSocket = ar.result();
private NetSocket handshake(HttpServerRequest req) { NetSocket so = req.netSocket(); try { MessageDigest digest = MessageDigest.getInstance("SHA-1"); byte[] inputBytes = (req.getHeader("Sec-WebSocket-Key") + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").getBytes(); digest.update(inputBytes); byte[] hashedBytes = digest.digest(); byte[] accept = Base64.getEncoder().encode(hashedBytes); Buffer data = Buffer.buffer(); data.appendString("HTTP/1.1 101 Switching Protocols\r\n"); data.appendString("Upgrade: websocket\r\n"); data.appendString("Connection: upgrade\r\n"); data.appendString("Sec-WebSocket-Accept: " + new String(accept) + "\r\n"); data.appendString("\r\n"); so.write(data); return so; } catch (NoSuchAlgorithmException e) { req.response().setStatusCode(500).end(); fail(e.getMessage()); return null; } }
@Test public void testClientConnectionExceptionHandler() throws Exception { server.requestHandler(req -> { NetSocket so = req.netSocket(); so.write(Buffer.buffer(TestUtils.randomAlphaString(40) + "\r\n")); }); CountDownLatch listenLatch = new CountDownLatch(1); server.listen(onSuccess(s -> listenLatch.countDown())); awaitLatch(listenLatch); HttpClientRequest req = client.post(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/somepath", resp -> { }); req.connectionHandler(conn -> { conn.exceptionHandler(err -> { testComplete(); }); }); req.sendHead(); await(); }
@Test public void testInvalidChunkInHttpClientResponse() throws Exception { server.requestHandler(req -> { NetSocket so = req.netSocket(); so.write("HTTP/1.1 200 OK\r\n"); so.write("Transfer-Encoding: chunked\r\n"); so.write("\r\n"); so.write("invalid\r\n"); // Empty chunk }); AtomicInteger status = new AtomicInteger(); testHttpClientResponseDecodeError(err -> { switch (status.incrementAndGet()) { case 1: assertTrue(err instanceof NumberFormatException); break; case 2: assertTrue(err instanceof VertxException); assertTrue(err.getMessage().equals("Connection was closed")); testComplete(); break; } }); }
@Test public void testIncorrectHttpVersion() throws Exception { server.requestHandler(req -> { NetSocket so = req.netSocket(); so.write(Buffer.buffer("HTTP/1.2 200 OK\r\nContent-Length:5\r\n\r\nHELLO")); so.close(); }); startServer(); AtomicBoolean a = new AtomicBoolean(); HttpClientRequest req = client.request(HttpMethod.GET, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, onFailure(err -> { if (a.compareAndSet(false, true)) { assertTrue("message " + err.getMessage() + " should contain HTTP/1.2", err.getMessage().contains("HTTP/1.2")); } })); req.exceptionHandler(err -> { fail("Should not be called"); }).putHeader("connection", "close") .connectionHandler(conn -> conn.closeHandler(v -> testComplete())) .end(); await(); }
@Test public void testInvalidTrailersInHttpClientResponse() throws Exception { server.requestHandler(req -> { NetSocket so = req.netSocket(); so.write("HTTP/1.1 200 OK\r\n"); so.write("Transfer-Encoding: chunked\r\n"); so.write("\r\n"); so.write("0\r\n"); // Empty chunk // Send large trailer for (int i = 0;i < 2000;i++) { so.write("01234567"); } }); AtomicInteger status = new AtomicInteger(); testHttpClientResponseDecodeError(err -> { switch (status.incrementAndGet()) { case 1: assertTrue(err instanceof TooLongFrameException); break; case 2: assertTrue(err instanceof VertxException); assertTrue(err.getMessage().equals("Connection was closed")); testComplete(); break; } }); }
@Override public NetSocket netSocket() { return delegate.netSocket(); }
NetSocket socket = req.netSocket(); AtomicInteger status = new AtomicInteger(); socket.handler(buff -> {
@Test public void testHttpInvalidConnectResponseEnded() { waitFor(2); server.requestHandler(req -> { req.response().end(); try { req.netSocket(); fail(); } catch (IllegalStateException e) { complete(); } }); server.listen(onSuccess(s -> { client.request(HttpMethod.CONNECT, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, onSuccess(resp -> { assertEquals(200, resp.statusCode()); complete(); })).end(); })); await(); }
req.response().setStatusCode(200); req.response().setStatusMessage("Connection established"); NetSocket so = req.netSocket(); so.handler(so::write); so.closeHandler(v -> {
netClient.connect(port, host, result -> { if (result.succeeded()) { NetSocket serverSocket = request.netSocket(); NetSocket clientSocket = result.result(); serverSocket.closeHandler(v -> clientSocket.close());
AtomicInteger status = new AtomicInteger(); server.requestHandler(req -> { NetSocket socket = req.netSocket(); socket.handler(buff -> { switch (status.getAndIncrement()) {
private NetSocket getUpgradedNetSocket(HttpServerRequest req, String path) { assertEquals(path, req.path()); assertEquals("upgrade", req.headers().get("Connection")); NetSocket sock = req.netSocket(); String secHeader = req.headers().get("Sec-WebSocket-Key"); String tmp = secHeader + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; String encoded = sha1(tmp); sock.write("HTTP/1.1 101 Web Socket Protocol Handshake\r\n" + "Upgrade: WebSocket\r\n" + "Connection: upgrade\r\n" + "Sec-WebSocket-Accept: " + encoded + "\r\n" + "\r\n"); return sock; }
@Test public void testHttpInvalidConnectResponseChunked() { waitFor(2); server.requestHandler(req -> { req.response().setChunked(true).write("some-chunk"); try { req.netSocket(); fail(); } catch (IllegalStateException e) { complete(); } }); server.listen(onSuccess(s -> { client.request(HttpMethod.CONNECT, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, onSuccess(resp -> { assertEquals(200, resp.statusCode()); complete(); })).end(); })); await(); }
private void testAccessNetSocketPendingResponseData(boolean pause) { server.requestHandler(req -> { NetSocket so = req.netSocket(); so.write("hello"); }); server.listen(onSuccess(s -> { HttpClientRequest req = client.request(HttpMethod.CONNECT, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, onSuccess(resp -> { NetSocket so = resp.netSocket(); assertNotNull(so); so.handler(buff -> { // With HTTP/1.1 the buffer is received immediately but delivered asynchronously assertEquals("hello", buff.toString()); testComplete(); }); if (pause) { so.pause(); vertx.setTimer(100, id -> { so.resume(); }); } })); req.sendHead(); })); await(); }
NetSocket src = req.netSocket();
@Test public void testClientConnectionExceptionHandler() throws Exception { server.requestHandler(req -> { NetSocket so = req.netSocket(); so.write(Buffer.buffer(TestUtils.randomAlphaString(40) + "\r\n")); }); CountDownLatch listenLatch = new CountDownLatch(1); server.listen(onSuccess(s -> listenLatch.countDown())); awaitLatch(listenLatch); HttpClientRequest req = client.post(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/somepath", resp -> { }); req.connectionHandler(conn -> { conn.exceptionHandler(err -> { testComplete(); }); }); req.sendHead(); await(); }
@Test public void testIncorrectHttpVersion() throws Exception { server.requestHandler(req -> { NetSocket so = req.netSocket(); so.write(Buffer.buffer("HTTP/1.2 200 OK\r\nContent-Length:5\r\n\r\nHELLO")); so.close(); }); startServer(); HttpClientRequest req = client.request(HttpMethod.GET, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, resp -> fail("Should not be called")); AtomicBoolean a = new AtomicBoolean(); req.exceptionHandler(err -> { if (a.compareAndSet(false, true)) { assertTrue("message " + err.getMessage() + " should contain HTTP/1.2", err.getMessage().contains("HTTP/1.2")); req.connection().closeHandler(v -> { testComplete(); }); } }).putHeader("connection", "close").end(); await(); }
@Test public void testHttpInvalidConnectResponseChunked() { waitFor(2); server.requestHandler(req -> { req.response().setChunked(true).write("some-chunk"); try { req.netSocket(); fail(); } catch (IllegalStateException e) { complete(); } }); server.listen(onSuccess(s -> { client.request(HttpMethod.CONNECT, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, resp -> { assertEquals(200, resp.statusCode()); complete(); }).end(); })); await(); }
private NetSocket getUpgradedNetSocket(HttpServerRequest req, String path) { assertEquals(path, req.path()); assertEquals("upgrade", req.headers().get("Connection")); NetSocket sock = req.netSocket(); String secHeader = req.headers().get("Sec-WebSocket-Key"); String tmp = secHeader + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; String encoded = sha1(tmp); sock.write("HTTP/1.1 101 Web Socket Protocol Handshake\r\n" + "Upgrade: WebSocket\r\n" + "Connection: upgrade\r\n" + "Sec-WebSocket-Accept: " + encoded + "\r\n" + "\r\n"); return sock; }