remm 00/12/01 19:51:31
Modified: catalina/src/share/org/apache/catalina/connector/http
SocketInputStream.java
Log:
- The IS is now more tolerant when parsing the HTTP header. It now doesn't
require that CRLF to end a line (LF is enough), as is recommended in the
HTTP spec for improved robustness. Note that a client which would do that
is actually not compliant with the spec, and needs to be fixed.
- Removed some old test code.
Revision Changes Path
1.4 +18 -200
jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/SocketInputStream.java
Index: SocketInputStream.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/SocketInputStream.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SocketInputStream.java 2000/11/22 02:28:19 1.3
+++ SocketInputStream.java 2000/12/02 03:51:31 1.4
@@ -1,7 +1,7 @@
/*
- * $Header:
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/SocketInputStream.java,v
1.3 2000/11/22 02:28:19 remm Exp $
- * $Revision: 1.3 $
- * $Date: 2000/11/22 02:28:19 $
+ * $Header:
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/SocketInputStream.java,v
1.4 2000/12/02 03:51:31 remm Exp $
+ * $Revision: 1.4 $
+ * $Date: 2000/12/02 03:51:31 $
*
* ====================================================================
*
@@ -164,13 +164,13 @@
// Checking for a blank line
int chr = 0;
- while ((chr = read()) == CR) { // Skipping CR
- read(); // Skipping LF
- }
+ do { // Skipping CR or LF
+ chr = read();
+ } while ((chr == CR) || (chr == LF));
if (chr == -1)
throw new EOFException
(sm.getString("requestStream.readline.error"));
- if (chr != CR) {
+ if ((chr != CR) || (chr != LF)) {
pos--;
}
@@ -263,8 +263,6 @@
readStart = pos;
readCount = 0;
- int crPos = -2;
-
boolean eol = false;
while (!eol) {
@@ -285,12 +283,6 @@
if (pos >= count) {
// Copying part (or all) of the internal buffer to the line
// buffer
- if (pos != readStart) {
- // Hack to reintialize the internal buffer. We pretend the
- // first character was never read and we'll reread it from
- // the buffer.
- crPos = crPos - count;
- }
int val = read();
if (val == -1)
throw new IOException
@@ -299,17 +291,17 @@
readStart = 0;
}
if (buf[pos] == CR) {
- // We found a CR. Next character has to be a LF.
- crPos = pos;
- } else if ((buf[pos] == LF) && (crPos == (pos - 1))) {
+ // Skip CR.
+ } else if (buf[pos] == LF) {
eol = true;
+ } else {
+ requestLine.protocol[readCount] = (char) buf[pos];
+ readCount++;
}
- requestLine.protocol[readCount] = (char) buf[pos];
- readCount++;
pos++;
}
- requestLine.protocolEnd = readCount - 2;
+ requestLine.protocolEnd = readCount;
}
@@ -332,8 +324,10 @@
header.recycle();
// Checking for a blank line
- if (read() == CR) { // Skipping CR
- read(); // Skipping LF
+ int chr = read();
+ if ((chr == CR) || (chr == LF)) { // Skipping CR
+ if (chr == CR)
+ read(); // Skipping LF
header.nameEnd = 0;
header.valueEnd = 0;
return;
@@ -441,12 +435,6 @@
if (pos >= count) {
// Copying part (or all) of the internal buffer to the line
// buffer
- if (pos != readStart) {
- // Hack to reintialize the internal buffer.
- // We pretend the first character was never read and
- // we'll reread it from the buffer.
- crPos = crPos - count;
- }
int val = read();
if (val == -1)
throw new IOException
@@ -455,9 +443,7 @@
readStart = 0;
}
if (buf[pos] == CR) {
- // We found a CR. Next character has to be a LF.
- crPos = pos;
- } else if ((buf[pos] == LF) && (crPos == (pos - 1))) {
+ } else if (buf[pos] == LF) {
eol = true;
} else {
// FIXME : Check if binary conversion is working fine
@@ -495,174 +481,6 @@
header.valueEnd = readCount;
}
-
-
- /**
- * Read a line, and copies it to the given buffer. This function is meant
- * to be used during the HTTP request header parsing. Do NOT attempt to
- * read the request body using it.
- *
- * @param buffer char buffer
- * @return the number of bytes read
- * @throws IOException If an exception occurs during the underlying socket
- * read operations, or if the given buffer is not big enough to accomodate
- * the whole line.
- */
- public int readLine(char[] buffer)
- throws IOException {
- return readLine(buffer, 0);
- }
-
-
- /**
- * Read a line, and copies it to the given buffer. This function is meant
- * to be used during the HTTP request header parsing. Do NOT attempt to
- * read the request body using it. Read data must be US-ASCII.
- *
- * @param buffer char buffer
- * @param startPos position in the buffer from which the read character
- * will be copied
- * @return the number of bytes read
- * @throws IOException If an exception occurs during the underlying socket
- * read operations, or if the given buffer is not big enough to accomodate
- * the whole line.
- */
- public int readLine(char[] buffer, int startPos)
- throws IOException {
- int maxRead = buffer.length - startPos;
- int readStart = pos;
- int readCount = 0;
- int bufferPos = startPos;
-
- int crPos = -2;
-
- boolean eol = false;
-
- while (!eol && (readCount < maxRead)) {
-
- // We're at the end of the internal buffer
- if (pos >= count) {
- // Copying part (or all) of the internal buffer to the line
- // buffer
- if (pos != readStart) {
- // Hack to reintialize the internal buffer. We pretend the
- // first character was never read and we'll reread it from
- // the buffer.
- crPos = crPos - count;
- }
- int val = read();
- if (val == -1)
- throw new IOException
- (sm.getString("requestStream.readline.error"));
- pos = 0;
- readStart = 0;
- }
- if (buf[pos] == CR) {
- // We found a CR. Next character has to be a LF.
- crPos = pos;
- } else if ((buf[pos] == LF) && (crPos == (pos - 1))) {
- eol = true;
- }
- buffer[startPos + readCount] = (char) buf[pos];
- readCount++;
- pos++;
- }
-
- if (readCount == maxRead)
- throw new IOException
- (sm.getString("requestStream.readline.toolong"));
-
- return readCount - 2;
- }
-
-
- /**
- * Read a line, and copies it to the given buffer. This function is meant
- * to be used during the HTTP request header parsing. Do NOT attempt to
- * read the request body using it.
- *
- * @param buffer byte buffer
- * @return the number of bytes read
- * @throws IOException If an exception occurs during the underlying socket
- * read operations, or if the given buffer is not big enough to accomodate
- * the whole line.
- */
- public int readLine(byte[] buffer)
- throws IOException {
- return readLine(buffer, 0);
- }
-
-
- /**
- * Read a line, and copies it to the given buffer. This function is meant
- * to be used during the HTTP request header parsing. Do NOT attempt to
- * read the request body using it.
- *
- * @param buffer byte buffer
- * @param startPos position in the buffer from which the read character
- * will be copied
- * @return the number of bytes read
- * @throws IOException If an exception occurs during the underlying socket
- * read operations, or if the given buffer is not big enough to accomodate
- * the whole line.
- */
- public int readLine(byte[] buffer, int startPos)
- throws IOException {
- int maxRead = buffer.length - startPos;
- int readStart = pos;
- int readCount = 0;
- int bufferPos = startPos;
-
- int crPos = -2;
-
- boolean eol = false;
-
- while (!eol && (readCount < maxRead)) {
-
- // We're at the end of the internal buffer
- if (pos >= count) {
- // Copying part (or all) of the internal buffer to the line
- // buffer
- if (pos != readStart) {
- System.arraycopy(buf, readStart, buffer, bufferPos,
- pos - readStart);
- // Hack to reintialize the internal buffer. We pretend the
- // first character was never read and we'll reread it from
- // the buffer.
- crPos = crPos - count;
- bufferPos += pos - readStart;
- }
- int val = read();
- if (val == -1)
- throw new IOException
- (sm.getString("requestStream.readline.error"));
- pos = 0;
- readStart = 0;
- }
- if (buf[pos] == CR) {
- // We found a CR. Next character has to be a LF.
- crPos = pos;
- } else if ((buf[pos] == LF) && (crPos == (pos - 1))) {
- eol = true;
- // Copy the line from the buffer
- if ((pos - 1 - readStart) > 0)
- System.arraycopy
- (buf, readStart, buffer, bufferPos,
- pos - 1 - readStart);
- }
- readCount++;
- pos++;
- }
-
- if (readCount == maxRead)
- throw new IOException
- (sm.getString("requestStream.readline.toolong"));
-
- return readCount - 2;
- }
-
-
- // ------------------------------------------------------ Protected Methods
}