From a94e0287b91f72f4c61db411ba32ac46636c051e Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Fri, 10 Oct 2014 22:30:54 +1100 Subject: [PATCH] 446559 Avoid spin consuming extra data --- .../org/eclipse/jetty/http/HttpParser.java | 53 ++++++++++--------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java index 15120444b05..98516f73faf 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java @@ -1169,8 +1169,9 @@ public class HttpParser while (buffer.remaining()>0 && buffer.get(buffer.position())<=HttpTokens.SPACE) buffer.get(); } - else if (_state==State.CLOSE || _state==State.CLOSED) + else if (_state==State.CLOSE) { + // Seeking EOF if (BufferUtil.hasContent(buffer)) { // Just ignore data when closed @@ -1179,10 +1180,14 @@ public class HttpParser if (_headerBytes>_maxHeaderBytes) { // Don't want to waste time reading data of a closed request - throw new IllegalStateException("too much data when seeking close"); + throw new IllegalStateException("too much data seeking EOF"); } } } + else if (_state==State.CLOSED) + { + BufferUtil.clear(buffer); + } // Handle EOF if (_eof && !buffer.hasRemaining()) @@ -1245,15 +1250,17 @@ public class HttpParser LOG.warn("parse exception: {} in {} for {}",e.toString(),_state,_handler); if (DEBUG) LOG.debug(e); - if (_state.ordinal()<=State.END.ordinal()) + + switch(_state) { - setState(State.CLOSE); - _handler.badMessage(400,null); - } - else - { - _handler.earlyEOF(); - setState(State.CLOSE); + case CLOSED: + break; + case CLOSE: + _handler.earlyEOF(); + break; + default: + setState(State.CLOSE); + _handler.badMessage(400,null); } } catch(Exception|Error e) @@ -1261,16 +1268,17 @@ public class HttpParser BufferUtil.clear(buffer); LOG.warn("parse exception: "+e.toString()+" for "+_handler,e); - - if (_state.ordinal()<=State.END.ordinal()) + + switch(_state) { - setState(State.CLOSE); - _handler.badMessage(400,null); - } - else - { - _handler.earlyEOF(); - setState(State.CLOSE); + case CLOSED: + break; + case CLOSE: + _handler.earlyEOF(); + break; + default: + setState(State.CLOSE); + _handler.badMessage(400,null); } } return false; @@ -1468,13 +1476,8 @@ public class HttpParser LOG.debug("reset {}", this); // reset state - if (_state==State.CLOSED) + if (_state==State.CLOSE || _state==State.CLOSED) return; - if (_state==State.CLOSE) - { - setState(State.CLOSED); - return; - } setState(State.START); _endOfContent=EndOfContent.UNKNOWN_CONTENT;