tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From cos...@apache.org
Subject cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/util/http Parameters.java
Date Wed, 07 Feb 2001 07:01:31 GMT
costin      01/02/06 23:01:31

  Modified:    src/share/org/apache/tomcat/core ContextManager.java
                        Request.java
               src/share/org/apache/tomcat/modules/server
                        Ajp12Interceptor.java Ajp13Interceptor.java
                        Http10Interceptor.java JNIConnectionHandler.java
               src/share/org/apache/tomcat/startup StopTomcat.java
               src/share/org/apache/tomcat/util/http Parameters.java
  Log:
  Fixed a number of probles with reading the request body.
  - moved the check for "available" in Request, and make sure all the
  adapters are checking if more data is to be expected.
  ( it used to be in the facade, but this is not the only place where the
  check must be made - it's much better to test it at the lower level )
  
  - few changes in how the POST data is pushed in Parameters.
  
  Note: reading the request body will be changed a bit to deal with the
  encoding problems, right now the parameters have hardcoded charset
  ( that was the original code ), and needs to be fixed.
  
  Revision  Changes    Path
  1.167     +3 -0      jakarta-tomcat/src/share/org/apache/tomcat/core/ContextManager.java
  
  Index: ContextManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ContextManager.java,v
  retrieving revision 1.166
  retrieving revision 1.167
  diff -u -r1.166 -r1.167
  --- ContextManager.java	2001/02/06 06:41:07	1.166
  +++ ContextManager.java	2001/02/07 07:01:23	1.167
  @@ -871,7 +871,10 @@
   	}
   
   	Request lr = new Request();
  +	Response res = new Response();
   	lr.setContextManager( this );
  +	lr.setResponse( res );
  +	res.setRequest( lr );
   	lr.requestURI().setString( urlPath );
   	lr.queryString().setString(queryString );
   
  
  
  
  1.89      +69 -27    jakarta-tomcat/src/share/org/apache/tomcat/core/Request.java
  
  Index: Request.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Request.java,v
  retrieving revision 1.88
  retrieving revision 1.89
  diff -u -r1.88 -r1.89
  --- Request.java	2001/02/06 06:29:19	1.88
  +++ Request.java	2001/02/07 07:01:23	1.89
  @@ -137,9 +137,12 @@
       // Processed information ( redundant ! )
       protected Parameters params=new Parameters();
       //    protected Hashtable parametersH = new Hashtable();
  -    protected boolean didReadFormData;
  +    protected boolean didReadFormData=false;
   
       protected int contentLength = -1;
  +    // how much body we still have to read.
  +    protected int available = -1; 
  +
       protected String contentType = null;
       protected String charEncoding = null;
       protected MessageBytes serverNameMB=new MessageBytes();
  @@ -327,12 +330,26 @@
        *  are available.
        */
       public void handlePostParameters() {
  -	int needData=params.needContent();
  +	if( didReadFormData )
  +	    return;
  +	didReadFormData=true;
  +
  +	if( ! methodMB.equalsIgnoreCase("POST") )
  +	    return;
  +	String contentType= getContentType();
  +	if (contentType == null &&
  +            contentType.startsWith("application/x-www-form-urlencoded")) {
  +	    return;
  +	}
   
  -	if( needData > 0 ) {
  +	int len=getContentLength();
  +	int available=getAvailable();
  +
  +	// read only available ( someone else may have read the content )
  +	if( available > 0 ) {
   	    try {
  -		byte[] formData = new byte[needData];
  -		readBody( formData, needData );
  +		byte[] formData = new byte[available];
  +		readBody( formData, available );
   		params.processData( formData );
   	    } catch(IOException ex ) {
   		// XXX should we throw exception or log ?
  @@ -345,8 +362,6 @@
   	return params;
       }
       
  -
  -
       // -------------------- encoding/type --------------------
   
       public String getCharacterEncoding() {
  @@ -361,6 +376,7 @@
   
       public void setContentLength( int  len ) {
   	this.contentLength=len;
  +	available=len;
       }
   
       public int getContentLength() {
  @@ -368,6 +384,7 @@
   
   	MessageBytes clB=headers.getValue("content-length");
           contentLength = (clB==null || clB.isNull() ) ? -1 : clB.getInt();
  +	available=contentLength;
   
   	return contentLength;
       }
  @@ -690,38 +707,43 @@
           return headers.names();
       }
   
  -    // -------------------- Utils - facade for RequestUtil
  +    // -------------------- Computed fields --------------------
  +    
   
  -    /** Read request data, filling a byte[]
  +    // -------------------- For adapters --------------------
  +    // This should move to an IntputBuffer - the reading of the
  +    // request body is really bad in tomcat, it needs some work
  +    // and optimizations.
  +
  +    // We need to make sure nobody reads more than is available
  +    // That may happen if both POST and input stream are used
  +    // ( illegal, but can happen - and then we're hunged )
  +    // ( also, getParameter doesn't throw any exception - if the
  +    // user reads the body and then calls getParameter() the best
  +    // action is to get him the query params - which are available.
  +    
  +
  +    public void setAvailable( int  len ) {
  +	this.available=len;
  +    }
  +
  +    /** How many bytes from the body are still available
        */
  -    public int readBody(byte body[], int len)
  -	throws IOException
  -    {
  -	int offset = 0;
  +    public int getAvailable() {
   	
  -	do {
  -	    int inputLen = doRead(body, offset, len - offset);
  -	    if (inputLen <= 0) {
  -		return offset;
  -	    }
  -	    offset += inputLen;
  -	} while ((len - offset) > 0);
  -	return len;
  +	return available;
       }
   
  -
  -    // -------------------- Computed fields --------------------
       
  -
  -    // -------------------- For adapters --------------------
  -    
       /** Fill in the buffer. This method is probably easier to implement than
   	previous.
  -	This method should only be called from SerlvetInputStream implementations.
  +	This method should only be called from SerlvetInputStream
  +	implementations.
   	No need to implement it if your adapter implements ServletInputStream.
        */
       // you need to override this method if you want non-empty InputStream
       public  int doRead( byte b[], int off, int len ) throws IOException {
  +	//	System.out.println( "doRead " );
   	return -1; // not implemented - implement getInputStream
       }
   
  @@ -743,7 +765,27 @@
   	// ??
   	//return ((int)b[0]) & 0x000000FF;
       }
  +    
  +    /** Read request data, filling a byte[]
  +     */
  +    public int readBody(byte body[], int len)
  +	throws IOException
  +    {
  +	int offset = 0;
  +	//	System.out.println( "ReadBody ");
  +	do {
  +	    int inputLen = doRead(body, offset, len - offset);
  +	    if (inputLen <= 0) {
  +		return offset;
  +	    }
  +	    offset += inputLen;
  +	} while ((len - offset) > 0);
  +	return len;
  +    }
   
  +
  +
  +    
       // -------------------- debug --------------------
       
       public String toString() {
  
  
  
  1.12      +8 -1      jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Ajp12Interceptor.java
  
  Index: Ajp12Interceptor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Ajp12Interceptor.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- Ajp12Interceptor.java	2000/12/30 08:26:45	1.11
  +++ Ajp12Interceptor.java	2001/02/07 07:01:25	1.12
  @@ -228,11 +228,18 @@
       }
   
       public int doRead() throws IOException {
  +	if( available <= 0 )
  +	    return -1;
  +	available--;
   	return ajp12.doRead();
       }
   
       public  int doRead( byte b[], int off, int len ) throws IOException {
  -	return ajp12.doRead( b,off,len);
  +	if( available <= 0 )
  +	    return -1;
  +	int rd=ajp12.doRead( b,off,len);
  +	available -= rd;
  +	return rd;
       }
   
       public boolean isTomcatAuthentication() {
  
  
  
  1.7       +11 -4     jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Ajp13Interceptor.java
  
  Index: Ajp13Interceptor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Ajp13Interceptor.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- Ajp13Interceptor.java	2001/02/05 16:04:00	1.6
  +++ Ajp13Interceptor.java	2001/02/07 07:01:25	1.7
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Ajp13Interceptor.java,v
1.6 2001/02/05 16:04:00 hgomez Exp $
  - * $Revision: 1.6 $
  - * $Date: 2001/02/05 16:04:00 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Ajp13Interceptor.java,v
1.7 2001/02/07 07:01:25 costin Exp $
  + * $Revision: 1.7 $
  + * $Date: 2001/02/07 07:01:25 $
    *
    * ====================================================================
    *
  @@ -215,12 +215,19 @@
       
       public int doRead() throws IOException 
       {
  +	if( available <= 0 )
  +	    return -1;
  +	available--;
   	return ajp13.doRead();
       }
       
       public int doRead(byte[] b, int off, int len) throws IOException 
       {
  -	return ajp13.doRead( b,off, len );
  +	if( available <= 0 )
  +	    return -1;
  +	int rd=ajp13.doRead( b,off, len );
  +	available -= rd;
  +	return rd;
       }
       
       public void recycle() 
  
  
  
  1.13      +8 -1      jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Http10Interceptor.java
  
  Index: Http10Interceptor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Http10Interceptor.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- Http10Interceptor.java	2001/01/23 05:08:39	1.12
  +++ Http10Interceptor.java	2001/02/07 07:01:27	1.13
  @@ -197,11 +197,18 @@
       }
   
       public int doRead() throws IOException {
  +	if( available <= 0 )
  +	    return -1;
  +	available--;
   	return http.doRead();
       }
   
       public int doRead(byte[] b, int off, int len) throws IOException {
  -	return http.doRead( b, off, len );
  +	if( available <= 0 )
  +	    return 0;
  +	int rd=http.doRead( b, off, len );
  +	available -= rd;
  +	return rd;
       }
       
   
  
  
  
  1.8       +7 -4      jakarta-tomcat/src/share/org/apache/tomcat/modules/server/JNIConnectionHandler.java
  
  Index: JNIConnectionHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/JNIConnectionHandler.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- JNIConnectionHandler.java	2000/12/30 08:26:46	1.7
  +++ JNIConnectionHandler.java	2001/02/07 07:01:27	1.8
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/JNIConnectionHandler.java,v
1.7 2000/12/30 08:26:46 costin Exp $
  - * $Revision: 1.7 $
  - * $Date: 2000/12/30 08:26:46 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/JNIConnectionHandler.java,v
1.8 2001/02/07 07:01:27 costin Exp $
  + * $Revision: 1.8 $
  + * $Date: 2001/02/07 07:01:27 $
    *
    * ====================================================================
    *
  @@ -274,6 +274,8 @@
       }
   
       public  int doRead(byte b[], int off, int len) throws IOException {
  +	if( available <= 0 )
  +	    return 0;
           int rc = 0;
   
           while(0 == rc) {
  @@ -282,7 +284,8 @@
   	            Thread.currentThread().yield();
   	        }
   	    }
  -	    return rc;
  +	available -= rc;
  +	return rc;
       }
   
       protected void readNextRequest(long s, long l) throws IOException {
  
  
  
  1.3       +9 -13     jakarta-tomcat/src/share/org/apache/tomcat/startup/StopTomcat.java
  
  Index: StopTomcat.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/startup/StopTomcat.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- StopTomcat.java	2000/12/29 19:59:19	1.2
  +++ StopTomcat.java	2001/02/07 07:01:29	1.3
  @@ -76,7 +76,6 @@
       private static StringManager sm =
   	StringManager.getManager("org.apache.tomcat.resources");
   
  -    String configFile;
       String tomcatHome;
       
       public StopTomcat() 
  @@ -85,16 +84,6 @@
   
       // -------------------- Parameters --------------------
   
  -    public void setConfig( String s ) {
  -	configFile=s;
  -    }
  -
  -    /** -f option
  -     */
  -    public void setF( String s ) {
  -	configFile=s;
  -    }
  -
       public void setH( String s ) {
   	tomcatHome=s;
   	System.getProperties().put("tomcat.home", s);
  @@ -223,7 +212,10 @@
       public  boolean processArgs(String[] args) {
   	for (int i = 0; i < args.length; i++) {
   	    String arg = args[i];
  -            
  +	    
  +	    if (arg.equals("-?")) {
  +		return false;
  +	    }
   	    if (arg.equals("-h") || arg.equals("-home")) {
   		i++;
   		if (i < args.length)
  @@ -238,7 +230,11 @@
       public static void main(String args[] ) {
   	try {
   	    StopTomcat tomcat=new StopTomcat();
  -	    tomcat.processArgs( args );
  +	    if( ! tomcat.processArgs( args ) ) {
  +		// XXX use sm, i18n
  +		System.out.println("Usage: java org.apache.tomcat.startup.StopTomcat [ -home TOMCAT_HOME
] ");
  +		return;
  +	    }
   	    tomcat.execute();
   	} catch(Exception ex ) {
   	    System.out.println(sm.getString("tomcat.fatal"));
  
  
  
  1.8       +0 -33     jakarta-tomcat/src/share/org/apache/tomcat/util/http/Parameters.java
  
  Index: Parameters.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/http/Parameters.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- Parameters.java	2001/02/06 06:24:26	1.7
  +++ Parameters.java	2001/02/07 07:01:30	1.8
  @@ -75,7 +75,6 @@
       // this class - we can switch to MultiMap
       private Hashtable paramHashStringArray=new Hashtable();
       private boolean didQueryParameters=false;
  -    private boolean didReadFormData=false;
       private boolean didMerge=false;
       
       MessageBytes queryMB;
  @@ -112,7 +111,6 @@
   	super.recycle();
   	paramHashStringArray.clear();
   	didQueryParameters=false;
  -	didReadFormData=false;
   	currentChild=null;
   	didMerge=false;
       }
  @@ -249,7 +247,6 @@
       
       // XXX ENCODING !!
       public void processData(byte data[]) {
  -	didReadFormData = true;
   	// make sure the request line query is processed
   	handleQueryParameters();
   	
  @@ -269,36 +266,6 @@
   	}
       }
       
  -    /**
  -     * Process the headers and return if body data is needed. This
  -     * class doesn't deal with reading.
  -     *
  -     *  Future enahancements: reuse/access the read buffer. Chunks.
  -     *  Additional encodings.
  -     */
  -    public int needContent() {
  -	if( didReadFormData )
  -	    return 0;
  -
  -	MessageBytes contentTypeMB=headers.getValue("content-type");
  -	if( contentTypeMB == null || contentTypeMB.isNull() )
  -	    return 0;
  -	
  -	String contentType= contentTypeMB.toString();
  -	
  -	if (contentType != null &&
  -            contentType.startsWith("application/x-www-form-urlencoded")) {
  -
  -	    MessageBytes clB=headers.getValue("content-length");
  -	    int contentLength = (clB==null || clB.isNull() ) ? -1 :
  -		clB.getInt();
  -	    if( contentLength >0 ) return contentLength;
  -	}
  -	return 0;
  -	
  -    }
  -
  -
       // --------------------
       
       /** Combine 2 hashtables into a new one.
  
  
  

Mime
View raw message