Author: markt Date: Wed Jul 31 14:17:08 2013 New Revision: 1508872 URL: http://svn.apache.org/r1508872 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=55314 Provide a configuration option to bypass the specification restriction on not being able to add endpoints prgrammatically once the first endpoint has started a handshake.
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java tomcat/trunk/java/org/apache/tomcat/websocket/server/Constants.java tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java tomcat/trunk/webapps/docs/config/systemprops.xml tomcat/trunk/webapps/docs/web-socket-howto.xml 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=1508872&r1=1508871&r2=1508872&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java Wed Jul 31 14:17:08 2013 @@ -57,6 +57,9 @@ public class Constants { public static final String WS_EXTENSIONS_HEADER_NAME = "Sec-WebSocket-Extensions"; + public static final boolean STRICT_SPEC_COMPLIANCE = + Boolean.getBoolean( + "org.apache.tomcat.websocket.STRICT_SPEC_COMPLIANCE"); private Constants() { // Hide default constructor Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/Constants.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/Constants.java?rev=1508872&r1=1508871&r2=1508872&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/Constants.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/Constants.java Wed Jul 31 14:17:08 2013 @@ -28,6 +28,8 @@ public class Constants { "org.apache.tomcat.websocket.binaryBufferSize"; public static final String TEXT_BUFFER_SIZE_SERVLET_CONTEXT_INIT_PARAM = "org.apache.tomcat.websocket.textBufferSize"; + public static final String ENFORCE_NO_ADD_AFTER_HANDSHAKE_CONTEXT_INIT_PARAM = + "org.apache.tomcat.websocket.noAddAfterHandshake"; public static final String SERVER_CONTAINER_SERVLET_CONTEXT_ATTRIBUTE = "javax.websocket.server.ServerContainer"; Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java?rev=1508872&r1=1508871&r2=1508872&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java Wed Jul 31 14:17:08 2013 @@ -73,6 +73,8 @@ public class WsServerContainer extends W new ConcurrentHashMap<>(); private final ConcurrentHashMap<Integer,SortedSet<TemplatePathMatch>> configTemplateMatchMap = new ConcurrentHashMap<>(); + private volatile boolean enforceNoAddAfterHandshake = + org.apache.tomcat.websocket.Constants.STRICT_SPEC_COMPLIANCE; private volatile boolean addAllowed = true; private final ConcurrentHashMap<String,Set<WsSession>> authenticatedSessions = new ConcurrentHashMap<>(); @@ -94,6 +96,12 @@ public class WsServerContainer extends W setDefaultMaxTextMessageBufferSize(Integer.parseInt(value)); } + value = servletContext.getInitParameter( + Constants.ENFORCE_NO_ADD_AFTER_HANDSHAKE_CONTEXT_INIT_PARAM); + if (value != null) { + setEnforceNoAddAfterHandshake(Boolean.parseBoolean(value)); + } + FilterRegistration fr = servletContext.addFilter( WsFilter.class.getName(), new WsFilter(this)); @@ -116,7 +124,7 @@ public class WsServerContainer extends W public void addEndpoint(ServerEndpointConfig sec) throws DeploymentException { - if (!addAllowed) { + if (enforceNoAddAfterHandshake && !addAllowed) { throw new DeploymentException( sm.getString("serverContainer.addNotAllowed")); } @@ -272,6 +280,18 @@ public class WsServerContainer extends W } + + public boolean isEnforceNoAddAfterHandshake() { + return enforceNoAddAfterHandshake; + } + + + public void setEnforceNoAddAfterHandshake( + boolean enforceNoAddAfterHandshake) { + this.enforceNoAddAfterHandshake = enforceNoAddAfterHandshake; + } + + protected WsWriteTimeout getTimeout() { return wsWriteTimeout; } Modified: tomcat/trunk/webapps/docs/config/systemprops.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/systemprops.xml?rev=1508872&r1=1508871&r2=1508872&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/config/systemprops.xml (original) +++ tomcat/trunk/webapps/docs/config/systemprops.xml Wed Jul 31 14:17:08 2013 @@ -272,7 +272,7 @@ </section> -<section name="Specification"> +<section name="Specifications"> <properties> @@ -341,6 +341,16 @@ else the default value will be <code>false</code>.</p> </property> + <property name="org.apache.tomcat.websocket. STRICT_SPEC_COMPLIANCE"> + <p>The default value of this system property is <code>false</code>.</p> + <p>If this is <code>true</code> the default values will be changed for: + <ul> + <li><code>org.apache.tomcat.websocket.server#isEnforceNoAddAfterHandshake</code> + (default changes from <code>false</code> to <code>true</code>)</li> + </ul> + </p> + </property> + <property name="org.apache.tomcat.util.http. ServerCookie.ALLOW_EQUALS_IN_VALUE"> <p>If this is <code>true</code> Tomcat will allow '<code>=</code>' Modified: tomcat/trunk/webapps/docs/web-socket-howto.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/web-socket-howto.xml?rev=1508872&r1=1508871&r2=1508872&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/web-socket-howto.xml (original) +++ tomcat/trunk/webapps/docs/web-socket-howto.xml Wed Jul 31 14:17:08 2013 @@ -72,6 +72,15 @@ parameter <code>org.apache.tomcat.websocket.textBufferSize</code> to the desired value in bytes.</p> +<p>The Java WebSocket specification 1.0 does not permit programmatic deployment + after the first endpoint has started a WebSocket handshake. By default, + Tomcat continues to permit additional programmatic deployment. This + behavior is controlled by the + <code>org.apache.tomcat.websocket.noAddAfterHandshake</code> servlet context + initialization parameter. The default may be changed by setting the + <code>org.apache.tomcat.websocket.STRICT_SPEC_COMPLIANCE</code> system + property to <code>true</code> but any explict setting on the servlet context + will always take priority.</p> </section> </body> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org