You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2014/09/15 11:51:53 UTC
svn commit: r1624984 - in /tomcat/trunk: java/org/apache/tomcat/websocket/
java/org/apache/tomcat/websocket/server/ webapps/docs/
Author: markt
Date: Mon Sep 15 09:51:52 2014
New Revision: 1624984
URL: http://svn.apache.org/r1624984
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56982
Return the actual negotiated extensions rather than an empty list for Session.getNegotiatedExtensions()
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java
tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
tomcat/trunk/java/org/apache/tomcat/websocket/server/UpgradeUtil.java
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java
tomcat/trunk/webapps/docs/changelog.xml
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java?rev=1624984&r1=1624983&r2=1624984&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java Mon Sep 15 09:51:52 2014
@@ -75,6 +75,7 @@ public class WsSession implements Sessio
private final Principal userPrincipal;
private final EndpointConfig endpointConfig;
+ private final List<Extension> negotiatedExtensions;
private final String subProtocol;
private final Map<String,String> pathParameters;
private final boolean secure;
@@ -105,6 +106,7 @@ public class WsSession implements Sessio
*
* @param localEndpoint
* @param wsRemoteEndpoint
+ * @param negotiatedExtensions
* @throws DeploymentException
*/
public WsSession(Endpoint localEndpoint,
@@ -112,7 +114,7 @@ public class WsSession implements Sessio
WsWebSocketContainer wsWebSocketContainer,
URI requestUri, Map<String,List<String>> requestParameterMap,
String queryString, Principal userPrincipal, String httpSessionId,
- String subProtocol, Map<String,String> pathParameters,
+ List<Extension> negotiatedExtensions, String subProtocol, Map<String,String> pathParameters,
boolean secure, EndpointConfig endpointConfig) throws DeploymentException {
this.localEndpoint = localEndpoint;
this.wsRemoteEndpoint = wsRemoteEndpoint;
@@ -138,6 +140,7 @@ public class WsSession implements Sessio
this.queryString = queryString;
this.userPrincipal = userPrincipal;
this.httpSessionId = httpSessionId;
+ this.negotiatedExtensions = negotiatedExtensions;
if (subProtocol == null) {
this.subProtocol = "";
} else {
@@ -302,7 +305,7 @@ public class WsSession implements Sessio
@Override
public List<Extension> getNegotiatedExtensions() {
checkState();
- return Collections.emptyList();
+ return negotiatedExtensions;
}
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java?rev=1624984&r1=1624983&r2=1624984&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java Mon Sep 15 09:51:52 2014
@@ -326,8 +326,8 @@ public class WsWebSocketContainer
WsRemoteEndpointImplClient wsRemoteEndpointClient = new WsRemoteEndpointImplClient(channel);
WsSession wsSession = new WsSession(endpoint, wsRemoteEndpointClient,
- this, null, null, null, null, null, subProtocol,
- Collections.<String,String>emptyMap(), secure,
+ this, null, null, null, null, null, Collections.<Extension>emptyList(),
+ subProtocol, Collections.<String,String>emptyMap(), secure,
clientEndpointConfiguration);
WsFrameClient wsFrameClient = new WsFrameClient(response, channel,
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/UpgradeUtil.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/UpgradeUtil.java?rev=1624984&r1=1624983&r2=1624984&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/server/UpgradeUtil.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/server/UpgradeUtil.java Mon Sep 15 09:51:52 2014
@@ -19,6 +19,7 @@ package org.apache.tomcat.websocket.serv
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.List;
@@ -122,11 +123,27 @@ public class UpgradeUtil {
while (extHeaders.hasMoreElements()) {
Util.parseExtensionHeader(extensionsRequested, extHeaders.nextElement());
}
- List<Extension> negotiatedExtensions = sec.getConfigurator().getNegotiatedExtensions(
+ // Negotiation phase 1. By default this simply filters out the
+ // extensions that the server does not support but applications could
+ // use a custom configurator to do more than this.
+ List<Extension> negotiatedExtensionsPhase1 = sec.getConfigurator().getNegotiatedExtensions(
Constants.INSTALLED_EXTENSIONS, extensionsRequested);
- // Create the Transformations that will be applied to this connection
- List<Transformation> transformations = createTransformations(negotiatedExtensions);
+ // Negotiation phase 2. Create the Transformations that will be applied
+ // to this connection. Note than an extension may be dropped at this
+ // point if the client has requested a configuration that the server is
+ // unable to support.
+ List<Transformation> transformations = createTransformations(negotiatedExtensionsPhase1);
+
+ List<Extension> negotiatedExtensionsPhase2;
+ if (transformations.isEmpty()) {
+ negotiatedExtensionsPhase2 = Collections.emptyList();
+ } else {
+ negotiatedExtensionsPhase2 = new ArrayList<>(transformations.size());
+ for (Transformation t : transformations) {
+ negotiatedExtensionsPhase2.add(t.getExtensionResponse());
+ }
+ }
// Build the transformation pipeline
Transformation transformation = null;
@@ -199,7 +216,8 @@ public class UpgradeUtil {
WsHttpUpgradeHandler wsHandler =
req.upgrade(WsHttpUpgradeHandler.class);
wsHandler.preInit(ep, perSessionServerEndpointConfig, sc, wsRequest,
- subProtocol, transformation, pathParams, req.isSecure());
+ negotiatedExtensionsPhase2, subProtocol, transformation, pathParams,
+ req.isSecure());
}
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java?rev=1624984&r1=1624983&r2=1624984&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java Mon Sep 15 09:51:52 2014
@@ -18,6 +18,7 @@ package org.apache.tomcat.websocket.serv
import java.io.EOFException;
import java.io.IOException;
+import java.util.List;
import java.util.Map;
import javax.servlet.ReadListener;
@@ -32,6 +33,7 @@ import javax.websocket.CloseReason.Close
import javax.websocket.DeploymentException;
import javax.websocket.Endpoint;
import javax.websocket.EndpointConfig;
+import javax.websocket.Extension;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
@@ -56,6 +58,7 @@ public class WsHttpUpgradeHandler implem
private EndpointConfig endpointConfig;
private WsServerContainer webSocketContainer;
private WsHandshakeRequest handshakeRequest;
+ private List<Extension> negotiatedExtensions;
private String subProtocol;
private Transformation transformation;
private Map<String,String> pathParameters;
@@ -72,12 +75,14 @@ public class WsHttpUpgradeHandler implem
public void preInit(Endpoint ep, EndpointConfig endpointConfig,
WsServerContainer wsc, WsHandshakeRequest handshakeRequest,
- String subProtocol, Transformation transformation,
- Map<String,String> pathParameters, boolean secure) {
+ List<Extension> negotiatedExtensionsPhase2, String subProtocol,
+ Transformation transformation, Map<String,String> pathParameters,
+ boolean secure) {
this.ep = ep;
this.endpointConfig = endpointConfig;
this.webSocketContainer = wsc;
this.handshakeRequest = handshakeRequest;
+ this.negotiatedExtensions = negotiatedExtensionsPhase2;
this.subProtocol = subProtocol;
this.transformation = transformation;
this.pathParameters = pathParameters;
@@ -123,7 +128,8 @@ public class WsHttpUpgradeHandler implem
handshakeRequest.getParameterMap(),
handshakeRequest.getQueryString(),
handshakeRequest.getUserPrincipal(), httpSessionId,
- subProtocol, pathParameters, secure, endpointConfig);
+ negotiatedExtensions, subProtocol, pathParameters, secure,
+ endpointConfig);
WsFrameServer wsFrame = new WsFrameServer(sis, wsSession, transformation);
sos.setWriteListener(new WsWriteListener(this, wsRemoteEndpointServer));
// WsFrame adds the necessary final transformations. Copy the
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1624984&r1=1624983&r2=1624984&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Mon Sep 15 09:51:52 2014
@@ -189,6 +189,10 @@
<bug>56907</bug>: Ensure that client IO threads are stopped if a secure
WebSocket client connection fails. (markt)
</fix>
+ <fix>
+ <bug>56982</bug>: Return the actual negotiated extensions rather than an
+ empty list for <code>Session.getNegotiatedExtensions()</code>. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Web applications">
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org