From f8a7d3489276bb6b69b6df5beb9d9cd3ed3324f3 Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Tue, 9 Jul 2019 23:28:36 +0200 Subject: [PATCH] Issue #3537 - Bootstrapping WebSockets with HTTP/2. Third draft pass the implementation. Full build passing. Signed-off-by: Simone Bordet --- .../client/http/HttpChannelOverHTTP.java | 2 +- .../client/http/HttpConnectionOverHTTP.java | 2 +- .../client/http/HttpConnectionOverHTTP2.java | 2 +- .../client/http/HttpReceiverOverHTTP2.java | 6 +++-- .../websocket/javax/tests/LocalFuzzer.java | 3 ++- .../websocket/javax/tests/UpgradeUtils.java | 26 ------------------- .../server/AnnotatedServerEndpointTest.java | 8 +++--- .../test/resources/jetty-logging.properties | 2 +- .../test/resources/jetty-logging.properties | 2 +- 9 files changed, 15 insertions(+), 38 deletions(-) diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java index 5a74967b53a6..0a736b13b79c 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java @@ -106,7 +106,7 @@ public Result exchangeTerminating(HttpExchange exchange, Result result) return new Result(result, new HttpResponseException("101 response without 'Connection: Upgrade'", response)); HttpRequest request = exchange.getRequest(); - HttpUpgrader upgrader = (HttpUpgrader)request.getAttributes().get(HttpUpgrader.class.getName()); + HttpUpgrader upgrader = (HttpUpgrader)request.getConversation().getAttribute(HttpUpgrader.class.getName()); if (upgrader == null) return new Result(result, new HttpResponseException("101 response without " + HttpUpgrader.class.getSimpleName(), response)); diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java index 5863d58d1054..b70e0a2a1bc5 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java @@ -274,7 +274,7 @@ protected void normalizeRequest(Request request) if (request instanceof HttpUpgrader.Factory) { HttpUpgrader upgrader = ((HttpUpgrader.Factory)request).newHttpUpgrader(HttpVersion.HTTP_1_1); - request.attribute(HttpUpgrader.class.getName(), upgrader); + ((HttpRequest)request).getConversation().setAttribute(HttpUpgrader.class.getName(), upgrader); upgrader.prepare((HttpRequest)request); } } diff --git a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpConnectionOverHTTP2.java b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpConnectionOverHTTP2.java index c211d9b020ce..20223e2aea7c 100644 --- a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpConnectionOverHTTP2.java +++ b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpConnectionOverHTTP2.java @@ -97,7 +97,7 @@ protected void normalizeRequest(Request request) if (request instanceof HttpUpgrader.Factory) { HttpUpgrader upgrader = ((HttpUpgrader.Factory)request).newHttpUpgrader(HttpVersion.HTTP_2); - request.attribute(HttpUpgrader.class.getName(), upgrader); + ((HttpRequest)request).getConversation().setAttribute(HttpUpgrader.class.getName(), upgrader); upgrader.prepare((HttpRequest)request); } } diff --git a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpReceiverOverHTTP2.java b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpReceiverOverHTTP2.java index 1d9010aaa64f..3e5bb574347c 100644 --- a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpReceiverOverHTTP2.java +++ b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpReceiverOverHTTP2.java @@ -27,6 +27,7 @@ import java.util.function.BiFunction; import org.eclipse.jetty.client.HttpChannel; +import org.eclipse.jetty.client.HttpConversation; import org.eclipse.jetty.client.HttpExchange; import org.eclipse.jetty.client.HttpReceiver; import org.eclipse.jetty.client.HttpRequest; @@ -109,8 +110,9 @@ void onHeaders(Stream stream, HeadersFrame frame) if (LOG.isDebugEnabled()) LOG.debug("Successful HTTP2 tunnel on {} via {}", stream, endPoint); ((IStream)stream).setAttachment(endPoint); - httpRequest.getConversation().setAttribute(EndPoint.class.getName(), endPoint); - HttpUpgrader upgrader = (HttpUpgrader)httpRequest.getAttributes().get(HttpUpgrader.class.getName()); + HttpConversation conversation = httpRequest.getConversation(); + conversation.setAttribute(EndPoint.class.getName(), endPoint); + HttpUpgrader upgrader = (HttpUpgrader)conversation.getAttribute(HttpUpgrader.class.getName()); if (upgrader != null) upgrader.upgrade(httpResponse, endPoint); } diff --git a/jetty-websocket/javax-websocket-tests/src/main/java/org/eclipse/jetty/websocket/javax/tests/LocalFuzzer.java b/jetty-websocket/javax-websocket-tests/src/main/java/org/eclipse/jetty/websocket/javax/tests/LocalFuzzer.java index c9c76778bf73..ede01bab693b 100644 --- a/jetty-websocket/javax-websocket-tests/src/main/java/org/eclipse/jetty/websocket/javax/tests/LocalFuzzer.java +++ b/jetty-websocket/javax-websocket-tests/src/main/java/org/eclipse/jetty/websocket/javax/tests/LocalFuzzer.java @@ -20,6 +20,7 @@ import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.BlockingQueue; @@ -53,7 +54,7 @@ public LocalFuzzer(Provider provider) throws Exception public LocalFuzzer(Provider provider, CharSequence requestPath) throws Exception { - this(provider, requestPath, UpgradeUtils.newDefaultUpgradeRequestHeaders()); + this(provider, requestPath, new HashMap<>()); } public LocalFuzzer(Provider provider, CharSequence requestPath, Map headers) throws Exception diff --git a/jetty-websocket/javax-websocket-tests/src/main/java/org/eclipse/jetty/websocket/javax/tests/UpgradeUtils.java b/jetty-websocket/javax-websocket-tests/src/main/java/org/eclipse/jetty/websocket/javax/tests/UpgradeUtils.java index 9e3995ed2b06..4bf8ef414ae6 100644 --- a/jetty-websocket/javax-websocket-tests/src/main/java/org/eclipse/jetty/websocket/javax/tests/UpgradeUtils.java +++ b/jetty-websocket/javax-websocket-tests/src/main/java/org/eclipse/jetty/websocket/javax/tests/UpgradeUtils.java @@ -19,9 +19,6 @@ package org.eclipse.jetty.websocket.javax.tests; import java.util.Map; -import java.util.TreeMap; - -import org.eclipse.jetty.http.HttpHeader; public class UpgradeUtils { @@ -36,27 +33,4 @@ public static String generateUpgradeRequest(CharSequence requestPath, Map newDefaultUpgradeRequestHeaders() - { - Map headers = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - headers.put("Host", "local"); - headers.put("Connection", "Upgrade"); - headers.put("Upgrade", "WebSocket"); - headers.put(HttpHeader.SEC_WEBSOCKET_KEY.asString(), "dGhlIHNhbXBsZSBub25jZQ=="); - headers.put(HttpHeader.ORIGIN.asString(), "ws://local/"); - // headers.put(WSConstants.SEC_WEBSOCKET_PROTOCOL, "echo"); - headers.put(HttpHeader.SEC_WEBSOCKET_VERSION.asString(), "13"); - return headers; - } } diff --git a/jetty-websocket/javax-websocket-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/AnnotatedServerEndpointTest.java b/jetty-websocket/javax-websocket-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/AnnotatedServerEndpointTest.java index 954c53e7f439..9470dbdaa9bf 100644 --- a/jetty-websocket/javax-websocket-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/AnnotatedServerEndpointTest.java +++ b/jetty-websocket/javax-websocket-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/AnnotatedServerEndpointTest.java @@ -20,6 +20,7 @@ import java.nio.file.Path; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,7 +31,6 @@ import org.eclipse.jetty.websocket.core.Frame; import org.eclipse.jetty.websocket.core.OpCode; import org.eclipse.jetty.websocket.javax.tests.Fuzzer; -import org.eclipse.jetty.websocket.javax.tests.UpgradeUtils; import org.eclipse.jetty.websocket.javax.tests.WSServer; import org.eclipse.jetty.websocket.javax.tests.coders.DateDecoder; import org.eclipse.jetty.websocket.javax.tests.coders.TimeEncoder; @@ -72,8 +72,8 @@ public static void stopServer() throws Exception private void assertResponse(String message, String expectedText) throws Exception { - Map upgradeRequest = UpgradeUtils.newDefaultUpgradeRequestHeaders(); - upgradeRequest.put(HttpHeader.SEC_WEBSOCKET_SUBPROTOCOL.asString(), "echo"); + Map headers = new HashMap<>(); + headers.put(HttpHeader.SEC_WEBSOCKET_SUBPROTOCOL.asString(), "echo"); List send = new ArrayList<>(); send.add(new Frame(OpCode.TEXT).setPayload(message)); @@ -83,7 +83,7 @@ private void assertResponse(String message, String expectedText) throws Exceptio expect.add(new Frame(OpCode.TEXT).setPayload(expectedText)); expect.add(CloseStatus.toFrame(CloseStatus.NORMAL)); - try (Fuzzer session = server.newNetworkFuzzer("/app/echo", upgradeRequest)) + try (Fuzzer session = server.newNetworkFuzzer("/app/echo", headers)) { session.sendFrames(send); session.expect(expect); diff --git a/jetty-websocket/javax-websocket-tests/src/test/resources/jetty-logging.properties b/jetty-websocket/javax-websocket-tests/src/test/resources/jetty-logging.properties index d078063b6593..3d2cd907dc66 100644 --- a/jetty-websocket/javax-websocket-tests/src/test/resources/jetty-logging.properties +++ b/jetty-websocket/javax-websocket-tests/src/test/resources/jetty-logging.properties @@ -19,7 +19,7 @@ # # org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.Slf4jLog org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog -org.eclipse.jetty.LEVEL=WARN +org.eclipse.jetty.LEVEL=INFO # org.eclipse.jetty.util.log.stderr.LONG=true # org.eclipse.jetty.server.AbstractConnector.LEVEL=DEBUG # org.eclipse.jetty.io.WriteFlusher.LEVEL=DEBUG diff --git a/jetty-websocket/jetty-websocket-tests/src/test/resources/jetty-logging.properties b/jetty-websocket/jetty-websocket-tests/src/test/resources/jetty-logging.properties index c6646730ae7f..a66c4e8770fa 100644 --- a/jetty-websocket/jetty-websocket-tests/src/test/resources/jetty-logging.properties +++ b/jetty-websocket/jetty-websocket-tests/src/test/resources/jetty-logging.properties @@ -1,5 +1,5 @@ org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog -org.eclipse.jetty.LEVEL=DEBUG +org.eclipse.jetty.LEVEL=INFO # org.eclipse.jetty.websocket.tests.LEVEL=DEBUG # org.eclipse.jetty.util.log.stderr.LONG=true # org.eclipse.jetty.server.AbstractConnector.LEVEL=DEBUG