Author: costin Date: Wed Feb 22 05:37:34 2012 New Revision: 1292131 URL: http://svn.apache.org/viewvc?rev=1292131&view=rev Log: Add a hook to allow handling NPN extensions in the apr protocol ( the extension is not available in java ). I think this is the smallest change to allow plugging in spdy.
Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java?rev=1292131&r1=1292130&r2=1292131&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java Wed Feb 22 05:37:34 2012 @@ -19,6 +19,7 @@ package org.apache.coyote.http11; import java.io.IOException; import org.apache.coyote.AbstractProtocol; +import org.apache.coyote.Adapter; import org.apache.coyote.Processor; import org.apache.coyote.http11.upgrade.UpgradeAprProcessor; import org.apache.coyote.http11.upgrade.UpgradeInbound; @@ -26,6 +27,8 @@ import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.net.AbstractEndpoint; import org.apache.tomcat.util.net.AprEndpoint; +import org.apache.tomcat.util.net.SocketStatus; +import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.AprEndpoint.Handler; import org.apache.tomcat.util.net.SocketWrapper; @@ -42,6 +45,15 @@ public class Http11AprProtocol extends A private static final Log log = LogFactory.getLog(Http11AprProtocol.class); + /** + * Interface specific for protocols that negotiate at NPN level, like + * SPDY. This is only available for APR, will replace the HTTP framing. + */ + public static interface NpnHandler { + SocketState process(SocketWrapper<Long> socket, SocketStatus status, + Http11AprProtocol proto, AbstractEndpoint endpoint); + public void init(final AbstractEndpoint ep, long sslContext, Adapter adapter); + } @Override protected Log getLog() { return log; } @@ -63,6 +75,7 @@ public class Http11AprProtocol extends A } private final Http11ConnectionHandler cHandler; + private NpnHandler npnHandler; public boolean getUseSendfile() { return ((AprEndpoint)endpoint).getUseSendfile(); } public void setUseSendfile(boolean useSendfile) { ((AprEndpoint)endpoint).setUseSendfile(useSendfile); } @@ -171,6 +184,16 @@ public class Http11AprProtocol extends A public int getSSLVerifyDepth() { return ((AprEndpoint)endpoint).getSSLVerifyDepth(); } public void setSSLVerifyDepth(int SSLVerifyDepth) { ((AprEndpoint)endpoint).setSSLVerifyDepth(SSLVerifyDepth); } + // TODO: map of protocols + public void setNpnHandler(String impl) { + try { + Class c = Class.forName(impl); + npnHandler = (NpnHandler) c.newInstance(); + } catch (Exception ex) { + getLog().warn("Failed to init light protocol " + impl, ex); + } + } + // ----------------------------------------------------- JMX related methods @Override @@ -178,7 +201,16 @@ public class Http11AprProtocol extends A return ("http-apr"); } - + + @Override + public void start() throws Exception { + super.start(); + if (npnHandler != null) { + long sslCtx = ((AprEndpoint) endpoint).getJniSslContext(); + npnHandler.init(endpoint, sslCtx, adapter); + } + } + // -------------------- Connection handler -------------------- protected static class Http11ConnectionHandler @@ -225,6 +257,29 @@ public class Http11AprProtocol extends A socket.getSocket().longValue(), true); } } + + @Override + public SocketState process(SocketWrapper<Long> socket, + SocketStatus status) { + if (proto.npnHandler != null) { + Processor<Long> processor = null; + if (status == SocketStatus.OPEN) { + processor = connections.get(socket.getSocket()); + + } + if (processor == null) { + // if not null - this is a former comet request, handled by http11 + SocketState socketState = proto.npnHandler.process(socket, status, + proto, proto.endpoint); + // handled by npn protocol. + if (socketState == SocketState.CLOSED || + socketState == SocketState.LONG) { + return socketState; + } + } + } + return super.process(socket, status); + } @Override protected void initSsl(SocketWrapper<Long> socket, Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1292131&r1=1292130&r2=1292131&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Wed Feb 22 05:37:34 2012 @@ -578,6 +578,9 @@ public class AprEndpoint extends Abstrac } } + public long getJniSslContext() { + return sslContext; + } /** * Start the APR endpoint, creating acceptor, poller and sendfile threads. @@ -811,9 +814,9 @@ public class AprEndpoint extends Abstrac } } - /** - * Process given socket. + * Process given socket. This is called when the socket has been + * accepted. */ protected boolean processSocketWithOptions(long socket) { try { @@ -838,7 +841,8 @@ public class AprEndpoint extends Abstrac /** - * Process given socket. + * Process given socket. Called in non-comet mode, typically keep alive + * or upgraded protocol. */ protected boolean processSocket(long socket) { try { @@ -1209,6 +1213,7 @@ public class AprEndpoint extends Abstrac addSocket[addCount] = socket; addSocketKeepAlive[addCount] = keepAlive; addCount++; + // TODO: interrupt poll ? this.notify(); } } @@ -1729,6 +1734,8 @@ public class AprEndpoint extends Abstrac * This class is the equivalent of the Worker, but will simply use in an * external Executor thread pool. This will also set the socket options * and do the handshake. + * + * This is called after an accept(). */ protected class SocketWithOptionsProcessor implements Runnable { --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org