this.request = request;\r
headers = request.getMimeHeaders();\r
\r
- headerBuffer1 = new byte[headerBufferSize];\r
- headerBuffer2 = new byte[headerBufferSize];\r
- bodyBuffer = new byte[headerBufferSize];\r
- buf = headerBuffer1;\r
- bbuf = ByteBuffer.allocateDirect(headerBufferSize);\r
-\r
- headerBuffer = new char[headerBufferSize];\r
- ascbuf = headerBuffer;\r
+ buf = new byte[headerBufferSize];\r
+ if (headerBufferSize < (8 * 1024)) {\r
+ bbuf = ByteBuffer.allocateDirect(6 * 1500);\r
+ } else {\r
+ bbuf = ByteBuffer.allocateDirect((headerBufferSize / 1500 + 1) * 1500);\r
+ }\r
\r
inputStreamInputBuffer = new SocketInputBuffer();\r
\r
\r
\r
/**\r
- * Pointer to the US-ASCII header buffer.\r
- */\r
- protected char[] ascbuf;\r
-\r
-\r
- /**\r
* Last valid byte.\r
*/\r
protected int lastValid;\r
\r
\r
/**\r
- * HTTP header buffer no 1.\r
- */\r
- protected byte[] headerBuffer1;\r
-\r
-\r
- /**\r
- * HTTP header buffer no 2.\r
- */\r
- protected byte[] headerBuffer2;\r
-\r
-\r
- /**\r
- * HTTP body buffer.\r
+ * Pos of the end of the header in the buffer, which is also the\r
+ * start of the body.\r
*/\r
- protected byte[] bodyBuffer;\r
-\r
-\r
- /**\r
- * US-ASCII header buffer.\r
- */\r
- protected char[] headerBuffer;\r
+ protected int end;\r
\r
\r
/**\r
request.recycle();\r
\r
socket = 0;\r
- buf = headerBuffer1;\r
lastValid = 0;\r
pos = 0;\r
lastActiveFilter = -1;\r
// Recycle Request object\r
request.recycle();\r
\r
- // Determine the header buffer used for next request\r
- byte[] newHeaderBuf = null;\r
- if (buf == headerBuffer1) {\r
- newHeaderBuf = headerBuffer2;\r
- } else {\r
- newHeaderBuf = headerBuffer1;\r
+ //System.out.println("LV-pos: " + (lastValid - pos));\r
+ // Copy leftover bytes to the beginning of the buffer\r
+ if (lastValid - pos > 0) {\r
+ int npos = 0;\r
+ int opos = pos;\r
+ while (lastValid - opos > opos - npos) {\r
+ System.arraycopy(buf, opos, buf, npos, opos - npos);\r
+ npos += pos;\r
+ opos += pos;\r
+ }\r
+ System.arraycopy(buf, opos, buf, npos, lastValid - opos);\r
}\r
-\r
- // Copy leftover bytes from buf to newHeaderBuf\r
- System.arraycopy(buf, pos, newHeaderBuf, 0, lastValid - pos);\r
-\r
- // Swap buffers\r
- buf = newHeaderBuf;\r
-\r
+ \r
// Recycle filters\r
for (int i = 0; i <= lastActiveFilter; i++) {\r
activeFilters[i].recycle();\r
throw new EOFException(sm.getString("iib.eof.error"));\r
}\r
\r
- ascbuf[pos] = (char) buf[pos];\r
-\r
if (buf[pos] == Constants.SP) {\r
space = true;\r
- request.method().setChars(ascbuf, start, pos - start);\r
+ request.method().setBytes(buf, start, pos - start);\r
}\r
\r
pos++;\r
throw new EOFException(sm.getString("iib.eof.error"));\r
}\r
\r
- ascbuf[pos] = (char) buf[pos];\r
-\r
if (buf[pos] == Constants.CR) {\r
end = pos;\r
} else if (buf[pos] == Constants.LF) {\r
}\r
\r
if ((end - start) > 0) {\r
- request.protocol().setChars(ascbuf, start, end - start);\r
+ request.protocol().setBytes(buf, start, end - start);\r
} else {\r
request.protocol().setString("");\r
}\r
}\r
\r
parsingHeader = false;\r
+ end = pos;\r
\r
}\r
\r
\r
if (buf[pos] == Constants.COLON) {\r
colon = true;\r
- headerValue = headers.addValue(ascbuf, start, pos - start);\r
+ headerValue = headers.addValue(buf, start, pos - start);\r
}\r
chr = buf[pos];\r
if ((chr >= Constants.A) && (chr <= Constants.Z)) {\r
buf[pos] = (byte) (chr - Constants.LC_OFFSET);\r
}\r
\r
- ascbuf[pos] = (char) buf[pos];\r
-\r
pos++;\r
\r
}\r
}\r
\r
bbuf.clear();\r
- nRead = Socket.recvbb\r
- (socket, 0, buf.length - lastValid);\r
+ nRead = Socket.recvbb(socket, 0, buf.length - lastValid);\r
if (nRead > 0) {\r
bbuf.limit(nRead);\r
bbuf.get(buf, pos, nRead);\r
\r
} else {\r
\r
- buf = bodyBuffer;\r
- pos = 0;\r
- lastValid = 0;\r
+ if (buf.length - end < 4500) {\r
+ // In this case, the request header was really large, so we allocate a \r
+ // brand new one; the old one will get GCed when subsequent requests\r
+ // clear all references\r
+ buf = new byte[buf.length];\r
+ end = 0;\r
+ }\r
+ pos = end;\r
+ lastValid = pos;\r
bbuf.clear();\r
- nRead = Socket.recvbb\r
- (socket, 0, buf.length);\r
+ nRead = Socket.recvbb(socket, 0, buf.length - lastValid);\r
if (nRead > 0) {\r
bbuf.limit(nRead);\r
- bbuf.get(buf, 0, nRead);\r
- lastValid = nRead;\r
+ bbuf.get(buf, pos, nRead);\r
+ lastValid = pos + nRead;\r
} else {\r
throw new IOException(sm.getString("iib.failedread"));\r
}\r