This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push:
new 571e164d59 WeSocket client's shouldn't request extensions they can't
support
571e164d59 is described below
commit 571e164d5932635966735a51008ac95ce4d0d1d9
Author: Mark Thomas <[email protected]>
AuthorDate: Fri Jul 25 08:40:04 2025 +0100
WeSocket client's shouldn't request extensions they can't support
Align the WebSocket extension handling for WebSocket client connections
with WebSocket server connections. The WebSocket client now only
includes an extension requested by an endpoint in the opening handshake
if the WebSocket client supports that extension.
---
.../tomcat/websocket/TransformationFactory.java | 17 +++++++++++++++++
.../apache/tomcat/websocket/WsWebSocketContainer.java | 19 ++++++++++++++++---
webapps/docs/changelog.xml | 6 ++++++
3 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/java/org/apache/tomcat/websocket/TransformationFactory.java
b/java/org/apache/tomcat/websocket/TransformationFactory.java
index c94a813e11..b5a4ba3078 100644
--- a/java/org/apache/tomcat/websocket/TransformationFactory.java
+++ b/java/org/apache/tomcat/websocket/TransformationFactory.java
@@ -16,9 +16,12 @@
*/
package org.apache.tomcat.websocket;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import jakarta.websocket.Extension;
@@ -54,4 +57,18 @@ public class TransformationFactory {
public void registerExtension(String name, TransformationBuilder builder) {
builders.put(name, builder);
}
+
+
+ public Set<String> getInstalledExtensionNames() {
+ return new HashSet<>(builders.keySet());
+ }
+
+
+ public Set<Extension> getInstalledExtensions() {
+ Set<Extension> result = new HashSet<>();
+ for (String extensionName : builders.keySet()) {
+ result.add(new WsExtension(extensionName));
+ }
+ return Collections.unmodifiableSet(result);
+ }
}
diff --git a/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
b/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
index faef999e71..840538da00 100644
--- a/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
+++ b/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
@@ -34,6 +34,7 @@ import java.util.Base64;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -666,8 +667,20 @@ public class WsWebSocketContainer implements
WebSocketContainer, BackgroundProce
}
// WebSocket extensions
- if (extensions != null && !extensions.isEmpty()) {
- headers.put(Constants.WS_EXTENSIONS_HEADER_NAME,
generateExtensionHeaders(extensions));
+ if (extensions != null) {
+ // Filter the requested extensions to remove any that are not
supported by the client container.
+ Set<String> installed =
TransformationFactory.getInstance().getInstalledExtensionNames();
+ List<Extension> availableExtensions = new ArrayList<>(extensions);
+ Iterator<Extension> availableExtensionsIter =
availableExtensions.iterator();
+ while (availableExtensionsIter.hasNext()) {
+ Extension e = availableExtensionsIter.next();
+ if (!installed.contains(e.getName())) {
+ availableExtensionsIter.remove();
+ }
+ }
+ if (!availableExtensions.isEmpty()) {
+ headers.put(Constants.WS_EXTENSIONS_HEADER_NAME,
generateExtensionHeaders(availableExtensions));
+ }
}
return headers;
@@ -949,7 +962,7 @@ public class WsWebSocketContainer implements
WebSocketContainer, BackgroundProce
*/
@Override
public Set<Extension> getInstalledExtensions() {
- return Collections.emptySet();
+ return TransformationFactory.getInstance().getInstalledExtensions();
}
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index f649693daf..f61de0ce57 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -267,6 +267,12 @@
port information. (markt)
</add>
<!-- Entries for backport and removal before 12.0.0-M1 below this line
-->
+ <fix>
+ Align the WebSocket extension handling for WebSocket client connections
+ with WebSocket server connections. The WebSocket client now only
+ includes an extension requested by an endpoint in the opening handshake
+ if the WebSocket client supports that extension. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Web applications">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]