diff --git a/src/test/java/io/vertx/tests/TestBase.java b/src/test/java/io/vertx/tests/TestBase.java index 59950c4..b693f18 100644 --- a/src/test/java/io/vertx/tests/TestBase.java +++ b/src/test/java/io/vertx/tests/TestBase.java @@ -34,6 +34,7 @@ import java.io.Closeable; import java.util.concurrent.*; import java.util.function.Consumer; +import java.util.function.UnaryOperator; /** * @author Julien Viet @@ -72,6 +73,10 @@ protected Closeable startProxy(SocketAddress backend) { } protected Closeable startProxy(Consumer config) { + return startProxy(UnaryOperator.identity(), config); + } + + protected Closeable startProxy(UnaryOperator proxyOptionsConfig, Consumer config) { CompletableFuture res = new CompletableFuture<>(); vertx.deployVerticle(new AbstractVerticle() { HttpClient proxyClient; @@ -80,7 +85,7 @@ protected Closeable startProxy(Consumer config) { @Override public void start(Promise startFuture) { proxyClient = vertx.createHttpClient(new HttpClientOptions(clientOptions)); - proxyServer = vertx.createHttpServer(new HttpServerOptions(serverOptions)); + proxyServer = vertx.createHttpServer(proxyOptionsConfig.apply(new HttpServerOptions(serverOptions))); proxy = HttpProxy.reverseProxy(proxyOptions, proxyClient); config.accept(proxy); proxyServer.requestHandler(proxy); diff --git a/src/test/java/io/vertx/tests/WebSocketTest.java b/src/test/java/io/vertx/tests/WebSocketTest.java index 0413a83..6471468 100644 --- a/src/test/java/io/vertx/tests/WebSocketTest.java +++ b/src/test/java/io/vertx/tests/WebSocketTest.java @@ -191,4 +191,42 @@ public Future handleProxyRequest(ProxyContext context) { }); })); } + + @Test + public void testWebSocketExtensionsNegotiatedBetweenClientAndBackend(TestContext ctx) { + Async async = ctx.async(); + HttpServerOptions backendOptions = new HttpServerOptions().setPort(8081).setHost("localhost") + .setPerFrameWebSocketCompressionSupported(false) // Disable extension in the backend + .setPerMessageWebSocketCompressionSupported(false); // Disable extension in the backend + SocketAddress backend = startHttpBackend(ctx, backendOptions, req -> { + ctx.assertTrue(req.headers().contains("sec-websocket-extensions")); + Future fut = req.toWebSocket(); + fut.onComplete(ctx.asyncAssertSuccess(ws -> { + ws.handler(buff -> ws.writeTextMessage(buff.toString())); + ws.closeHandler(v -> { + async.complete(); + }); + })); + }); + startProxy(proxyServerOptions -> { + return proxyServerOptions + .setPerFrameWebSocketCompressionSupported(true) // Enable extension in the proxy + .setPerMessageWebSocketCompressionSupported(true); // Enable extension in the proxy + }, httpProxy -> httpProxy.origin(backend)); + wsClient = vertx.createWebSocketClient(new WebSocketClientOptions() + .setTryUsePerFrameCompression(true) // Enable extension in the client + .setTryUsePerMessageCompression(true)); // Enable extension in the client + WebSocketConnectOptions options = new WebSocketConnectOptions() + .setPort(8080) + .setHost("localhost") + .setURI("/ws"); + wsClient.connect(options).onComplete(ctx.asyncAssertSuccess(ws -> { + ctx.assertFalse(ws.headers().contains("sec-websocket-extensions"), "Expected extensions to be declined"); + ws.textMessageHandler(msg -> { + ctx.assertEquals("hello", msg); + ws.close(); + }); + ws.writeTextMessage("hello"); + })); + } }