From 08d656845e1f1015fadc7208dee7ed326d5238e8 Mon Sep 17 00:00:00 2001 From: markt Date: Tue, 6 Sep 2011 15:45:08 +0000 Subject: [PATCH] Connector alignment - request line reading git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1165721 13f79535-47bb-0310-9956-ffa450edef68 --- .../coyote/http11/AbstractHttp11Processor.java | 8 ++++ .../apache/coyote/http11/Http11AprProcessor.java | 30 ++++++++----- .../apache/coyote/http11/Http11NioProcessor.java | 51 +++++++++++++--------- java/org/apache/coyote/http11/Http11Processor.java | 19 +++++--- 4 files changed, 71 insertions(+), 37 deletions(-) diff --git a/java/org/apache/coyote/http11/AbstractHttp11Processor.java b/java/org/apache/coyote/http11/AbstractHttp11Processor.java index 29c9fdb91..c8448ba61 100644 --- a/java/org/apache/coyote/http11/AbstractHttp11Processor.java +++ b/java/org/apache/coyote/http11/AbstractHttp11Processor.java @@ -823,6 +823,14 @@ public abstract class AbstractHttp11Processor extends AbstractProcessor { /** + * Defines how a connector handles an incomplete request line read. + * + * @returns true if the processor should break out of the + * processing loop, otherwise false. + */ + protected abstract boolean handleIncompleteRequestLineRead(); + + /** * After reading the request headers, we have to setup the request filters. */ protected void prepareRequest() { diff --git a/java/org/apache/coyote/http11/Http11AprProcessor.java b/java/org/apache/coyote/http11/Http11AprProcessor.java index 790c2e85e..e4e32cc1a 100644 --- a/java/org/apache/coyote/http11/Http11AprProcessor.java +++ b/java/org/apache/coyote/http11/Http11AprProcessor.java @@ -204,16 +204,7 @@ public class Http11AprProcessor extends AbstractHttp11Processor { setRequestLineReadTimeout(); if (!inputBuffer.parseRequestLine(keptAlive)) { - // This means that no data is available right now - // (long keepalive), so that the processor should be recycled - // and the method should return true - openSocket = true; - if (endpoint.isPaused()) { - // 503 - Service unavailable - response.setStatus(503); - adapter.log(request, response, 0); - error = true; - } else { + if (handleIncompleteRequestLineRead()) { break; } } @@ -389,9 +380,26 @@ public class Http11AprProcessor extends AbstractHttp11Processor { @Override + protected boolean handleIncompleteRequestLineRead() { + // This means that no data is available right now + // (long keepalive), so that the processor should be recycled + // and the method should return true + openSocket = true; + if (endpoint.isPaused()) { + // 503 - Service unavailable + response.setStatus(503); + adapter.log(request, response, 0); + error = true; + } else { + return true; + } + return false; + } + + + @Override protected void setCometTimeouts(SocketWrapper socketWrapper) { // NO-OP for APR/native - return; } diff --git a/java/org/apache/coyote/http11/Http11NioProcessor.java b/java/org/apache/coyote/http11/Http11NioProcessor.java index d80cbe649..be8114f88 100644 --- a/java/org/apache/coyote/http11/Http11NioProcessor.java +++ b/java/org/apache/coyote/http11/Http11NioProcessor.java @@ -231,27 +231,7 @@ public class Http11NioProcessor extends AbstractHttp11Processor { setRequestLineReadTimeout(); if (!inputBuffer.parseRequestLine(keptAlive)) { - // Haven't finished reading the request so keep the socket - // open - openSocket = true; - // Check to see if we have read any of the request line yet - if (inputBuffer.getParsingRequestLinePhase()<2) { - // No data read, OK to recycle the processor - // Continue to use keep alive timeout - if (keepAliveTimeout>0) { - socketWrapper.setTimeout(keepAliveTimeout); - } - } else { - // Started to read request line. Need to keep processor - // associated with socket - readComplete = false; - } - if (endpoint.isPaused()) { - // 503 - Service unavailable - response.setStatus(503); - adapter.log(request, response, 0); - error = true; - } else { + if (handleIncompleteRequestLineRead()) { break; } } @@ -431,6 +411,35 @@ public class Http11NioProcessor extends AbstractHttp11Processor { @Override + protected boolean handleIncompleteRequestLineRead() { + // Haven't finished reading the request so keep the socket + // open + openSocket = true; + // Check to see if we have read any of the request line yet + if (inputBuffer.getParsingRequestLinePhase()<2) { + // No data read, OK to recycle the processor + // Continue to use keep alive timeout + if (keepAliveTimeout>0) { + socket.setTimeout(keepAliveTimeout); + } + } else { + // Started to read request line. Need to keep processor + // associated with socket + readComplete = false; + } + if (endpoint.isPaused()) { + // 503 - Service unavailable + response.setStatus(503); + adapter.log(request, response, 0); + error = true; + } else { + return true; + } + return false; + } + + + @Override protected void setCometTimeouts(SocketWrapper socketWrapper) { // Comet support SelectionKey key = socketWrapper.getSocket().getIOChannel().keyFor( diff --git a/java/org/apache/coyote/http11/Http11Processor.java b/java/org/apache/coyote/http11/Http11Processor.java index 4e867c7ea..91e40aae6 100644 --- a/java/org/apache/coyote/http11/Http11Processor.java +++ b/java/org/apache/coyote/http11/Http11Processor.java @@ -154,8 +154,6 @@ public class Http11Processor extends AbstractHttp11Processor { keptAlive = socketWrapper.isKeptAlive(); } - int soTimeout = endpoint.getSoTimeout(); - if (disableKeepAlive()) { socketWrapper.setKeepAliveLeft(0); } @@ -167,7 +165,12 @@ public class Http11Processor extends AbstractHttp11Processor { try { setRequestLineReadTimeout(); - inputBuffer.parseRequestLine(false); + if (!inputBuffer.parseRequestLine(false)) { + if (handleIncompleteRequestLineRead()) { + break; + } + } + if (endpoint.isPaused()) { // 503 - Service unavailable response.setStatus(503); @@ -177,7 +180,7 @@ public class Http11Processor extends AbstractHttp11Processor { request.setStartTime(System.currentTimeMillis()); keptAlive = true; // Reset timeout for reading headers - socket.getSocket().setSoTimeout(soTimeout); + socket.getSocket().setSoTimeout(endpoint.getSoTimeout()); inputBuffer.parseHeaders(); if (!disableUploadTimeout) { socket.getSocket().setSoTimeout(connectionUploadTimeout); @@ -382,9 +385,15 @@ public class Http11Processor extends AbstractHttp11Processor { @Override + protected boolean handleIncompleteRequestLineRead() { + // Not used with BIO since it uses blocking reads + return false; + } + + + @Override protected void setCometTimeouts(SocketWrapper socketWrapper) { // NO-OP for BIO - return; } -- 2.11.0