Author: violetagg Date: Thu Sep 18 02:14:10 2014 New Revision: 1625878 URL: http://svn.apache.org/r1625878 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56982 Merged revision(s) 1624984 from tomcat/trunk: Return the actual negotiated extensions rather than an empty list for Session.getNegotiatedExtensions()
Modified: tomcat/tc7.0.x/trunk/ (props changed) tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsSession.java tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/UpgradeUtil.java tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Propchange: tomcat/tc7.0.x/trunk/ ------------------------------------------------------------------------------ Merged /tomcat/trunk:r1624984 Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsSession.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsSession.java?rev=1625878&r1=1625877&r2=1625878&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsSession.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsSession.java Thu Sep 18 02:14:10 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; @@ -106,6 +107,7 @@ public class WsSession implements Sessio * * @param localEndpoint * @param wsRemoteEndpoint + * @param negotiatedExtensions * @throws DeploymentException */ public WsSession(Endpoint localEndpoint, @@ -113,7 +115,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; @@ -139,6 +141,7 @@ public class WsSession implements Sessio this.queryString = queryString; this.userPrincipal = userPrincipal; this.httpSessionId = httpSessionId; + this.negotiatedExtensions = negotiatedExtensions; if (subProtocol == null) { this.subProtocol = ""; } else { @@ -303,7 +306,7 @@ public class WsSession implements Sessio @Override public List<Extension> getNegotiatedExtensions() { checkState(); - return Collections.emptyList(); + return negotiatedExtensions; } Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java?rev=1625878&r1=1625877&r2=1625878&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java Thu Sep 18 02:14:10 2014 @@ -348,8 +348,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/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/UpgradeUtil.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/UpgradeUtil.java?rev=1625878&r1=1625877&r2=1625878&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/UpgradeUtil.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/UpgradeUtil.java Thu Sep 18 02:14:10 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; @@ -124,11 +125,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<Extension>(transformations.size()); + for (Transformation t : transformations) { + negotiatedExtensionsPhase2.add(t.getExtensionResponse()); + } + } // Build the transformation pipeline Transformation transformation = null; @@ -208,7 +225,8 @@ public class UpgradeUtil { WsHttpUpgradeHandler wsHandler = ((RequestFacade) inner).upgrade(WsHttpUpgradeHandler.class); wsHandler.preInit(ep, perSessionServerEndpointConfig, sc, wsRequest, - subProtocol, transformation, pathParams, req.isSecure()); + negotiatedExtensionsPhase2, subProtocol, transformation, pathParams, + req.isSecure()); } else { throw new ServletException("Upgrade failed"); } Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java?rev=1625878&r1=1625877&r2=1625878&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java Thu Sep 18 02:14:10 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.http.HttpSession; @@ -26,6 +27,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.coyote.http11.upgrade.AbstractServletInputStream; import org.apache.coyote.http11.upgrade.AbstractServletOutputStream; @@ -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/tc7.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1625878&r1=1625877&r2=1625878&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Thu Sep 18 02:14:10 2014 @@ -255,6 +255,10 @@ Extend support for the <code>permessage-deflate</code> extension to compression of outgoing messages on the server side. (markt) </add> + <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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org