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/02/05 15:46:59 UTC

[wicket] 02/02: [WICKET-6954] initial work

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

reiern70 pushed a commit to branch improvement/reiern70/WICKET-6954-ping-pong-keep-alive
in repository https://gitbox.apache.org/repos/asf/wicket.git

commit d705894bd2b3956e3abf6786076fd4de1ee8f5a3
Author: reiern70 <re...@gmail.com>
AuthorDate: Sat Feb 5 10:46:39 2022 -0500

    [WICKET-6954] initial work
---
 .../wicket/protocol/ws/WebSocketSettings.java      | 18 ++++++-
 .../ws/api/AbstractWebSocketProcessor.java         | 19 ++++++--
 .../protocol/ws/api/IWebSocketProcessor.java       |  5 ++
 .../ws/api/message/PongMessageMessage.java         | 55 ++++++++++++++++++++++
 .../protocol/ws/javax/JavaxWebSocketProcessor.java |  1 -
 5 files changed, 92 insertions(+), 6 deletions(-)

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 dd59f49..27237a0 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
@@ -94,6 +94,7 @@ public class WebSocketSettings
 	private final AtomicInteger port = new AtomicInteger();
 	private final AtomicInteger securePort = new AtomicInteger();
 
+
 	/**
 	 * Holds this WebSocketSettings in the Application's metadata.
 	 * This way wicket-core module doesn't have reference to wicket-native-websocket.
@@ -177,7 +178,12 @@ public class WebSocketSettings
 	 */
 	private Executor heartBeatsExecutor = new HeartBeatsExecutor();
 
-	// internal heartbeats timer.
+	/**
+	 * Whether messages are broadcast when receiving pong messages
+	 */
+	private boolean sendMessagesOnPong = false;
+
+	// internal heartbeat's timer.
 	private Timer heartBeatsTimer;
 
 	/**
@@ -589,6 +595,16 @@ public class WebSocketSettings
 		}
 	}
 
+	public void setSendMessagesOnPong(boolean sendMessagesOnPong)
+	{
+		this.sendMessagesOnPong = sendMessagesOnPong;
+	}
+
+	public boolean isSendMessagesOnPong()
+	{
+		return sendMessagesOnPong;
+	}
+
 	private void sendHeartBeats(String application)
 	{
 		sendHeartBeats(Application.get(application));
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
index 0290544..d5aef01 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
@@ -47,6 +47,7 @@ import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
 import org.apache.wicket.protocol.ws.api.message.ErrorMessage;
 import org.apache.wicket.protocol.ws.api.message.IWebSocketMessage;
 import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage;
+import org.apache.wicket.protocol.ws.api.message.PongMessageMessage;
 import org.apache.wicket.protocol.ws.api.message.TextMessage;
 import org.apache.wicket.protocol.ws.api.registry.IKey;
 import org.apache.wicket.protocol.ws.api.registry.IWebSocketConnectionRegistry;
@@ -149,12 +150,22 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
 		this.connectionFilter = webSocketSettings.getConnectionFilter();
 	}
 
-
 	@Override
-	public void onPong(ByteBuffer byteBuffer) {
+	public void onPong(ByteBuffer byteBuffer)
+	{
 		IKey key = getRegistryKey();
-		IWebSocketConnection webSocketConnection = connectionRegistry.getConnection(getApplication(), getSessionId(), key);
-		webSocketConnection.onPong(byteBuffer);
+		WebApplication application = getApplication();
+		String sessionId = getSessionId();
+		IWebSocketConnection webSocketConnection = connectionRegistry.getConnection(application, sessionId, key);
+		if (webSocketConnection != null)
+		{
+			webSocketConnection.onPong(byteBuffer);
+			if (webSocketSettings.isSendMessagesOnPong())
+			{
+				// if we want to deliver messages on pong deliver them
+				broadcastMessage(new PongMessageMessage(application, sessionId, key, byteBuffer));
+			}
+		}
 	}
 
 	@Override
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 5aa9391..708002f 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
@@ -44,6 +44,11 @@ public interface IWebSocketProcessor
 		WebSocketSettings.Holder.get(application).getSocketSessionConfigurer().configureSession(webSocketSession);
 	}
 
+	/**
+	 * Called when remote peer answers to ping with pong message.
+	 *
+	 * @param byteBuffer Contains application specific content
+	 */
 	void onPong(ByteBuffer byteBuffer);
 
 	/**
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/PongMessageMessage.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/PongMessageMessage.java
new file mode 100644
index 0000000..0708f82
--- /dev/null
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/PongMessageMessage.java
@@ -0,0 +1,55 @@
+/*
+ * 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.message;
+
+import java.nio.ByteBuffer;
+
+import org.apache.wicket.Application;
+import org.apache.wicket.protocol.ws.api.registry.IKey;
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * A {@link IWebSocketMessage message} with Pong message data
+ *
+ * @since 6.0
+ */
+public class PongMessageMessage extends AbstractClientMessage
+{
+	private final ByteBuffer byteBuffer;
+
+	/**
+	 *
+	 * @param application
+	 *      the Wicket application
+	 * @param sessionId
+	 *      the id of the http session
+	 * @param key
+	 *      the page id or resource name
+	 * @param byteBuffer
+	 *      the message sent from the client
+	 */
+	public PongMessageMessage(Application application, String sessionId, IKey key, ByteBuffer byteBuffer)
+	{
+		super(application, sessionId, key);
+		this.byteBuffer = Args.notNull(byteBuffer, "byteBuffer");
+	}
+
+	public ByteBuffer getByteBuffer()
+	{
+		return byteBuffer;
+	}
+}
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 cd3adf8..85f78ea 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
@@ -70,7 +70,6 @@ public class JavaxWebSocketProcessor extends AbstractWebSocketProcessor
 		@Override
 		public void onMessage(PongMessage message)
 		{
-			IKey key = getRegistryKey();
 			JavaxWebSocketProcessor.this.onPong(message.getApplicationData());
 		}
 	}