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:12 UTC

[wicket] branch improvement/reiern70/WICKET-6950 created (now d0ba4a7)

This is an automated email from the ASF dual-hosted git repository.

reiern70 pushed a change to branch improvement/reiern70/WICKET-6950
in repository https://gitbox.apache.org/repos/asf/wicket.git.


      at d0ba4a7  [WICKET-6950] allow configuring web-sockets sessions when connection is opened

This branch includes the following new commits:

     new d0ba4a7  [WICKET-6950] allow configuring web-sockets sessions when connection is opened

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


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

Posted by re...@apache.org.
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
 		{