Return-Path: X-Original-To: apmail-tomcat-dev-archive@www.apache.org Delivered-To: apmail-tomcat-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id EDF129C63 for ; Wed, 22 Feb 2012 05:38:02 +0000 (UTC) Received: (qmail 37924 invoked by uid 500); 22 Feb 2012 05:38:02 -0000 Delivered-To: apmail-tomcat-dev-archive@tomcat.apache.org Received: (qmail 37804 invoked by uid 500); 22 Feb 2012 05:38:00 -0000 Mailing-List: contact dev-help@tomcat.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "Tomcat Developers List" Delivered-To: mailing list dev@tomcat.apache.org Received: (qmail 37750 invoked by uid 99); 22 Feb 2012 05:37:58 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 22 Feb 2012 05:37:58 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 22 Feb 2012 05:37:56 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id C9FD523888D2 for ; Wed, 22 Feb 2012 05:37:34 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1292131 - in /tomcat/trunk/java/org/apache: coyote/http11/Http11AprProtocol.java tomcat/util/net/AprEndpoint.java Date: Wed, 22 Feb 2012 05:37:34 -0000 To: dev@tomcat.apache.org From: costin@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120222053734.C9FD523888D2@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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 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 socket, + SocketStatus status) { + if (proto.npnHandler != null) { + Processor 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 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-unsubscribe@tomcat.apache.org For additional commands, e-mail: dev-help@tomcat.apache.org