From: markt Date: Wed, 13 Oct 2010 21:16:33 +0000 (+0000) Subject: Fix reading the request line via NIO for slow clients (such as me typing via telnet... X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=9a9b4af942a0546d85d047c6940599a44726bc5d;p=tomcat7.0 Fix reading the request line via NIO for slow clients (such as me typing via telnet). Need to treat each section of the request line (text or space) as a separate phase. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1022293 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/coyote/http11/InternalNioInputBuffer.java b/java/org/apache/coyote/http11/InternalNioInputBuffer.java index 7685c4813..90e44eca9 100644 --- a/java/org/apache/coyote/http11/InternalNioInputBuffer.java +++ b/java/org/apache/coyote/http11/InternalNioInputBuffer.java @@ -262,7 +262,6 @@ public class InternalNioInputBuffer extends AbstractInputBuffer { } pos++; } - parsingRequestLineStart = pos; parsingRequestLinePhase = 3; } if ( parsingRequestLinePhase == 3 ) { @@ -280,13 +279,17 @@ public class InternalNioInputBuffer extends AbstractInputBuffer { space = false; } } - + parsingRequestLineStart = pos; + parsingRequestLinePhase = 4; + } + if (parsingRequestLinePhase == 4) { // Mark the current buffer position int end = 0; // // Reading the URI // + boolean space = false; while (!space) { // Read new bytes if needed if (pos >= lastValid) { @@ -316,10 +319,9 @@ public class InternalNioInputBuffer extends AbstractInputBuffer { } else { request.requestURI().setBytes(buf, parsingRequestLineStart, end - parsingRequestLineStart); } - parsingRequestLineStart = pos; - parsingRequestLinePhase = 4; + parsingRequestLinePhase = 5; } - if ( parsingRequestLinePhase == 4 ) { + if ( parsingRequestLinePhase == 5 ) { // Spec says single SP but also be tolerant of multiple and/or HT boolean space = true; while (space) { @@ -334,7 +336,10 @@ public class InternalNioInputBuffer extends AbstractInputBuffer { space = false; } } - + parsingRequestLineStart = pos; + parsingRequestLinePhase = 6; + } + if (parsingRequestLinePhase == 6) { // Mark the current buffer position end = 0;