From 14d7c15c28facd53c9c04383b6d0808943490fc3 Mon Sep 17 00:00:00 2001 From: markt Date: Fri, 8 Jul 2011 14:04:08 +0000 Subject: [PATCH] Bring the Http11 protocol implementations closer together. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1144317 13f79535-47bb-0310-9956-ffa450edef68 --- .../coyote/http11/AbstractHttp11Processor.java | 9 +++++ .../apache/coyote/http11/Http11AprProcessor.java | 7 +--- .../apache/coyote/http11/Http11AprProtocol.java | 11 +++++-- .../apache/coyote/http11/Http11NioProcessor.java | 6 +--- .../apache/coyote/http11/Http11NioProtocol.java | 27 ++++++++------- java/org/apache/coyote/http11/Http11Processor.java | 7 ++++ java/org/apache/coyote/http11/Http11Protocol.java | 38 ++++++++++++++++------ .../apache/coyote/http11/LocalStrings.properties | 1 + 8 files changed, 71 insertions(+), 35 deletions(-) diff --git a/java/org/apache/coyote/http11/AbstractHttp11Processor.java b/java/org/apache/coyote/http11/AbstractHttp11Processor.java index 5e56b5615..e3e489ce0 100644 --- a/java/org/apache/coyote/http11/AbstractHttp11Processor.java +++ b/java/org/apache/coyote/http11/AbstractHttp11Processor.java @@ -104,6 +104,12 @@ public abstract class AbstractHttp11Processor extends AbstractProcessor { /** + * Comet used. + */ + protected boolean comet = false; + + + /** * Regular expression that defines the restricted user agents. */ protected Pattern restrictedUserAgents = null; @@ -1242,6 +1248,9 @@ public abstract class AbstractHttp11Processor extends AbstractProcessor { } + public abstract SocketState event(SocketStatus status) throws IOException; + + /** * Provides a mechanism for those connector implementations (currently only * NIO) that need to reset timeouts from Async timeouts to standard HTTP diff --git a/java/org/apache/coyote/http11/Http11AprProcessor.java b/java/org/apache/coyote/http11/Http11AprProcessor.java index dd0a880fe..38fb8e916 100644 --- a/java/org/apache/coyote/http11/Http11AprProcessor.java +++ b/java/org/apache/coyote/http11/Http11AprProcessor.java @@ -94,12 +94,6 @@ public class Http11AprProcessor extends AbstractHttp11Processor { /** - * Comet used. - */ - protected boolean comet = false; - - - /** * Socket associated with the current connection. */ protected SocketWrapper socket = null; @@ -128,6 +122,7 @@ public class Http11AprProcessor extends AbstractHttp11Processor { * * @throws IOException error during an I/O operation */ + @Override public SocketState event(SocketStatus status) throws IOException { diff --git a/java/org/apache/coyote/http11/Http11AprProtocol.java b/java/org/apache/coyote/http11/Http11AprProtocol.java index 5c7de18f2..c228f8fba 100644 --- a/java/org/apache/coyote/http11/Http11AprProtocol.java +++ b/java/org/apache/coyote/http11/Http11AprProtocol.java @@ -214,8 +214,7 @@ public class Http11AprProtocol extends AbstractHttp11Protocol { @Override public SocketState process(SocketWrapper socket, SocketStatus status) { - Http11AprProcessor processor = - connections.remove(socket.getSocket()); + Http11AprProcessor processor = connections.remove(socket.getSocket()); socket.setAsync(false); @@ -227,6 +226,8 @@ public class Http11AprProtocol extends AbstractHttp11Protocol { processor = createProcessor(); } + initSsl(socket, processor); + SocketState state = SocketState.CLOSED; do { if (processor.isAsync() || state == SocketState.ASYNC_END) { @@ -266,7 +267,6 @@ public class Http11AprProtocol extends AbstractHttp11Protocol { recycledProcessors.offer(processor); } return state; - } catch (java.net.SocketException e) { // SocketExceptions are normal log.debug(sm.getString( @@ -292,6 +292,11 @@ public class Http11AprProtocol extends AbstractHttp11Protocol { return SocketState.CLOSED; } + private void initSsl(SocketWrapper socket, + Http11AprProcessor processor) { + // NOOP for APR + } + protected Http11AprProcessor createProcessor() { Http11AprProcessor processor = new Http11AprProcessor( proto.getMaxHttpHeaderSize(), (AprEndpoint)proto.endpoint, diff --git a/java/org/apache/coyote/http11/Http11NioProcessor.java b/java/org/apache/coyote/http11/Http11NioProcessor.java index 4f3057005..fcc6b7515 100644 --- a/java/org/apache/coyote/http11/Http11NioProcessor.java +++ b/java/org/apache/coyote/http11/Http11NioProcessor.java @@ -96,11 +96,6 @@ public class Http11NioProcessor extends AbstractHttp11Processor { protected NioEndpoint.SendfileData sendfileData = null; /** - * Comet used. - */ - protected boolean comet = false; - - /** * Closed flag, a Comet async thread can * signal for this Nio processor to be closed and recycled instead * of waiting for a timeout. @@ -123,6 +118,7 @@ public class Http11NioProcessor extends AbstractHttp11Processor { * * @throws IOException error during an I/O operation */ + @Override public SocketState event(SocketStatus status) throws IOException { diff --git a/java/org/apache/coyote/http11/Http11NioProtocol.java b/java/org/apache/coyote/http11/Http11NioProtocol.java index ff5d67781..e4dc0df10 100644 --- a/java/org/apache/coyote/http11/Http11NioProtocol.java +++ b/java/org/apache/coyote/http11/Http11NioProtocol.java @@ -245,16 +245,7 @@ public class Http11NioProtocol extends AbstractHttp11JsseProtocol { processor = createProcessor(); } - if (proto.isSSLEnabled() && - (proto.sslImplementation != null) - && (socket.getSocket() instanceof SecureNioChannel)) { - SecureNioChannel ch = (SecureNioChannel)socket.getSocket(); - processor.setSslSupport( - proto.sslImplementation.getSSLSupport( - ch.getSslEngine().getSession())); - } else { - processor.setSslSupport(null); - } + initSsl(socket, processor); SocketState state = SocketState.CLOSED; do { @@ -299,7 +290,6 @@ public class Http11NioProtocol extends AbstractHttp11JsseProtocol { release(socket, processor); } return state; - } catch (java.net.SocketException e) { // SocketExceptions are normal log.debug(sm.getString( @@ -323,6 +313,21 @@ public class Http11NioProtocol extends AbstractHttp11JsseProtocol { return SocketState.CLOSED; } + private void initSsl(SocketWrapper socket, + Http11NioProcessor processor) { + if (proto.isSSLEnabled() && + (proto.sslImplementation != null) + && (socket.getSocket() instanceof SecureNioChannel)) { + SecureNioChannel ch = (SecureNioChannel)socket.getSocket(); + processor.setSslSupport( + proto.sslImplementation.getSSLSupport( + ch.getSslEngine().getSession())); + } else { + processor.setSslSupport(null); + } + + } + public Http11NioProcessor createProcessor() { Http11NioProcessor processor = new Http11NioProcessor( proto.getMaxHttpHeaderSize(), (NioEndpoint)proto.endpoint, diff --git a/java/org/apache/coyote/http11/Http11Processor.java b/java/org/apache/coyote/http11/Http11Processor.java index 5cc1e1866..633f02cbf 100644 --- a/java/org/apache/coyote/http11/Http11Processor.java +++ b/java/org/apache/coyote/http11/Http11Processor.java @@ -386,6 +386,13 @@ public class Http11Processor extends AbstractHttp11Processor { } + @Override + public SocketState event(SocketStatus status) throws IOException { + // Should never reach this code but in case we do... + throw new IOException( + sm.getString("http11processor.comet.notsupported")); + } + // ----------------------------------------------------- ActionHook Methods diff --git a/java/org/apache/coyote/http11/Http11Protocol.java b/java/org/apache/coyote/http11/Http11Protocol.java index 2a6fd92b4..341e12d08 100644 --- a/java/org/apache/coyote/http11/Http11Protocol.java +++ b/java/org/apache/coyote/http11/Http11Protocol.java @@ -136,8 +136,12 @@ public class Http11Protocol extends AbstractHttp11JsseProtocol { } @Override - public SocketState process(SocketWrapper socket, SocketStatus status) { + public SocketState process(SocketWrapper socket, + SocketStatus status) { Http11Processor processor = connections.remove(socket); + + socket.setAsync(false); //no longer check for timeout + try { if (processor == null) { processor = recycledProcessors.poll(); @@ -146,18 +150,14 @@ public class Http11Protocol extends AbstractHttp11JsseProtocol { processor = createProcessor(); } - if (proto.isSSLEnabled() && (proto.sslImplementation != null)) { - processor.setSSLSupport( - proto.sslImplementation.getSSLSupport( - socket.getSocket())); - } else { - processor.setSSLSupport(null); - } + initSsl(socket,processor); SocketState state = SocketState.CLOSED; do { if (processor.isAsync() || state == SocketState.ASYNC_END) { state = processor.asyncDispatch(status); + } else if (processor.comet) { + state = processor.event(status); } else { state = processor.process(socket); } @@ -166,12 +166,18 @@ public class Http11Protocol extends AbstractHttp11JsseProtocol { state = processor.asyncPostProcess(); } } while (state == SocketState.ASYNC_END); - // TODO Better to add a new state to the AsyncStateMachine and - // remove ASYNC_END entirely if (state == SocketState.LONG) { + // In the middle of processing a request/response. Keep the + // socket associated with the processor. connections.put(socket, processor); + } else if (state == SocketState.OPEN){ + // In keep-alive but between requests. OK to recycle + // processor. Continue to poll for the next request. + processor.recycle(); + recycledProcessors.offer(processor); } else { + // Connection closed. OK to recycle the processor. processor.recycle(); recycledProcessors.offer(processor); } @@ -200,6 +206,18 @@ public class Http11Protocol extends AbstractHttp11JsseProtocol { return SocketState.CLOSED; } + private void initSsl(SocketWrapper socket, + Http11Processor processor) { + if (proto.isSSLEnabled() && (proto.sslImplementation != null)) { + processor.setSSLSupport( + proto.sslImplementation.getSSLSupport( + socket.getSocket())); + } else { + processor.setSSLSupport(null); + } + + } + protected Http11Processor createProcessor() { Http11Processor processor = new Http11Processor( proto.getMaxHttpHeaderSize(), (JIoEndpoint)proto.endpoint, diff --git a/java/org/apache/coyote/http11/LocalStrings.properties b/java/org/apache/coyote/http11/LocalStrings.properties index b45140ea0..dd49940b9 100644 --- a/java/org/apache/coyote/http11/LocalStrings.properties +++ b/java/org/apache/coyote/http11/LocalStrings.properties @@ -34,6 +34,7 @@ http11processor.socket.info=Exception getting socket information http11processor.socket.ssl=Exception getting SSL attributes http11processor.socket.sslreneg=Exception re-negotiating SSL connection http11processor.socket.timeout=Error setting socket timeout +http11processor.comet.notsupported=The Comet protocol is not supported by this connector iib.eof.error=Unexpected EOF read on the socket iib.requestheadertoolarge.error=Request header is too large -- 2.11.0