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 2004/08/12 23:46:41 UTC

cvs commit: jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf Ascii.java ByteChunk.java MessageBytes.java

markt       2004/08/12 14:46:41

  Modified:    coyote/src/java/org/apache/coyote Request.java
               http11/src/java/org/apache/coyote/http11
                        Http11Processor.java
               http11/src/java/org/apache/coyote/http11/filters
                        IdentityInputFilter.java
               util/java/org/apache/tomcat/util/buf Ascii.java
                        ByteChunk.java MessageBytes.java
  Log:
  Fix bug 30152. Support content-length greater than Integer.MAX_VALUE.
   - Limit is now Long.MAX_VALUE
   - Only tested in simulation, not with a POST bigger than Integer.MAX_VALUE
  
  Revision  Changes    Path
  1.30      +11 -3     jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/Request.java
  
  Index: Request.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/Request.java,v
  retrieving revision 1.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- Request.java	12 Aug 2004 19:48:05 -0000	1.29
  +++ Request.java	12 Aug 2004 21:46:41 -0000	1.30
  @@ -134,7 +134,7 @@
       /**
        * HTTP specific fields. (remove them ?)
        */
  -    private int contentLength = -1;
  +    private long contentLength = -1;
       private MessageBytes contentTypeMB = null;
       private String charEncoding = null;
       private Cookies cookies = new Cookies(headers);
  @@ -298,14 +298,22 @@
   
   
       public int getContentLength() {
  +        long length = getContentLengthLong();
  +
  +        if (length < Integer.MAX_VALUE) {
  +            return (int) length;
  +        }
  +        return -1;
  +    }
  +
  +    public long getContentLengthLong() {
           if( contentLength > -1 ) return contentLength;
   
           MessageBytes clB = headers.getValue("content-length");
  -        contentLength = (clB == null || clB.isNull()) ? -1 : clB.getInt();
  +        contentLength = (clB == null || clB.isNull()) ? -1 : clB.getLong();
   
           return contentLength;
       }
  -
   
       public String getContentType() {
           contentType();
  
  
  
  1.103     +1 -1      jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/Http11Processor.java
  
  Index: Http11Processor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/Http11Processor.java,v
  retrieving revision 1.102
  retrieving revision 1.103
  diff -u -r1.102 -r1.103
  --- Http11Processor.java	28 Jul 2004 18:52:17 -0000	1.102
  +++ Http11Processor.java	12 Aug 2004 21:46:41 -0000	1.103
  @@ -1196,7 +1196,7 @@
           InputFilter[] inputFilters = inputBuffer.getFilters();
   
           // Parse content-length header
  -        int contentLength = request.getContentLength();
  +        long contentLength = request.getContentLengthLong();
           if (contentLength >= 0) {
               inputBuffer.addActiveFilter
                   (inputFilters[Constants.IDENTITY_FILTER]);
  
  
  
  1.12      +1 -1      jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/filters/IdentityInputFilter.java
  
  Index: IdentityInputFilter.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/filters/IdentityInputFilter.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- IdentityInputFilter.java	24 Feb 2004 08:50:55 -0000	1.11
  +++ IdentityInputFilter.java	12 Aug 2004 21:46:41 -0000	1.12
  @@ -144,7 +144,7 @@
        * Read the content length from the request.
        */
       public void setRequest(Request request) {
  -        contentLength = request.getContentLength();
  +        contentLength = request.getContentLengthLong();
           remaining = contentLength;
       }
   
  
  
  
  1.4       +65 -0     jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/Ascii.java
  
  Index: Ascii.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/Ascii.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Ascii.java	12 Aug 2004 19:48:06 -0000	1.3
  +++ Ascii.java	12 Aug 2004 21:46:41 -0000	1.4
  @@ -178,4 +178,69 @@
           return n;
       }
   
  +    /**
  +     * Parses an unsigned long from the specified subarray of bytes.
  +     * @param b the bytes to parse
  +     * @param off the start offset of the bytes
  +     * @param len the length of the bytes
  +     * @exception NumberFormatException if the long format was invalid
  +     */
  +    public static long parseLong(byte[] b, int off, int len)
  +        throws NumberFormatException
  +    {
  +        int c;
  +
  +        if (b == null || len <= 0 || !isDigit(c = b[off++])) {
  +            throw new NumberFormatException();
  +        }
  +
  +        long n = c - '0';
  +        long m;
  +        
  +        while (--len > 0) {
  +            if (!isDigit(c = b[off++])) {
  +                throw new NumberFormatException();
  +            }
  +            m = n * 10 + c - '0';
  +
  +            if (m < n) {
  +                // Overflow
  +                throw new NumberFormatException();
  +            } else {
  +                n = m;
  +            }
  +        }
  +
  +        return n;
  +    }
  +
  +    public static long parseLong(char[] b, int off, int len)
  +        throws NumberFormatException
  +    {
  +        int c;
  +
  +        if (b == null || len <= 0 || !isDigit(c = b[off++])) {
  +            throw new NumberFormatException();
  +        }
  +
  +        long n = c - '0';
  +        long m;
  +
  +        while (--len > 0) {
  +            if (!isDigit(c = b[off++])) {
  +                throw new NumberFormatException();
  +            }
  +            m = n * 10 + c - '0';
  +
  +            if (m < n) {
  +                // Overflow
  +                throw new NumberFormatException();
  +            } else {
  +                n = m;
  +            }
  +        }
  +
  +        return n;
  +    }
  +
   }
  
  
  
  1.20      +5 -0      jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/ByteChunk.java
  
  Index: ByteChunk.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/ByteChunk.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- ByteChunk.java	8 Mar 2004 23:46:37 -0000	1.19
  +++ ByteChunk.java	12 Aug 2004 21:46:41 -0000	1.20
  @@ -477,6 +477,11 @@
   	return Ascii.parseInt(buff, start,end-start);
       }
   
  +    public long getLong() {
  +        return Ascii.parseLong(buff, start,end-start);
  +    }
  +
  +
       // -------------------- equals --------------------
   
       /**
  
  
  
  1.16      +23 -1     jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/MessageBytes.java
  
  Index: MessageBytes.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/MessageBytes.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- MessageBytes.java	15 Jul 2004 14:35:39 -0000	1.15
  +++ MessageBytes.java	12 Aug 2004 21:46:41 -0000	1.16
  @@ -510,11 +510,13 @@
       }
   
       // -------------------- Deprecated code --------------------
  -    // efficient int and date
  +    // efficient int, long and date
       // XXX used only for headers - shouldn't be
       // stored here.
       private int intValue;
       private boolean hasIntValue=false;
  +    private long longValue;
  +    private boolean hasLongValue=false;
       private Date dateValue;
       private boolean hasDateValue=false;
       
  @@ -622,6 +624,26 @@
   	hasIntValue=true;
   	return intValue;
       }
  +
  +    // Used for headers conversion
  +    /** Convert the buffer to an long, cache the value
  +     */ 
  +    public long getLong() {
  +        if( hasLongValue )
  +            return longValue;
  +        
  +        switch (type) {
  +        case T_BYTES:
  +            longValue=byteC.getLong();
  +            break;
  +        default:
  +            longValue=Long.parseLong(toString());
  +        }
  +
  +        hasLongValue=true;
  +        return longValue;
  +
  +     }
   
       // -------------------- Future may be different --------------------
       
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org