--- java/org/apache/catalina/connector/InputBuffer.java (revision 649726) +++ java/org/apache/catalina/connector/InputBuffer.java (working copy) @@ -150,8 +150,14 @@ * Buffer size. */ private int size = -1; + + + /** + * readAheadLimit for mark and reset. + */ + private int readAheadLimit = -1; + - // ----------------------------------------------------------- Constructors @@ -363,6 +369,12 @@ } } + if (markPos >= 0){ + if (cb.getOffset() - markPos > readAheadLimit){ + markPos = -1; + } + } + if (markPos == -1) { cb.setOffset(0); cb.setEnd(0); @@ -466,6 +478,10 @@ if (closed) throw new IOException(sm.getString("inputBuffer.streamClosed")); + if (readAheadLimit < 0){ + throw new IllegalArgumentException(sm.getString("inputBuffer.readAheadLimitNegative")); + } + if (cb.getLength() <= 0) { cb.setOffset(0); cb.setEnd(0); @@ -480,6 +496,7 @@ } cb.setLimit(cb.getStart() + readAheadLimit + size); markPos = cb.getStart(); + this.readAheadLimit = readAheadLimit; } @@ -491,9 +508,7 @@ if (state == CHAR_STATE) { if (markPos < 0) { - cb.recycle(); - markPos = -1; - throw new IOException(); + throw new IOException(sm.getString("inputBuffer.markNotEffective")); } else { cb.setOffset(markPos); } --- java/org/apache/catalina/connector/LocalStrings.properties (revision 649726) +++ java/org/apache/catalina/connector/LocalStrings.properties (working copy) @@ -76,4 +76,6 @@ mapperListener.unregisterContext=Unregister Context {0} mapperListener.registerWrapper=Register Wrapper {0} in Context {1} -inputBuffer.streamClosed=Stream closed +inputBuffer.streamClosed=Stream closed +inputBuffer.readAheadLimitNegative=readAheadLimit value is negative +inputBuffer.markNotEffective=The mark is not effective