This is an automated email from the ASF dual-hosted git repository. reiern70 pushed a commit to branch improvement/reiern70/WICKET-6950 in repository https://gitbox.apache.org/repos/asf/wicket.git
commit d0ba4a77fbb3a09f3476b08ede2da77a8dca026c Author: reiern70 <[email protected]> AuthorDate: Fri Nov 12 23:50:01 2021 -0500 [WICKET-6950] allow configuring web-sockets sessions when connection is opened --- .../examples/websocket/JSR356Application.java | 19 +++- .../wicket/protocol/ws/WebSocketSettings.java | 11 ++ .../protocol/ws/api/IWebSocketProcessor.java | 7 ++ .../wicket/protocol/ws/api/IWebSocketSession.java | 119 +++++++++++++++++++++ .../protocol/ws/javax/JavaxWebSocketProcessor.java | 5 +- .../wicket/protocol/ws/javax/WicketEndpoint.java | 116 ++++++++++++++++++++ 6 files changed, 275 insertions(+), 2 deletions(-) diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/JSR356Application.java b/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/JSR356Application.java index e178f7c..b1f378e 100644 --- a/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/JSR356Application.java +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/JSR356Application.java @@ -23,9 +23,13 @@ import org.apache.wicket.protocol.http.WebApplication; import org.apache.wicket.protocol.https.HttpsConfig; import org.apache.wicket.protocol.https.HttpsMapper; import org.apache.wicket.protocol.ws.WebSocketSettings; +import org.apache.wicket.protocol.ws.api.IWebSocketSession; import org.apache.wicket.request.Request; import org.apache.wicket.request.Response; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.time.Duration; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -35,6 +39,8 @@ import java.util.concurrent.ScheduledExecutorService; */ public class JSR356Application extends WicketExampleApplication { + private static final Logger LOGGER = LoggerFactory.getLogger(JSR356Application.class); + private ScheduledExecutorService scheduledExecutorService; @Override @@ -59,11 +65,22 @@ public class JSR356Application extends WicketExampleApplication getSharedResources().add(ChartWebSocketResource.NAME, new ChartWebSocketResource()); + final WebSocketSettings webSocketSettings = new WebSocketSettings() { + @Override + public void configureSession(IWebSocketSession webSocketSession) { + LOGGER.info("getMaxIdleTimeout = " + webSocketSession.getMaxIdleTimeout()); + // make sessions almost "immortal" + webSocketSession.setMaxIdleTimeout(Duration.ofHours(10).toMillis()); + } + }; + + WebSocketSettings.Holder.set(this, webSocketSettings); + if (System.getenv("OPENSHIFT_APP_NAME") != null) { // OpenShift uses special proxy for WebSocket connections // https://blog.openshift.com/paas-websockets/ - final WebSocketSettings webSocketSettings = WebSocketSettings.Holder.get(this); + webSocketSettings.setPort(8000); webSocketSettings.setSecurePort(8443); } diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java index 6b47820..d920de9 100644 --- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java +++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java @@ -21,6 +21,7 @@ import org.apache.wicket.MetaDataKey; import org.apache.wicket.Page; import org.apache.wicket.protocol.ws.api.IWebSocketConnection; import org.apache.wicket.protocol.ws.api.IWebSocketConnectionFilter; +import org.apache.wicket.protocol.ws.api.IWebSocketSession; import org.apache.wicket.protocol.ws.api.ServletRequestCopy; import org.apache.wicket.protocol.ws.api.WebSocketConnectionFilterCollection; import org.apache.wicket.protocol.ws.api.WebSocketRequest; @@ -246,6 +247,16 @@ public class WebSocketSettings } /** + * Allows to configure {@link org.apache.wicket.protocol.ws.api.IWebSocketSession} + * + * @param webSocketSession The {@link org.apache.wicket.protocol.ws.api.IWebSocketSession} + */ + public void configureSession(IWebSocketSession webSocketSession) + { + // it does nothing by default + } + + /** * Sets the filter for checking the incoming connections * * @param connectionFilter diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketProcessor.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketProcessor.java index 376265e..baeaff5 100644 --- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketProcessor.java +++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketProcessor.java @@ -16,6 +16,9 @@ */ package org.apache.wicket.protocol.ws.api; +import org.apache.wicket.protocol.http.WebApplication; +import org.apache.wicket.protocol.ws.WebSocketSettings; + /** * Processes web socket messages. * @@ -23,6 +26,10 @@ package org.apache.wicket.protocol.ws.api; */ public interface IWebSocketProcessor { + default void onOpen(IWebSocketSession webSocketSession, final WebApplication application) { + WebSocketSettings.Holder.get(application).configureSession(webSocketSession); + } + /** * Called when a text message arrives from the client * diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketSession.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketSession.java new file mode 100644 index 0000000..6d68bfc --- /dev/null +++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketSession.java @@ -0,0 +1,119 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.wicket.protocol.ws.api; + +import java.net.URI; +import java.security.Principal; +import java.util.List; +import java.util.Map; + +/** + * Wicket proxy interface to javax.websocket.Session. + */ +public interface IWebSocketSession +{ + + /** + * See javax.websocket.Session#getProtocolVersion() + */ + String getProtocolVersion(); + + + /** + * See javax.websocket.Session#getNegotiatedSubprotocol() + */ + String getNegotiatedSubprotocol(); + + + /** + * See javax.websocket.Session#isSecure() + */ + boolean isSecure(); + + /** + * See javax.websocket.Session#isOpen() + */ + boolean isOpen(); + + /** + * See javax.websocket.Session#getMaxIdleTimeout() + */ + long getMaxIdleTimeout(); + + /** + * See javax.websocket.Session#setMaxIdleTimeout() + */ + void setMaxIdleTimeout(long milliseconds); + + /** + * See javax.websocket.Session#setMaxBinaryMessageBufferSize() + */ + void setMaxBinaryMessageBufferSize(int length); + + /** + * See javax.websocket.Session#getMaxBinaryMessageBufferSize() + */ + int getMaxBinaryMessageBufferSize(); + + /** + * See javax.websocket.Session#setMaxTextMessageBufferSize() + */ + void setMaxTextMessageBufferSize(int length); + + /** + * See javax.websocket.Session#getMaxTextMessageBufferSize() + */ + int getMaxTextMessageBufferSize(); + + + /** + * See javax.websocket.Session#getId() + */ + String getId(); + + + /** + * See javax.websocket.Session#getRequestURI() + */ + URI getRequestURI(); + + /** + * See javax.websocket.Session#getRequestParameterMap() + */ + Map<String, List<String>> getRequestParameterMap(); + + /** + * See javax.websocket.Session#getQueryString() + */ + String getQueryString(); + + /** + * See javax.websocket.Session#getPathParameters() + */ + Map<String, String> getPathParameters(); + + /** + * See javax.websocket.Session#getUserProperties() + */ + Map<String, Object> getUserProperties(); + + /** + * See javax.websocket.Session#getUserPrincipal() + */ + Principal getUserPrincipal(); +} diff --git a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java index c9d1479..4d2e052 100644 --- a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java +++ b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java @@ -23,7 +23,9 @@ import javax.websocket.MessageHandler; import javax.websocket.Session; import org.apache.wicket.protocol.http.WebApplication; +import org.apache.wicket.protocol.ws.WebSocketSettings; import org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor; +import org.apache.wicket.protocol.ws.api.IWebSocketSession; /** * An {@link org.apache.wicket.protocol.ws.api.IWebSocketProcessor processor} that integrates with @@ -39,7 +41,9 @@ public class JavaxWebSocketProcessor extends AbstractWebSocketProcessor * @param session * the WebSocket session * @param application + * the {@link org.apache.wicket.protocol.http.WebApplication} * @param endpointConfig + * the {@link javax.websocket.EndpointConfig} */ public JavaxWebSocketProcessor(final Session session, final WebApplication application, EndpointConfig endpointConfig) { @@ -51,7 +55,6 @@ public class JavaxWebSocketProcessor extends AbstractWebSocketProcessor session.addMessageHandler(new BinaryMessageHandler()); } - @Override public void onOpen(Object containerConnection) { diff --git a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java index c14cb1f..f177e6b 100644 --- a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java +++ b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java @@ -18,6 +18,8 @@ package org.apache.wicket.protocol.ws.javax; import java.io.EOFException; import java.io.IOException; +import java.net.URI; +import java.security.Principal; import java.util.List; import java.util.Map; import java.util.Set; @@ -33,6 +35,7 @@ import org.apache.wicket.Application; import org.apache.wicket.IApplicationListener; import org.apache.wicket.ThreadContext; import org.apache.wicket.protocol.http.WebApplication; +import org.apache.wicket.protocol.ws.api.IWebSocketSession; import org.apache.wicket.util.lang.Checks; import org.apache.wicket.util.string.Strings; import org.slf4j.Logger; @@ -43,6 +46,118 @@ import org.slf4j.LoggerFactory; */ public class WicketEndpoint extends Endpoint { + private static class JavaxWebSocketSessionWrapper implements IWebSocketSession + { + private final Session session; + + private JavaxWebSocketSessionWrapper(Session session) + { + this.session = session; + } + + @Override + public String getProtocolVersion() + { + return session.getProtocolVersion(); + } + + @Override + public String getNegotiatedSubprotocol() + { + return session.getNegotiatedSubprotocol(); + } + + @Override + public boolean isSecure() + { + return session.isSecure(); + } + + @Override + public boolean isOpen() + { + return session.isOpen(); + } + + @Override + public long getMaxIdleTimeout() + { + return session.getMaxIdleTimeout(); + } + + @Override + public void setMaxIdleTimeout(long milliseconds) + { + session.setMaxIdleTimeout(milliseconds); + } + + @Override + public void setMaxBinaryMessageBufferSize(int length) + { + session.setMaxBinaryMessageBufferSize(length); + } + + @Override + public int getMaxBinaryMessageBufferSize() + { + return session.getMaxBinaryMessageBufferSize(); + } + + @Override + public void setMaxTextMessageBufferSize(int length) + { + session.setMaxTextMessageBufferSize(length); + } + + @Override + public int getMaxTextMessageBufferSize() + { + return session.getMaxTextMessageBufferSize(); + } + + @Override + public String getId() + { + return session.getId(); + } + + @Override + public URI getRequestURI() + { + return session.getRequestURI(); + } + + @Override + public Map<String, List<String>> getRequestParameterMap() + { + return session.getRequestParameterMap(); + } + + @Override + public String getQueryString() + { + return session.getQueryString(); + } + + @Override + public Map<String, String> getPathParameters() + { + return session.getPathParameters(); + } + + @Override + public Map<String, Object> getUserProperties() + { + return session.getUserProperties(); + } + + @Override + public Principal getUserPrincipal() + { + return session.getUserPrincipal(); + } + } + private static final Logger LOG = LoggerFactory.getLogger(WicketEndpoint.class); /** @@ -70,6 +185,7 @@ public class WicketEndpoint extends Endpoint { ThreadContext.setApplication(app); javaxWebSocketProcessor = new JavaxWebSocketProcessor(session, app, endpointConfig); + javaxWebSocketProcessor.onOpen(new JavaxWebSocketSessionWrapper(session), app); } finally {
