From 5ecd512a9056a938e29d9b88d5e61aeb55b60b40 Mon Sep 17 00:00:00 2001 From: Lachlan Roberts Date: Fri, 1 Mar 2019 11:27:59 +1100 Subject: [PATCH 1/3] Issue #3412 - always customize WSChannel directly after creation Signed-off-by: Lachlan Roberts --- .../jetty/websocket/core/client/ClientUpgradeRequest.java | 3 ++- .../websocket/core/server/internal/RFC6455Handshaker.java | 8 +++++--- .../eclipse/jetty/websocket/servlet/WebSocketServlet.java | 6 ++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/client/ClientUpgradeRequest.java b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/client/ClientUpgradeRequest.java index 13a35c5a554..70ad5081a58 100644 --- a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/client/ClientUpgradeRequest.java +++ b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/client/ClientUpgradeRequest.java @@ -338,6 +338,8 @@ public abstract class ClientUpgradeRequest extends HttpRequest implements Respon WebSocketConstants.SPEC_VERSION_STRING); WebSocketChannel wsChannel = newWebSocketChannel(frameHandler, negotiated); + wsClient.customize(wsChannel); + WebSocketConnection wsConnection = newWebSocketConnection(endp, httpClient.getExecutor(), httpClient.getByteBufferPool(), wsChannel); for (Connection.Listener listener : wsClient.getBeans(Connection.Listener.class)) @@ -345,7 +347,6 @@ public abstract class ClientUpgradeRequest extends HttpRequest implements Respon wsChannel.setWebSocketConnection(wsConnection); - wsClient.customize(wsChannel); notifyUpgradeListeners((listener) -> listener.onHandshakeResponse(this, response)); // Now swap out the connection diff --git a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/server/internal/RFC6455Handshaker.java b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/server/internal/RFC6455Handshaker.java index e2c2ff9822e..43437645fa0 100644 --- a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/server/internal/RFC6455Handshaker.java +++ b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/server/internal/RFC6455Handshaker.java @@ -20,6 +20,7 @@ package org.eclipse.jetty.websocket.core.server.internal; import java.io.IOException; import java.util.concurrent.Executor; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -181,6 +182,10 @@ public final class RFC6455Handshaker implements Handshaker // Create the Channel WebSocketChannel channel = newWebSocketChannel(handler, negotiated); + if (defaultCustomizer!=null) + defaultCustomizer.customize(channel); + negotiator.customize(channel); + if (LOG.isDebugEnabled()) LOG.debug("channel {}", channel); @@ -198,9 +203,6 @@ public final class RFC6455Handshaker implements Handshaker connection.addListener(listener); channel.setWebSocketConnection(connection); - if (defaultCustomizer!=null) - defaultCustomizer.customize(channel); - negotiator.customize(channel); // send upgrade response Response baseResponse = baseRequest.getResponse(); diff --git a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServlet.java b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServlet.java index f507b13ede9..99c75487725 100644 --- a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServlet.java +++ b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServlet.java @@ -21,6 +21,7 @@ package org.eclipse.jetty.websocket.servlet; import java.io.IOException; import java.lang.reflect.Constructor; import java.time.Duration; + import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -158,10 +159,7 @@ public abstract class WebSocketServlet extends HttpServlet protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - // Often this servlet is used together with the WebSocketUpgradeFilter, - // so upgrade requests will normally be upgraded by the filter. But we - // can do it here as well if for some reason the filter did not match. - if (mapping.upgrade(req, resp, null)) + if (mapping.upgrade(req, resp, customizer)) return; // If we reach this point, it means we had an incoming request to upgrade From d380012fc92af5c536cfd148037a070b4c945861 Mon Sep 17 00:00:00 2001 From: lachan-roberts Date: Fri, 1 Mar 2019 18:22:18 +1100 Subject: [PATCH 2/3] Issue #3412 - WSChannel delay config of idletimeout on WSConnection Signed-off-by: lachan-roberts --- .../jetty/websocket/core/WebSocketConstants.java | 2 ++ .../websocket/core/internal/WebSocketChannel.java | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/WebSocketConstants.java b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/WebSocketConstants.java index 543fc1d6d3c..a1dc0ab8910 100644 --- a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/WebSocketConstants.java +++ b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/WebSocketConstants.java @@ -19,6 +19,7 @@ package org.eclipse.jetty.websocket.core; import java.nio.charset.StandardCharsets; +import java.time.Duration; public final class WebSocketConstants { @@ -32,6 +33,7 @@ public final class WebSocketConstants public static final int DEFAULT_INPUT_BUFFER_SIZE = 4 * 1024; public static final int DEFAULT_OUTPUT_BUFFER_SIZE = 4 * 1024; public static final boolean DEFAULT_AUTO_FRAGMENT = true; + public static final Duration DEFAULT_IDLE_TIMEOUT = Duration.ZERO; /** * Globally Unique Identifier for use in WebSocket handshake within {@code Sec-WebSocket-Accept} and Sec-WebSocket-Key http headers. diff --git a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketChannel.java b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketChannel.java index 2002d82dcae..617c8554868 100644 --- a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketChannel.java +++ b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketChannel.java @@ -77,6 +77,7 @@ public class WebSocketChannel implements IncomingFrames, FrameHandler.CoreSessio private int outputBufferSize = WebSocketConstants.DEFAULT_OUTPUT_BUFFER_SIZE; private long maxBinaryMessageSize = WebSocketConstants.DEFAULT_MAX_BINARY_MESSAGE_SIZE; private long maxTextMessageSize = WebSocketConstants.DEFAULT_MAX_TEXT_MESSAGE_SIZE; + private Duration idleTimeout = WebSocketConstants.DEFAULT_IDLE_TIMEOUT; public WebSocketChannel(FrameHandler handler, Behavior behavior, @@ -222,13 +223,19 @@ public class WebSocketChannel implements IncomingFrames, FrameHandler.CoreSessio @Override public Duration getIdleTimeout() { - return Duration.ofMillis(getConnection().getEndPoint().getIdleTimeout()); + if (getConnection() == null) + return idleTimeout; + else + return Duration.ofMillis(getConnection().getEndPoint().getIdleTimeout()); } @Override public void setIdleTimeout(Duration timeout) { - getConnection().getEndPoint().setIdleTimeout(timeout == null?0:timeout.toMillis()); + if (getConnection() == null) + idleTimeout = timeout; + else + getConnection().getEndPoint().setIdleTimeout(timeout.toMillis()); } public SocketAddress getLocalAddress() @@ -255,6 +262,7 @@ public class WebSocketChannel implements IncomingFrames, FrameHandler.CoreSessio public void setWebSocketConnection(WebSocketConnection connection) { this.connection = connection; + getConnection().getEndPoint().setIdleTimeout(idleTimeout.toMillis()); } /** From 69822efb45834043277b4c8121b4097674299568 Mon Sep 17 00:00:00 2001 From: Lachlan Roberts Date: Tue, 5 Mar 2019 10:52:25 +1100 Subject: [PATCH 3/3] Issue #3412 - WSChannel only sets idleTimeout on connection if non null Signed-off-by: Lachlan Roberts --- .../eclipse/jetty/websocket/core/WebSocketConstants.java | 2 -- .../jetty/websocket/core/internal/WebSocketChannel.java | 8 ++++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/WebSocketConstants.java b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/WebSocketConstants.java index a1dc0ab8910..543fc1d6d3c 100644 --- a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/WebSocketConstants.java +++ b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/WebSocketConstants.java @@ -19,7 +19,6 @@ package org.eclipse.jetty.websocket.core; import java.nio.charset.StandardCharsets; -import java.time.Duration; public final class WebSocketConstants { @@ -33,7 +32,6 @@ public final class WebSocketConstants public static final int DEFAULT_INPUT_BUFFER_SIZE = 4 * 1024; public static final int DEFAULT_OUTPUT_BUFFER_SIZE = 4 * 1024; public static final boolean DEFAULT_AUTO_FRAGMENT = true; - public static final Duration DEFAULT_IDLE_TIMEOUT = Duration.ZERO; /** * Globally Unique Identifier for use in WebSocket handshake within {@code Sec-WebSocket-Accept} and Sec-WebSocket-Key http headers. diff --git a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketChannel.java b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketChannel.java index 617c8554868..1fb3412c725 100644 --- a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketChannel.java +++ b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketChannel.java @@ -77,7 +77,7 @@ public class WebSocketChannel implements IncomingFrames, FrameHandler.CoreSessio private int outputBufferSize = WebSocketConstants.DEFAULT_OUTPUT_BUFFER_SIZE; private long maxBinaryMessageSize = WebSocketConstants.DEFAULT_MAX_BINARY_MESSAGE_SIZE; private long maxTextMessageSize = WebSocketConstants.DEFAULT_MAX_TEXT_MESSAGE_SIZE; - private Duration idleTimeout = WebSocketConstants.DEFAULT_IDLE_TIMEOUT; + private Duration idleTimeout; public WebSocketChannel(FrameHandler handler, Behavior behavior, @@ -262,7 +262,11 @@ public class WebSocketChannel implements IncomingFrames, FrameHandler.CoreSessio public void setWebSocketConnection(WebSocketConnection connection) { this.connection = connection; - getConnection().getEndPoint().setIdleTimeout(idleTimeout.toMillis()); + if (idleTimeout != null) + { + getConnection().getEndPoint().setIdleTimeout(idleTimeout.toMillis()); + idleTimeout = null; + } } /**