Author: markt Date: Wed Mar 20 09:58:07 2013 New Revision: 1458710 URL: http://svn.apache.org/r1458710 Log: Align implementation with new name in spec WsProtocolHandler -> WsHttpUpgradeHanlder Align implementation with new HttpServletRequest.upgrade() method
Added: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java - copied, changed from r1458695, tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java Removed: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java Modified: tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java tomcat/trunk/java/javax/servlet/http/HttpUpgradeHandler.java tomcat/trunk/java/org/apache/catalina/connector/Request.java tomcat/trunk/java/org/apache/catalina/connector/RequestFacade.java tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java tomcat/trunk/java/org/apache/tomcat/websocket/server/LocalStrings.properties tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java tomcat/trunk/test/org/apache/coyote/http11/upgrade/TestUpgrade.java Modified: tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java?rev=1458710&r1=1458709&r2=1458710&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java (original) +++ tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java Wed Mar 20 09:58:07 2013 @@ -512,5 +512,6 @@ public interface HttpServletRequest exte * * @since Servlet 3.1 */ - public void upgrade(HttpUpgradeHandler handler) throws java.io.IOException; + public <T extends HttpUpgradeHandler> T upgrade( + Class<T> httpUpgradeHandlerClass) throws java.io.IOException; } Modified: tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java?rev=1458710&r1=1458709&r2=1458710&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java (original) +++ tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java Wed Mar 20 09:58:07 2013 @@ -364,13 +364,13 @@ public class HttpServletRequestWrapper e * {@inheritDoc} * <p> * The default behavior of this method is to return - * {@link HttpServletRequest#upgrade(HttpUpgradeHandler)} - * on the wrapped request object. + * {@link HttpServletRequest#upgrade(Class)} on the wrapped request object. * * @since Servlet 3.1 */ @Override - public void upgrade(HttpUpgradeHandler handler) throws java.io.IOException { - this._getHttpServletRequest().upgrade(handler); + public <T extends HttpUpgradeHandler> T upgrade( + Class<T> httpUpgradeHandlerClass) throws IOException { + return this._getHttpServletRequest().upgrade(httpUpgradeHandlerClass); } } Modified: tomcat/trunk/java/javax/servlet/http/HttpUpgradeHandler.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpUpgradeHandler.java?rev=1458710&r1=1458709&r2=1458710&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/http/HttpUpgradeHandler.java (original) +++ tomcat/trunk/java/javax/servlet/http/HttpUpgradeHandler.java Wed Mar 20 09:58:07 2013 @@ -25,13 +25,18 @@ public interface HttpUpgradeHandler { /** * This method is called once the request/response pair where - * {@link HttpServletRequest#upgrade(HttpUpgradeHandler)} is called has - * completed processing and is the point where control of the connection - * passes from the container to the {@link HttpUpgradeHandler}. + * {@link HttpServletRequest#upgrade(Class)} is called has completed + * processing and is the point where control of the connection passes from + * the container to the {@link HttpUpgradeHandler}. * * @param connection The connection that has been upgraded * * @since Servlet 3.1 */ void init(WebConnection connection); + + /** + * This method is called after the upgraded connection has been closed. + */ + void destroy(); } Modified: tomcat/trunk/java/org/apache/catalina/connector/Request.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Request.java?rev=1458710&r1=1458709&r2=1458710&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Wed Mar 20 09:58:07 2013 @@ -1885,13 +1885,24 @@ public class Request * @since Servlet 3.1 */ @Override - public void upgrade(HttpUpgradeHandler handler) throws IOException { + public <T extends HttpUpgradeHandler> T upgrade( + Class<T> httpUpgradeHandlerClass) throws java.io.IOException { + + T handler; + try { + handler = httpUpgradeHandlerClass.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw new IOException(e); + } + coyoteRequest.action(ActionCode.UPGRADE, handler); // Output required by RFC2616. Protocol specific headers should have // already been set. response.setStatus(HttpServletResponse.SC_SWITCHING_PROTOCOLS); response.flushBuffer(); + + return handler; } /** Modified: tomcat/trunk/java/org/apache/catalina/connector/RequestFacade.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/RequestFacade.java?rev=1458710&r1=1458709&r2=1458710&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/RequestFacade.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/RequestFacade.java Wed Mar 20 09:58:07 2013 @@ -1112,7 +1112,8 @@ public class RequestFacade implements Ht * @since Servlet 3.1 */ @Override - public void upgrade(HttpUpgradeHandler handler) throws IOException { - request.upgrade(handler); + public <T extends HttpUpgradeHandler> T upgrade( + Class<T> httpUpgradeHandlerClass) throws java.io.IOException { + return request.upgrade(httpUpgradeHandlerClass); } } Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java?rev=1458710&r1=1458709&r2=1458710&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java Wed Mar 20 09:58:07 2013 @@ -675,7 +675,9 @@ public abstract class AbstractProtocol i // Connection closed. OK to recycle the processor. Upgrade // processors are not recycled. connections.remove(socket); - if (!processor.isUpgrade()) { + if (processor.isUpgrade()) { + processor.getHttpUpgradeHandler().destroy(); + } else { release(wrapper, processor, true, false); } } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/LocalStrings.properties?rev=1458710&r1=1458709&r2=1458710&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/LocalStrings.properties Wed Mar 20 09:58:07 2013 @@ -24,4 +24,6 @@ serverContainer.servletContextMissing=No uriTemplate.noMatch=The input template [{0}] generated the pattern [{1}] which did not match the supplied pathInfo [{2}] +wsHttpUpgradeHandler.noPreInit=The preInit() method must be called to configure the WebSocket HttpUpgradeHandler before the container calls init(). Usually, this means the Servlet that created the WsHttpUpgradeHandler instance should also call preInit() + wsRemoteEndpointServer.closeFailed=Failed to close the ServletOutputStream connection cleanly \ No newline at end of file Copied: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java (from r1458695, tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java) URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java?p2=tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java&p1=tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java&r1=1458695&r2=1458710&rev=1458710&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java Wed Mar 20 09:58:07 2013 @@ -32,27 +32,37 @@ import javax.websocket.DeploymentExcepti import javax.websocket.Endpoint; import javax.websocket.EndpointConfig; +import org.apache.tomcat.util.res.StringManager; import org.apache.tomcat.websocket.WsIOException; import org.apache.tomcat.websocket.WsSession; /** * Servlet 3.1 HTTP upgrade handler for WebSocket connections. */ -public class WsProtocolHandler implements HttpUpgradeHandler { +public class WsHttpUpgradeHandler implements HttpUpgradeHandler { - private final Endpoint ep; - private final EndpointConfig endpointConfig; private final ClassLoader applicationClassLoader; - private final WsServerContainer webSocketContainer; - private final WsHandshakeRequest handshakeRequest; - private final String subProtocol; - private final Map<String,String> pathParameters; - private final boolean secure; + + private Endpoint ep; + private EndpointConfig endpointConfig; + private WsServerContainer webSocketContainer; + private WsHandshakeRequest handshakeRequest; + private String subProtocol; + private Map<String,String> pathParameters; + private boolean secure; private WsSession wsSession; + private static final StringManager sm = + StringManager.getManager(Constants.PACKAGE_NAME); + - public WsProtocolHandler(Endpoint ep, EndpointConfig endpointConfig, + public WsHttpUpgradeHandler() { + applicationClassLoader = Thread.currentThread().getContextClassLoader(); + } + + + public void preInit(Endpoint ep, EndpointConfig endpointConfig, WsServerContainer wsc, WsHandshakeRequest handshakeRequest, String subProtocol, Map<String,String> pathParameters, boolean secure) { @@ -63,12 +73,16 @@ public class WsProtocolHandler implement this.subProtocol = subProtocol; this.pathParameters = pathParameters; this.secure = secure; - applicationClassLoader = Thread.currentThread().getContextClassLoader(); } @Override public void init(WebConnection connection) { + if (ep == null) { + throw new IllegalStateException( + sm.getString("wsHttpUpgradeHandler.noPreInit")); + } + ServletInputStream sis; ServletOutputStream sos; try { @@ -110,6 +124,12 @@ public class WsProtocolHandler implement } + @Override + public void destroy() { + // NO-OP + } + + private void onError(Throwable throwable) { // Need to call onError using the web application's class loader Thread t = Thread.currentThread(); @@ -138,11 +158,11 @@ public class WsProtocolHandler implement private static class WsReadListener implements ReadListener { - private final WsProtocolHandler wsProtocolHandler; + private final WsHttpUpgradeHandler wsProtocolHandler; private final WsFrameServer wsFrame; - private WsReadListener(WsProtocolHandler wsProtocolHandler, + private WsReadListener(WsHttpUpgradeHandler wsProtocolHandler, WsFrameServer wsFrame) { this.wsProtocolHandler = wsProtocolHandler; this.wsFrame = wsFrame; @@ -181,10 +201,10 @@ public class WsProtocolHandler implement private static class WsWriteListener implements WriteListener { - private final WsProtocolHandler wsProtocolHandler; + private final WsHttpUpgradeHandler wsProtocolHandler; private final WsRemoteEndpointImplServer wsRemoteEndpointServer; - private WsWriteListener(WsProtocolHandler wsProtocolHandler, + private WsWriteListener(WsHttpUpgradeHandler wsProtocolHandler, WsRemoteEndpointImplServer wsRemoteEndpointServer) { this.wsProtocolHandler = wsProtocolHandler; this.wsRemoteEndpointServer = wsRemoteEndpointServer; Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java?rev=1458710&r1=1458709&r2=1458710&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java Wed Mar 20 09:58:07 2013 @@ -39,7 +39,7 @@ public class WsRemoteEndpointImplServer private static final StringManager sm = StringManager.getManager(Constants.PACKAGE_NAME); private static final Log log = - LogFactory.getLog(WsProtocolHandler.class); + LogFactory.getLog(WsHttpUpgradeHandler.class); private final ServletOutputStream sos; private final WsWriteTimeout wsWriteTimeout; Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java?rev=1458710&r1=1458709&r2=1458710&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java Wed Mar 20 09:58:07 2013 @@ -34,7 +34,6 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpUpgradeHandler; import javax.websocket.Endpoint; import javax.websocket.Extension; import javax.websocket.server.ServerEndpointConfig; @@ -155,9 +154,10 @@ public class WsServlet extends HttpServl } } - HttpUpgradeHandler wsHandler = new WsProtocolHandler(ep, sec, sc, - wsRequest, subProtocol, pathParameters, req.isSecure()); - req.upgrade(wsHandler); + WsHttpUpgradeHandler wsHandler = + req.upgrade(WsHttpUpgradeHandler.class); + wsHandler.preInit(ep, sec, sc, wsRequest, subProtocol, pathParameters, + req.isSecure()); } Modified: tomcat/trunk/test/org/apache/coyote/http11/upgrade/TestUpgrade.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http11/upgrade/TestUpgrade.java?rev=1458710&r1=1458709&r2=1458710&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/coyote/http11/upgrade/TestUpgrade.java (original) +++ tomcat/trunk/test/org/apache/coyote/http11/upgrade/TestUpgrade.java Wed Mar 20 09:58:07 2013 @@ -159,14 +159,7 @@ public class TestUpgrade extends TomcatB protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - HttpUpgradeHandler upgradeHandler; - try { - upgradeHandler = upgradeHandlerClass.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - throw new ServletException(e); - } - - req.upgrade(upgradeHandler); + req.upgrade(upgradeHandlerClass); } } @@ -189,7 +182,7 @@ public class TestUpgrade extends TomcatB } - protected static class EchoBlocking implements HttpUpgradeHandler { + public static class EchoBlocking implements HttpUpgradeHandler { @Override public void init(WebConnection connection) { @@ -201,10 +194,15 @@ public class TestUpgrade extends TomcatB throw new IllegalStateException(ioe); } } + + @Override + public void destroy() { + // NO-OP + } } - protected static class EchoNonBlocking implements HttpUpgradeHandler { + public static class EchoNonBlocking implements HttpUpgradeHandler { private ServletInputStream sis; private ServletOutputStream sos; @@ -223,6 +221,11 @@ public class TestUpgrade extends TomcatB sos.setWriteListener(new EchoWriteListener()); } + @Override + public void destroy() { + // NO-OP + } + private class EchoReadListener implements ReadListener { private byte[] buffer = new byte[8096]; @@ -253,8 +256,7 @@ public class TestUpgrade extends TomcatB @Override public void onError(Throwable throwable) { - // TODO Auto-generated method stub - + // NO-OP } } @@ -262,14 +264,12 @@ public class TestUpgrade extends TomcatB @Override public void onWritePossible() { - // TODO Auto-generated method stub - + // NO-OP } @Override public void onError(Throwable throwable) { - // TODO Auto-generated method stub - + // NO-OP } } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org