Author: markt Date: Fri Aug 16 13:44:13 2013 New Revision: 1514707 URL: http://svn.apache.org/r1514707 Log: Back-porting JSR-356 Add some necessary plumbing for Servlet 3.1 based HTTP upgrade
Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/AbstractProtocol.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProtocol.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/AbstractProtocol.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/AbstractProtocol.java?rev=1514707&r1=1514706&r2=1514707&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/AbstractProtocol.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/AbstractProtocol.java Fri Aug 16 13:44:13 2013 @@ -31,6 +31,8 @@ import javax.management.ObjectName; import org.apache.coyote.http11.upgrade.UpgradeInbound; import org.apache.coyote.http11.upgrade.UpgradeProcessor; +import org.apache.coyote.http11.upgrade.servlet31.HttpUpgradeHandler; +import org.apache.coyote.http11.upgrade.servlet31.WebConnection; import org.apache.juli.logging.Log; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.modeler.Registry; @@ -602,7 +604,27 @@ public abstract class AbstractProtocol i state = processor.asyncPostProcess(); } - if (state == SocketState.UPGRADING_TOMCAT) { + if (state == SocketState.UPGRADING) { + // Get the HTTP upgrade handler + HttpUpgradeHandler httpUpgradeHandler = + processor.getHttpUpgradeHandler(); + // Release the Http11 processor to be re-used + release(wrapper, processor, false, false); + // Create the upgrade processor + processor = createUpgradeProcessor( + wrapper, httpUpgradeHandler); + // Mark the connection as upgraded + wrapper.setUpgraded(true); + // Associate with the processor with the connection + connections.put(socket, processor); + // Initialise the upgrade handler (which may trigger + // some IO using the new protocol which is why the lines + // above are necessary) + // This cast should be safe. If it fails the error + // handling for the surrounding try/catch will deal with + // it. + httpUpgradeHandler.init((WebConnection) processor); + } else if (state == SocketState.UPGRADING_TOMCAT) { // Get the UpgradeInbound handler UpgradeInbound inbound = processor.getUpgradeInbound(); // Release the Http11 processor to be re-used @@ -612,6 +634,7 @@ public abstract class AbstractProtocol i inbound.onUpgradeComplete(); } } while (state == SocketState.ASYNC_END || + state == SocketState.UPGRADING || state == SocketState.UPGRADING_TOMCAT); if (state == SocketState.LONG) { @@ -676,7 +699,10 @@ public abstract class AbstractProtocol i protected abstract Processor<S> createUpgradeProcessor( SocketWrapper<S> socket, UpgradeInbound inbound) throws IOException; - + protected abstract Processor<S> createUpgradeProcessor( + SocketWrapper<S> socket, + HttpUpgradeHandler httpUpgradeProcessor) throws IOException; + protected void register(AbstractProcessor<S> processor) { if (getProtocol().getDomain() != null) { synchronized (this) { Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProtocol.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProtocol.java?rev=1514707&r1=1514706&r2=1514707&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProtocol.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProtocol.java Fri Aug 16 13:44:13 2013 @@ -19,6 +19,7 @@ package org.apache.coyote.ajp; import org.apache.coyote.AbstractProtocol; import org.apache.coyote.Processor; import org.apache.coyote.http11.upgrade.UpgradeInbound; +import org.apache.coyote.http11.upgrade.servlet31.HttpUpgradeHandler; import org.apache.tomcat.util.net.SocketWrapper; import org.apache.tomcat.util.res.StringManager; @@ -96,5 +97,12 @@ public abstract class AbstractAjpProtoco // TODO should fail - throw IOE return null; } + + @Override + protected P createUpgradeProcessor(SocketWrapper<S> socket, + HttpUpgradeHandler httpUpgradeHandler) { + // TODO should fail - throw IOE + return null; + } } } Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java?rev=1514707&r1=1514706&r2=1514707&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java Fri Aug 16 13:44:13 2013 @@ -1116,6 +1116,8 @@ public abstract class AbstractHttp11Proc return SocketState.CLOSED; } else if (isAsync() || comet) { return SocketState.LONG; + } else if (isUpgrade()) { + return SocketState.UPGRADING; } else if (getUpgradeInbound() != null) { return SocketState.UPGRADING_TOMCAT; } else { Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java?rev=1514707&r1=1514706&r2=1514707&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java Fri Aug 16 13:44:13 2013 @@ -20,8 +20,10 @@ import java.io.IOException; import org.apache.coyote.AbstractProtocol; import org.apache.coyote.Processor; +import org.apache.coyote.http11.upgrade.AprProcessor; import org.apache.coyote.http11.upgrade.UpgradeAprProcessor; import org.apache.coyote.http11.upgrade.UpgradeInbound; +import org.apache.coyote.http11.upgrade.servlet31.HttpUpgradeHandler; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.net.AbstractEndpoint; @@ -320,5 +322,14 @@ public class Http11AprProtocol extends A throws IOException { return new UpgradeAprProcessor(socket, inbound); } + + @Override + protected Processor<Long> createUpgradeProcessor( + SocketWrapper<Long> socket, + HttpUpgradeHandler httpUpgradeProcessor) + throws IOException { + return new AprProcessor(socket, httpUpgradeProcessor, + (AprEndpoint) proto.endpoint); + } } } Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java?rev=1514707&r1=1514706&r2=1514707&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java Fri Aug 16 13:44:13 2013 @@ -22,8 +22,10 @@ import java.util.Iterator; import org.apache.coyote.AbstractProtocol; import org.apache.coyote.Processor; +import org.apache.coyote.http11.upgrade.NioProcessor; import org.apache.coyote.http11.upgrade.UpgradeInbound; import org.apache.coyote.http11.upgrade.UpgradeNioProcessor; +import org.apache.coyote.http11.upgrade.servlet31.HttpUpgradeHandler; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.net.AbstractEndpoint; @@ -286,5 +288,14 @@ public class Http11NioProtocol extends A return new UpgradeNioProcessor(socket, inbound, ((Http11NioProtocol) getProtocol()).getEndpoint().getSelectorPool()); } + + @Override + protected Processor<NioChannel> createUpgradeProcessor( + SocketWrapper<NioChannel> socket, + HttpUpgradeHandler httpUpgradeProcessor) + throws IOException { + return new NioProcessor(socket, httpUpgradeProcessor, + ((Http11NioProtocol) getProtocol()).getEndpoint().getSelectorPool()); + } } } Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java?rev=1514707&r1=1514706&r2=1514707&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java Fri Aug 16 13:44:13 2013 @@ -21,8 +21,10 @@ import java.net.Socket; import org.apache.coyote.AbstractProtocol; import org.apache.coyote.Processor; +import org.apache.coyote.http11.upgrade.BioProcessor; import org.apache.coyote.http11.upgrade.UpgradeBioProcessor; import org.apache.coyote.http11.upgrade.UpgradeInbound; +import org.apache.coyote.http11.upgrade.servlet31.HttpUpgradeHandler; import org.apache.juli.logging.Log; import org.apache.tomcat.util.net.AbstractEndpoint; import org.apache.tomcat.util.net.JIoEndpoint; @@ -191,5 +193,13 @@ public class Http11Protocol extends Abst throws IOException { return new UpgradeBioProcessor(socket, inbound); } + + @Override + protected Processor<Socket> createUpgradeProcessor( + SocketWrapper<Socket> socket, + HttpUpgradeHandler httpUpgradeProcessor) + throws IOException { + return new BioProcessor(socket, httpUpgradeProcessor); + } } } Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java?rev=1514707&r1=1514706&r2=1514707&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java Fri Aug 16 13:44:13 2013 @@ -324,6 +324,7 @@ public class JIoEndpoint extends Abstrac // Ignore } } else if (state == SocketState.OPEN || + state == SocketState.UPGRADING || state == SocketState.UPGRADING_TOMCAT || state == SocketState.UPGRADED){ socket.setKeptAlive(true); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org