You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/08/16 15:44:13 UTC

svn commit: r1514707 - in /tomcat/tc7.0.x/trunk/java/org/apache: coyote/ coyote/ajp/ coyote/http11/ tomcat/util/net/

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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org