Author: remm Date: Fri Nov 28 20:33:20 2014 New Revision: 1642360 URL: http://svn.apache.org/r1642360 Log: - Use the extensions specified by the configuration (and ignore if there are no associated transformations). - Add an origin header on the client. - Add path params as params too. - Use the case insensitive map for all headers.
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties tomcat/trunk/java/org/apache/tomcat/websocket/TransformationFactory.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/WsHandshakeRequest.java Modified: tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java?rev=1642360&r1=1642359&r2=1642360&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java Fri Nov 28 20:33:20 2014 @@ -49,6 +49,7 @@ public class Constants { public static final String HOST_HEADER_NAME = "Host"; public static final String UPGRADE_HEADER_NAME = "Upgrade"; public static final String UPGRADE_HEADER_VALUE = "websocket"; + public static final String ORIGIN_HEADER_NAME = "Origin"; public static final String CONNECTION_HEADER_NAME = "Connection"; public static final String CONNECTION_HEADER_VALUE = "upgrade"; public static final String WS_VERSION_HEADER_NAME = "Sec-WebSocket-Version"; Modified: tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties?rev=1642360&r1=1642359&r2=1642360&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties Fri Nov 28 20:33:20 2014 @@ -35,8 +35,6 @@ perMessageDeflate.duplicateParameter=Dup perMessageDeflate.invalidWindowSize=An invalid windows of [{1}] size was specified for [{0}]. Valid values are whole numbers from 8 to 15 inclusive. perMessageDeflate.unknownParameter=An unknown extension parameter [{0}] was defined -transformerFactory.unsupportedExtension=The extension [{0}] is not supported - util.notToken=An illegal extension parameter was specified with name [{0}] and value [{1}] util.invalidMessageHandler=The message handler provided does not have an onMessage(Object) method util.invalidType=Unable to coerce value [{0}] to type [{1}]. That type is not supported. Modified: tomcat/trunk/java/org/apache/tomcat/websocket/TransformationFactory.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/TransformationFactory.java?rev=1642360&r1=1642359&r2=1642360&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/TransformationFactory.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/TransformationFactory.java Fri Nov 28 20:33:20 2014 @@ -20,12 +20,8 @@ import java.util.List; import javax.websocket.Extension; -import org.apache.tomcat.util.res.StringManager; - public class TransformationFactory { - private static final StringManager sm = StringManager.getManager(Constants.PACKAGE_NAME); - private static final TransformationFactory factory = new TransformationFactory(); private TransformationFactory() { @@ -41,7 +37,6 @@ public class TransformationFactory { if (PerMessageDeflate.NAME.equals(name)) { return PerMessageDeflate.negotiate(preferences, isServer); } - throw new IllegalArgumentException( - sm.getString("transformerFactory.unsupportedExtension", name)); + return null; } } 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=1642360&r1=1642359&r2=1642360&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java Fri Nov 28 20:33:20 2014 @@ -218,7 +218,7 @@ public class WsWebSocketContainer sm.getString("wsWebSocketContainer.pathNoHost")); } int port = path.getPort(); - Map<String,List<String>> reqHeaders = createRequestHeaders(host, port, + Map<String,List<String>> reqHeaders = createRequestHeaders(path, host, port, clientEndpointConfiguration.getPreferredSubprotocols(), clientEndpointConfiguration.getExtensions()); clientEndpointConfiguration.getConfigurator(). @@ -430,7 +430,7 @@ public class WsWebSocketContainer return result; } - private Map<String,List<String>> createRequestHeaders(String host, + private Map<String,List<String>> createRequestHeaders(URI path, String host, int port, List<String> subProtocols, List<Extension> extensions) { Map<String,List<String>> headers = new HashMap<>(); @@ -476,6 +476,11 @@ public class WsWebSocketContainer generateExtensionHeaders(extensions)); } + // Origin header + List<String> originValues = new ArrayList<>(1); + originValues.add(path.toString()); + headers.put(Constants.ORIGIN_HEADER_NAME, originValues); + return headers; } @@ -571,7 +576,7 @@ public class WsWebSocketContainer ExecutionException, DeploymentException, EOFException, TimeoutException { - Map<String,List<String>> headers = new HashMap<>(); + Map<String,List<String>> headers = new CaseInsensitiveKeyMap<>(); boolean readStatus = false; boolean readHeaders = false; @@ -606,7 +611,7 @@ public class WsWebSocketContainer } } } - +System.out.println("Headers: " + headers); return new WsHandshakeResponse(headers); } 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=1642360&r1=1642359&r2=1642360&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/UpgradeUtil.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/UpgradeUtil.java Fri Nov 28 20:33:20 2014 @@ -112,7 +112,7 @@ public class UpgradeUtil { // Origin check - String origin = req.getHeader("Origin"); + String origin = req.getHeader(Constants.ORIGIN_HEADER_NAME); if (!sec.getConfigurator().checkOrigin(origin)) { resp.sendError(HttpServletResponse.SC_FORBIDDEN); return; @@ -134,8 +134,16 @@ public class UpgradeUtil { // 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> installedExtensions = null; + if (sec.getExtensions().size() == 0) { + installedExtensions = Constants.INSTALLED_EXTENSIONS; + } else { + installedExtensions = new ArrayList<>(); + installedExtensions.addAll(sec.getExtensions()); + installedExtensions.addAll(Constants.INSTALLED_EXTENSIONS); + } List<Extension> negotiatedExtensionsPhase1 = sec.getConfigurator().getNegotiatedExtensions( - Constants.INSTALLED_EXTENSIONS, extensionsRequested); + installedExtensions, extensionsRequested); // Negotiation phase 2. Create the Transformations that will be applied // to this connection. Note than an extension may be dropped at this @@ -191,7 +199,7 @@ public class UpgradeUtil { resp.setHeader(Constants.WS_EXTENSIONS_HEADER_NAME, responseHeaderExtensions.toString()); } - WsHandshakeRequest wsRequest = new WsHandshakeRequest(req); + WsHandshakeRequest wsRequest = new WsHandshakeRequest(req, pathParams); WsHandshakeResponse wsResponse = new WsHandshakeResponse(); WsPerSessionServerEndpointConfig perSessionServerEndpointConfig = new WsPerSessionServerEndpointConfig(sec); Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHandshakeRequest.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHandshakeRequest.java?rev=1642360&r1=1642359&r2=1642360&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHandshakeRequest.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHandshakeRequest.java Fri Nov 28 20:33:20 2014 @@ -30,6 +30,8 @@ import java.util.Map.Entry; import javax.servlet.http.HttpServletRequest; import javax.websocket.server.HandshakeRequest; +import org.apache.tomcat.websocket.CaseInsensitiveKeyMap; + /** * Represents the request that this session was opened under. */ @@ -45,7 +47,7 @@ public class WsHandshakeRequest implemen private volatile HttpServletRequest request; - public WsHandshakeRequest(HttpServletRequest request) { + public WsHandshakeRequest(HttpServletRequest request, Map<String,String> pathParams) { this.request = request; @@ -74,10 +76,15 @@ public class WsHandshakeRequest implemen Collections.unmodifiableList( Arrays.asList(entry.getValue()))); } + for (String pathName : pathParams.keySet()) { + newParameters.put(pathName, + Collections.unmodifiableList( + Arrays.asList(pathParams.get(pathName)))); + } parameterMap = Collections.unmodifiableMap(newParameters); // Headers - Map<String,List<String>> newHeaders = new HashMap<>(); + Map<String,List<String>> newHeaders = new CaseInsensitiveKeyMap<>(); Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org