remm 01/01/22 19:53:01 Modified: catalina/src/share/org/apache/catalina/connector/http HttpConnector.java HttpProcessor.java HttpRequestStream.java SocketInputStream.java Log: - Backports : - SIS doesn't extend BufferedInputStream. - Fix for a chunking bug in HttpRequestStream. Revision Changes Path 1.8 +6 -5 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpConnector.java Index: HttpConnector.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpConnector.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- HttpConnector.java 2001/01/11 01:40:27 1.7 +++ HttpConnector.java 2001/01/23 03:53:00 1.8 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpConnector.java,v 1.7 2001/01/11 01:40:27 remm Exp $ - * $Revision: 1.7 $ - * $Date: 2001/01/11 01:40:27 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpConnector.java,v 1.8 2001/01/23 03:53:00 remm Exp $ + * $Revision: 1.8 $ + * $Date: 2001/01/23 03:53:00 $ * * ==================================================================== * @@ -94,7 +94,7 @@ * * @author Craig R. McClanahan * @author Remy Maucherat - * @version $Revision: 1.7 $ $Date: 2001/01/11 01:40:27 $ + * @version $Revision: 1.8 $ $Date: 2001/01/23 03:53:00 $ */ @@ -762,7 +762,8 @@ Socket socket = null; try { socket = serverSocket.accept(); - socket.setSoTimeout(connectionTimeout); + if (connectionTimeout > 0) + socket.setSoTimeout(connectionTimeout); } catch (IOException e) { if (started && !stopped) log("accept: ", e); 1.20 +4 -4 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpProcessor.java Index: HttpProcessor.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpProcessor.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- HttpProcessor.java 2000/12/23 19:39:54 1.19 +++ HttpProcessor.java 2001/01/23 03:53:00 1.20 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpProcessor.java,v 1.19 2000/12/23 19:39:54 craigmcc Exp $ - * $Revision: 1.19 $ - * $Date: 2000/12/23 19:39:54 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpProcessor.java,v 1.20 2001/01/23 03:53:00 remm Exp $ + * $Revision: 1.20 $ + * $Date: 2001/01/23 03:53:00 $ * * ==================================================================== * @@ -107,7 +107,7 @@ * * @author Craig R. McClanahan * @author Remy Maucherat - * @version $Revision: 1.19 $ $Date: 2000/12/23 19:39:54 $ + * @version $Revision: 1.20 $ $Date: 2001/01/23 03:53:00 $ */ final class HttpProcessor 1.7 +109 -52 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpRequestStream.java Index: HttpRequestStream.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpRequestStream.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- HttpRequestStream.java 2000/12/14 07:49:16 1.6 +++ HttpRequestStream.java 2001/01/23 03:53:00 1.7 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpRequestStream.java,v 1.6 2000/12/14 07:49:16 remm Exp $ - * $Revision: 1.6 $ - * $Date: 2000/12/14 07:49:16 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpRequestStream.java,v 1.7 2001/01/23 03:53:00 remm Exp $ + * $Revision: 1.7 $ + * $Date: 2001/01/23 03:53:00 $ * * ==================================================================== * @@ -202,56 +202,8 @@ if ((chunkBuffer == null) || (chunkPos >= chunkLength)) { - - chunkPos = 0; - - try { - chunkLength = - Integer.parseInt(readLineFromStream().trim(), 16); - } catch (NumberFormatException e) { - // Critical error, unable to parse the chunk length - chunkLength = 0; - chunk = false; - close(); - return -1; - } - - if (chunkLength == 0) { - - // Skipping trailing headers, if any - String trailingLine = readLineFromStream(); - while (!trailingLine.equals("")) - trailingLine = readLineFromStream(); - endChunk = true; + if (!fillChunkBuffer()) return (-1); - // TODO : Should the stream be automatically closed ? - - } else { - - if ((chunkBuffer == null) - || (chunkLength > chunkBuffer.length)) - chunkBuffer = new byte[chunkLength]; - - // Now read the whole chunk into the buffer - - int nbRead = 0; - int currentRead = 0; - - while (nbRead < chunkLength) { - currentRead = - stream.read(chunkBuffer, nbRead, - chunkLength - nbRead); - if (currentRead == -1) - throw new IOException - (sm.getString("requestStream.read.error")); - nbRead += currentRead; - } - - // Skipping the CRLF - readLineFromStream(); - - } - } return (chunkBuffer[chunkPos++]); @@ -265,7 +217,112 @@ } + /** + * Read up to <code>len</code> bytes of data from the input stream + * into an array of bytes. An attempt is made to read as many as + * <code>len</code> bytes, but a smaller number may be read, + * possibly zero. The number of bytes actually read is returned as + * an integer. This method blocks until input data is available, + * end of file is detected, or an exception is thrown. + * + * @param b The buffer into which the data is read + * @param off The start offset into array <code>b</code> at which + * the data is written + * @param len The maximum number of bytes to read + * + * @exception IOException if an input/output error occurs + */ + public int read(byte b[], int off, int len) throws IOException { + if (chunk) { + + int avail = chunkLength - chunkPos; + if (avail == 0) + fillChunkBuffer(); + avail = chunkLength - chunkPos; + if (avail == 0) + return (-1); + + int toCopy = avail; + if (avail > len) + toCopy = len; + System.arraycopy(chunkBuffer, chunkPos, b, off, toCopy); + chunkPos += toCopy; + return toCopy; + + } else { + return super.read(b, off, len); + } + } + + // -------------------------------------------------------- Private Methods + + + /** + * Fill the chunk buffer. + */ + private synchronized boolean fillChunkBuffer() + throws IOException { + + chunkPos = 0; + + try { + String numberValue = readLineFromStream().trim(); + chunkLength = + Integer.parseInt(numberValue, 16); + } catch (NumberFormatException e) { + // Critical error, unable to parse the chunk length + chunkLength = 0; + chunk = false; + close(); + return false; + } + + if (chunkLength == 0) { + + // Skipping trailing headers, if any + String trailingLine = readLineFromStream(); + while (!trailingLine.equals("")) + trailingLine = readLineFromStream(); + endChunk = true; + return false; + // TODO : Should the stream be automatically closed ? + + } else { + + if ((chunkBuffer == null) + || (chunkLength > chunkBuffer.length)) + chunkBuffer = new byte[chunkLength]; + + // Now read the whole chunk into the buffer + + int nbRead = 0; + int currentRead = 0; + + while (nbRead < chunkLength) { + try { + currentRead = + stream.read(chunkBuffer, nbRead, + chunkLength - nbRead); + } catch (Throwable t) { + t.printStackTrace(); + throw new IOException(); + } + if (currentRead < 0) { + throw new IOException + (sm.getString("requestStream.read.error")); + } + nbRead += currentRead; + } + + // Skipping the CRLF + String blank = readLineFromStream(); + + } + + return true; + + } /** 1.6 +107 -10 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.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- SocketInputStream.java 2001/01/04 19:49:20 1.5 +++ SocketInputStream.java 2001/01/23 03:53:00 1.6 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/SocketInputStream.java,v 1.5 2001/01/04 19:49:20 remm Exp $ - * $Revision: 1.5 $ - * $Date: 2001/01/04 19:49:20 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/SocketInputStream.java,v 1.6 2001/01/23 03:53:00 remm Exp $ + * $Revision: 1.6 $ + * $Date: 2001/01/23 03:53:00 $ * * ==================================================================== * @@ -65,18 +65,17 @@ package org.apache.catalina.connector.http; import java.io.IOException; -import java.io.BufferedInputStream; import java.io.InputStream; import java.io.EOFException; import org.apache.catalina.util.StringManager; /** - * Extends BufferedInputStream to be more efficient reading lines during HTTP + * Extends InputStream to be more efficient reading lines during HTTP * header processing. * * @author <a href="mailto:[EMAIL PROTECTED]">Remy Maucherat</a> */ -public class SocketInputStream extends BufferedInputStream { +public class SocketInputStream extends InputStream { // -------------------------------------------------------------- Constants @@ -112,6 +111,30 @@ private static final int LC_OFFSET = 'A' - 'a'; + /** + * Internal buffer. + */ + protected byte buf[]; + + + /** + * Last valid byte. + */ + protected int count; + + + /** + * Position in the buffer. + */ + protected int pos; + + + /** + * Underlying input stream. + */ + protected InputStream is; + + // ----------------------------------------------------------- Constructors @@ -124,7 +147,8 @@ */ public SocketInputStream(InputStream is, int bufferSize) { - super(is, bufferSize); + this.is = is; + buf = new byte[bufferSize]; } @@ -174,9 +198,7 @@ if (chr == -1) throw new EOFException (sm.getString("requestStream.readline.error")); - if ((chr != CR) || (chr != LF)) { - pos--; - } + pos--; // Reading the method name @@ -484,6 +506,81 @@ header.valueEnd = readCount; + } + + + /** + * Read byte. + */ + public int read() + throws IOException { + if (pos >= count) { + fill(); + if (pos >= count) + return -1; + } + return buf[pos++] & 0xff; + } + + + /** + * + */ + /* + public int read(byte b[], int off, int len) + throws IOException { + + } + */ + + + /** + * + */ + /* + public long skip(long n) + throws IOException { + + } + */ + + + /** + * Returns the number of bytes that can be read from this input + * stream without blocking. + */ + public int available() + throws IOException { + return (count - pos) + is.available(); + } + + + /** + * Close the input stream. + */ + public void close() + throws IOException { + if (is == null) + return; + is.close(); + is = null; + buf = null; + } + + + // ------------------------------------------------------ Protected Methods + + + /** + * Fill the internal buffer using data from the undelying input stream. + */ + protected void fill() + throws IOException { + pos = 0; + count = 0; + int nRead = is.read(buf, 0, buf.length); + if (nRead > 0) + count = nRead; } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, email: [EMAIL PROTECTED]