You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2015/01/15 11:48:53 UTC
svn commit: r1652041 - /tomcat/trunk/java/org/apache/coyote/http11/
Author: markt
Date: Thu Jan 15 10:48:52 2015
New Revision: 1652041
URL: http://svn.apache.org/r1652041
Log:
Merge identical InputBuffer implementations into the abstract base class.
Removed:
tomcat/trunk/java/org/apache/coyote/http11/InternalAprInputBuffer.java
tomcat/trunk/java/org/apache/coyote/http11/InternalNio2InputBuffer.java
tomcat/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java
Modified:
tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
tomcat/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java
tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java
tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Processor.java
tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
Modified: tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java?rev=1652041&r1=1652040&r2=1652041&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java Thu Jan 15 10:48:52 2015
@@ -72,7 +72,7 @@ public abstract class AbstractHttp11Proc
/**
* Input.
*/
- protected AbstractInputBuffer<S> inputBuffer;
+ protected AbstractInputBuffer inputBuffer;
/**
@@ -615,7 +615,7 @@ public abstract class AbstractHttp11Proc
* Exposes input buffer to super class to allow better code re-use.
* @return The input buffer used by the processor.
*/
- protected AbstractInputBuffer<S> getInputBuffer() {
+ protected AbstractInputBuffer getInputBuffer() {
return inputBuffer;
}
@@ -774,9 +774,7 @@ public abstract class AbstractHttp11Proc
InputFilter savedBody = new SavedRequestInputFilter(body);
savedBody.setRequest(request);
- @SuppressWarnings("unchecked")
- AbstractInputBuffer<S> internalBuffer = (AbstractInputBuffer<S>)
- request.getInputBuffer();
+ AbstractInputBuffer internalBuffer = (AbstractInputBuffer) request.getInputBuffer();
internalBuffer.addActiveFilter(savedBody);
break;
}
Modified: tomcat/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java?rev=1652041&r1=1652040&r2=1652041&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java Thu Jan 15 10:48:52 2015
@@ -23,6 +23,7 @@ import java.nio.charset.StandardCharsets
import org.apache.coyote.InputBuffer;
import org.apache.coyote.Request;
import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.util.buf.ByteChunk;
import org.apache.tomcat.util.buf.MessageBytes;
import org.apache.tomcat.util.http.MimeHeaders;
@@ -30,15 +31,22 @@ import org.apache.tomcat.util.net.Abstra
import org.apache.tomcat.util.net.SocketWrapperBase;
import org.apache.tomcat.util.res.StringManager;
-public abstract class AbstractInputBuffer<S> implements InputBuffer{
+/**
+ * InputBuffer for HTTP that provides request header parsing as well as transfer
+ * encoding.
+ *
+ * <S> The type of socket used by the underlying I/O implementation
+ */
+public class AbstractInputBuffer implements InputBuffer {
// -------------------------------------------------------------- Constants
+ private static final Log log = LogFactory.getLog(AbstractInputBuffer.class);
+
/**
* The string manager for this package.
*/
- protected static final StringManager sm =
- StringManager.getManager(Constants.Package);
+ protected static final StringManager sm = StringManager.getManager(AbstractInputBuffer.class);
protected static final boolean[] HTTP_TOKEN_CHAR = new boolean[128];
@@ -143,6 +151,12 @@ public abstract class AbstractInputBuffe
/**
+ * Wrapper that provides access to the underlying socket.
+ */
+ protected SocketWrapperBase<?> wrapper;
+
+
+ /**
* Underlying input buffer.
*/
protected InputBuffer inputStreamInputBuffer;
@@ -213,6 +227,8 @@ public abstract class AbstractInputBuffe
headerParsePos = HeaderParsePosition.HEADER_START;
headerData.recycle();
swallowInput = true;
+
+ inputStreamInputBuffer = new SocketInputBuffer();
}
@@ -245,9 +261,7 @@ public abstract class AbstractInputBuffe
* Get filters.
*/
public InputFilter[] getFilters() {
-
return filterLibrary;
-
}
@@ -269,7 +283,6 @@ public abstract class AbstractInputBuffe
activeFilters[++lastActiveFilter] = filter;
filter.setRequest(request);
-
}
@@ -287,8 +300,7 @@ public abstract class AbstractInputBuffe
* Read some bytes.
*/
@Override
- public int doRead(ByteChunk chunk, Request req)
- throws IOException {
+ public int doRead(ByteChunk chunk, Request req) throws IOException {
if (lastActiveFilter == -1)
return inputStreamInputBuffer.doRead(chunk, req);
@@ -298,22 +310,6 @@ public abstract class AbstractInputBuffe
}
- // ------------------------------------------------------- Abstract Methods
-
- /**
- * Attempts to read some data into the input buffer.
- *
- * @return <code>true</code> if more data was added to the input buffer
- * otherwise <code>false</code>
- */
- protected abstract boolean fill(boolean block) throws IOException;
-
- protected abstract void init(SocketWrapperBase<S> socketWrapper,
- AbstractEndpoint<S> endpoint) throws IOException;
-
- protected abstract Log getLog();
-
-
// --------------------------------------------------------- Public Methods
/**
@@ -321,6 +317,7 @@ public abstract class AbstractInputBuffe
* connection.
*/
public void recycle() {
+ wrapper = null;
request.recycle();
for (int i = 0; i <= lastActiveFilter; i++) {
@@ -431,8 +428,8 @@ public abstract class AbstractInputBuffe
parsingRequestLineStart = pos;
parsingRequestLinePhase = 2;
- if (getLog().isDebugEnabled()) {
- getLog().debug("Received ["
+ if (log.isDebugEnabled()) {
+ log.debug("Received ["
+ new String(buf, pos, lastValid - pos,
StandardCharsets.ISO_8859_1)
+ "]");
@@ -626,7 +623,7 @@ public abstract class AbstractInputBuffe
sm.getString("iib.requestheadertoolarge.error"));
}
// Should not happen
- getLog().warn("Expanding buffer size. Old size: " + buf.length
+ log.warn("Expanding buffer size. Old size: " + buf.length
+ ", new size: " + newsize, new Exception());
byte[] tmp = new byte[newsize];
System.arraycopy(buf,0,tmp,0,buf.length);
@@ -668,8 +665,8 @@ public abstract class AbstractInputBuffe
fill(false);
available = lastValid - pos;
} catch (IOException ioe) {
- if (getLog().isDebugEnabled()) {
- getLog().debug(sm.getString("iib.available.readFail"), ioe);
+ if (log.isDebugEnabled()) {
+ log.debug(sm.getString("iib.available.readFail"), ioe);
}
// Not ideal. This will indicate that data is available which should
// trigger a read which in turn will trigger another IOException and
@@ -728,6 +725,49 @@ public abstract class AbstractInputBuffe
}
+ // -------------------------------------------------------- Protected Methods
+
+ /**
+ * Attempts to read some data into the input buffer.
+ *
+ * @return <code>true</code> if more data was added to the input buffer
+ * otherwise <code>false</code>
+ */
+ protected boolean fill(boolean block) throws IOException {
+
+ if (parsingHeader) {
+ if (lastValid > headerBufferSize) {
+ throw new IllegalArgumentException
+ (sm.getString("iib.requestheadertoolarge.error"));
+ }
+ } else {
+ lastValid = pos = end;
+ }
+
+ int nRead = wrapper.read(block, buf, pos, buf.length - pos);
+ if (nRead > 0) {
+ lastValid = pos + nRead;
+ return true;
+ }
+
+ return false;
+ }
+
+
+ protected void init(SocketWrapperBase<?> socketWrapper,
+ AbstractEndpoint<?> endpoint) throws IOException {
+
+ wrapper = socketWrapper;
+
+ int bufLength = headerBufferSize +
+ wrapper.getSocketBufferHandler().getReadBuffer().capacity();
+ if (buf == null || buf.length < bufLength) {
+ buf = new byte[bufLength];
+ }
+ }
+
+
+
// --------------------------------------------------------- Private Methods
/**
@@ -938,8 +978,8 @@ public abstract class AbstractInputBuffe
pos++;
}
- if (getLog().isDebugEnabled()) {
- getLog().debug(sm.getString("iib.invalidheader", new String(buf,
+ if (log.isDebugEnabled()) {
+ log.debug(sm.getString("iib.invalidheader", new String(buf,
headerData.start,
headerData.lastSignificantChar - headerData.start + 1,
StandardCharsets.ISO_8859_1)));
@@ -1032,4 +1072,33 @@ public abstract class AbstractInputBuffe
headerValue = null;
}
}
+
+
+ // ------------------------------------- InputStreamInputBuffer Inner Class
+
+ /**
+ * This class is an input buffer which will read its data from an input
+ * stream.
+ */
+ protected class SocketInputBuffer implements InputBuffer {
+
+ /**
+ * Read bytes into the specified chunk.
+ */
+ @Override
+ public int doRead(ByteChunk chunk, Request req )
+ throws IOException {
+
+ if (pos >= lastValid) {
+ if (!fill(true))
+ return -1;
+ }
+
+ int length = lastValid - pos;
+ chunk.setBytes(buf, pos, length);
+ pos = lastValid;
+
+ return length;
+ }
+ }
}
Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java?rev=1652041&r1=1652040&r2=1652041&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java Thu Jan 15 10:48:52 2015
@@ -58,7 +58,7 @@ public class Http11AprProcessor extends
super(endpoint);
- inputBuffer = new InternalAprInputBuffer(request, headerBufferSize);
+ inputBuffer = new AbstractInputBuffer(request, headerBufferSize);
request.setInputBuffer(getInputBuffer());
outputBuffer = new Http11OutputBuffer(response, headerBufferSize);
Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Processor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Processor.java?rev=1652041&r1=1652040&r2=1652041&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Processor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Processor.java Thu Jan 15 10:48:52 2015
@@ -62,7 +62,7 @@ public class Http11Nio2Processor extends
super(endpoint);
- inputBuffer = new InternalNio2InputBuffer(request, maxHttpHeaderSize);
+ inputBuffer = new AbstractInputBuffer(request, maxHttpHeaderSize);
request.setInputBuffer(getInputBuffer());
outputBuffer = new Http11OutputBuffer(response, maxHttpHeaderSize);
Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java?rev=1652041&r1=1652040&r2=1652041&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java Thu Jan 15 10:48:52 2015
@@ -63,7 +63,7 @@ public class Http11NioProcessor extends
super(endpoint);
- inputBuffer = new InternalNioInputBuffer(request, maxHttpHeaderSize);
+ inputBuffer = new AbstractInputBuffer(request, maxHttpHeaderSize);
request.setInputBuffer(getInputBuffer());
outputBuffer = new Http11OutputBuffer(response, maxHttpHeaderSize);
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org