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