You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by re...@apache.org on 2022/01/28 18:07:13 UTC

[wicket] 01/01: [WICKET-6950] allow configuring web-sockets sessions when connection is opened

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 <re...@gmail.com>
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
 		{