You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@apache.org on 2001/06/28 08:48:53 UTC

cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/modules/server Http10.java

costin      01/06/27 23:48:53

  Modified:    src/share/org/apache/tomcat/modules/server Http10.java
  Log:
  Fix for multi-line headers ( I didn't tought any browser or client will
  generate such thing, but it seems there is one  - now it should work fine )
  
  Revision  Changes    Path
  1.12      +107 -34   jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Http10.java
  
  Index: Http10.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Http10.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- Http10.java	2001/05/26 18:03:19	1.11
  +++ Http10.java	2001/06/28 06:48:50	1.12
  @@ -119,6 +119,61 @@
   	return sin.read(b, off, len);
       }
   
  +    static class Location {
  +	int off;
  +	int end;
  +	Location(  int start , int end ) {
  +	    this.off=start;
  +	    this.end=end;
  +	}
  +    }
  +
  +    private int readLine( Location line )
  +	throws IOException
  +    {
  +	while (true) {
  +	    line.end=line.off;
  +	    
  +	    int len = buf.length - line.off;
  +	    
  +	    if (len > 0) {
  +		len = readLine(sin, buf, line.off, len);
  +
  +		if (len == -1) {
  +		    return 400;
  +		}
  +	    }
  +	    
  +	    line.end += len;
  +	    
  +	    if (len == 0 || buf[line.end-1] == '\n') {
  +		// strip \n
  +		if( line.end> line.off && buf[line.end-1]=='\n' )
  +		    --line.end;
  +		
  +		// strip off trailing "\r\n"
  +		if (line.end > line.off && buf[line.end-1] == '\r') {
  +		    --line.end;
  +		}
  +		return 0; // Empty line || end of line
  +	    }
  +	    
  +	    // overflowed buffer, so temporarily expand and continue
  +	    
  +	    // XXX DOS - if the length is too big - stop and throw exception
  +	    byte[] tmp = new byte[buf.length * 2];
  +	    
  +	    System.arraycopy(buf, 0, tmp, 0, buf.length);
  +	    buf = tmp;
  +	    // read more ( the buffer was resized )
  +	}
  +    }
  +
  +    Location headerArea=new Location(  off, -1 );
  +
  +    Location line=new Location(  off, -1 );
  +    Location nextLine=new Location( off, -1);
  +    
       /**
        * Reads header fields from the specified servlet input stream until
        * a blank line is encountered.
  @@ -129,48 +184,62 @@
       public int readHeaders( MimeHeaders headers )  throws IOException {
   	// use pre-allocated buffer if possible
   	off = count; // where the request line ended
  -	
  +	headerArea.off=off;
  +	boolean firstLine=true;
  +			
   	while (true) {
  -	    int start = off;
  -
  -	    while (true) {
  -		int len = buf.length - off;
  -
  -		if (len > 0) {
  -		    len = readLine(sin,buf, off, len);
  -
  -		    if (len == -1) {
  -			return 400;
  -		    }
  -		}
  -
  -		off += len;
  -
  -		if (len == 0 || buf[off-1] == '\n') {
  -		    break;
  -		}
  -
  -		// overflowed buffer, so temporarily expand and continue
  -
  -		// XXX DOS - if the length is too big - stop and throw exception
  -		byte[] tmp = new byte[buf.length * 2];
  -
  -		System.arraycopy(buf, 0, tmp, 0, buf.length);
  -		buf = tmp;
  -	    }
  -
  -	    // strip off trailing "\r\n"
  -	    if (--off > start && buf[off-1] == '\r') {
  -		--off;
  +	    if( firstLine ) {
  +		// first line
  +		line.off=off;
  +		
  +		int status=readLine( line );
  +		if( status != 0 ) return status;
  +		
  +		off=line.end;
  +		
  +		if( d > 0 ) debug( "Read1: " + new String( buf, line.off,
  +							   line.end-line.off));
  +		firstLine=false;
  +	    } else {
  +		line.off=nextLine.off;
  +		line.end=nextLine.end;
   	    }
   
  -	    if (off == start) {
  +	    if (line.off == line.end) {
  +		// Empty line, end of headers
   		break;
   	    }
   	    
  +	    // Read next lines, maybe we have a multi-line header
  +	    while( true ) {
  +		nextLine.off=line.end;
  +		int status=readLine( nextLine );
  +		if( status!= 0 ) return status;
  +		if( d > 0 ) debug( "Read2: " +
  +				   new String( buf, nextLine.off,
  +					       nextLine.end-nextLine.off));
  +
  +		off=nextLine.end;
  +
  +		// if continuation, concat with line, and continue
  +		// if a not - break, the current line will be parsed and
  +		// then nextLine will take it's place
  +		if (nextLine.off == nextLine.end) {
  +		    // Empty line, end of headers
  +		    break;
  +		}
  +		char firstB=(char)buf[nextLine.off];
  +		if( firstB != ' ' && firstB != '\t' )
  +		    break; // normal line
  +		line.end=nextLine.end;
  +		if(d>0) debug("Continuation: " + firstB  + " " +
  +			      new String( buf, line.off, line.end-line.off));
  +		// continue reading the next line
  +	    }
  +	    
   	    // XXX this does not currently handle headers which
   	    // are folded to take more than one line.
  -	    if( ! parseHeaderField(headers, buf, start, off - start) ) {
  +	    if( ! parseHeaderField(headers, buf, line.off, line.end - line.off) ) {
   		// error parsing header
   		return 200;
   	    }
  @@ -482,5 +551,9 @@
   	}
       }    
   
  +    private static final int d=0;
  +    private static void debug(String s ) {
  +	System.out.println("Http10: " +s );
  +    }
   
   }
  
  
  

Re: cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/modules/server Http10.java

Posted by cm...@yahoo.com.
On Wed, 27 Jun 2001, Remy Maucherat wrote:

> > costin      01/06/27 23:48:53
> > 
> >   Modified:    src/share/org/apache/tomcat/modules/server Http10.java
> >   Log:
> >   Fix for multi-line headers ( I didn't tought any browser or client will
> >   generate such thing, but it seems there is one 
> 
> Q: Which one ?
> (I never tested multi-line headers)

jaxm

Costin


Re: cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/modules/server Http10.java

Posted by Remy Maucherat <re...@apache.org>.
> costin      01/06/27 23:48:53
> 
>   Modified:    src/share/org/apache/tomcat/modules/server Http10.java
>   Log:
>   Fix for multi-line headers ( I didn't tought any browser or client will
>   generate such thing, but it seems there is one 

Q: Which one ?
(I never tested multi-line headers)

> - now it should work fine )

Remy