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/09/09 05:14:41 UTC

cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/util/http Parameters.java

costin      01/09/08 20:14:41

  Modified:    src/share/org/apache/tomcat/util/http Parameters.java
  Log:
  Bug 3479: parameter parsing with a&b&c syntax ( no '=' ).
  
  Revision  Changes    Path
  1.17      +64 -14    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.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- Parameters.java	2001/08/31 04:13:11	1.16
  +++ Parameters.java	2001/09/09 03:14:41	1.17
  @@ -359,13 +359,30 @@
   	    log( "Bytes: " + new String( bytes, start, len ));
   
           do {
  +	    boolean noEq=false;
  +	    int valStart=-1;
  +	    int valEnd=-1;
  +	    
   	    int nameStart=pos;
   	    int nameEnd=ByteChunk.indexOf(bytes, nameStart, end, '=' );
  -	    if( nameEnd== -1 ) nameEnd=end;
  -	    
  -	    int valStart=nameEnd+1;
  -	    int valEnd=ByteChunk.indexOf(bytes, valStart, end, '&');
  -	    if( valEnd== -1 ) valEnd = (valStart < end) ? end : valStart;
  +	    // Workaround for a&b&c encoding
  +	    int nameEnd2=ByteChunk.indexOf(bytes, nameStart, end, '&' );
  +	    if( (nameEnd2!=-1 ) &&
  +		( nameEnd==-1 || nameEnd > nameEnd2) ) {
  +		nameEnd=nameEnd2;
  +		noEq=true;
  +		valStart=nameEnd;
  +		valEnd=nameEnd;
  +		if( debug>0) log("no equal " + nameStart + " " + nameEnd + " " + new String(bytes, nameStart, nameEnd-nameStart) );
  +	    }
  +	    if( nameEnd== -1 ) 
  +		nameEnd=end;
  +
  +	    if( ! noEq ) {
  +		valStart=nameEnd+1;
  +		valEnd=ByteChunk.indexOf(bytes, valStart, end, '&');
  +		if( valEnd== -1 ) valEnd = (valStart < end) ? end : valStart;
  +	    }
   	    
   	    pos=valEnd+1;
   	    
  @@ -381,7 +398,7 @@
   	    
   	    try {
   		if( debug > 0 )
  -		    log( tmpName + "= " + tmpValue);
  +		    log( "Found " + tmpName + "= " + tmpValue);
   
   		if( urlDec==null ) {
   		    urlDec=new UDecoder();   
  @@ -390,7 +407,7 @@
   		urlDec.convert( tmpValue );
   
   		if( debug > 0 )
  -		    log( tmpName + "= " + tmpValue);
  +		    log( "After url decoding " + tmpName + "= " + tmpValue);
   		
   		addParam( tmpName.toString(), tmpValue.toString() );
   	    } catch( IOException ex ) {
  @@ -410,13 +427,29 @@
   	if( debug>0 ) 
   	    log( "Chars: " + new String( chars, start, len ));
           do {
  +	    boolean noEq=false;
   	    int nameStart=pos;
  +	    int valStart=-1;
  +	    int valEnd=-1;
  +	    
   	    int nameEnd=CharChunk.indexOf(chars, nameStart, end, '=' );
  +	    int nameEnd2=CharChunk.indexOf(chars, nameStart, end, '&' );
  +	    if( (nameEnd2!=-1 ) &&
  +		( nameEnd==-1 || nameEnd > nameEnd2) ) {
  +		nameEnd=nameEnd2;
  +		noEq=true;
  +		valStart=nameEnd;
  +		valEnd=nameEnd;
  +		if( debug>0) log("no equal " + nameStart + " " + nameEnd + " " + new String(chars, nameStart, nameEnd-nameStart) );
  +	    }
   	    if( nameEnd== -1 ) nameEnd=end;
  -
  -	    int valStart=nameEnd+1;
  -	    int valEnd=CharChunk.indexOf(chars, valStart, end, '&');
  -	    if( valEnd== -1 ) valEnd = (valStart < end) ? end : valStart;
  +	    
  +	    if( ! noEq ) {
  +		valStart=nameEnd+1;
  +		valEnd=CharChunk.indexOf(chars, valStart, end, '&');
  +		if( valEnd== -1 ) valEnd = (valStart < end) ? end : valStart;
  +	    }
  +	    
   	    pos=valEnd+1;
   	    
   	    if( nameEnd<=nameStart ) {
  @@ -501,13 +534,30 @@
   	    log("String: " + str );
   	
           do {
  +	    boolean noEq=false;
  +	    int valStart=-1;
  +	    int valEnd=-1;
  +	    
   	    int nameStart=pos;
   	    int nameEnd=str.indexOf('=', nameStart );
  +	    int nameEnd2=str.indexOf('&', nameStart );
  +	    if( (nameEnd2!=-1 ) &&
  +		( nameEnd==-1 || nameEnd > nameEnd2) ) {
  +		nameEnd=nameEnd2;
  +		noEq=true;
  +		valStart=nameEnd;
  +		valEnd=nameEnd;
  +		if( debug>0) log("no equal " + nameStart + " " + nameEnd + " " + str.substring(nameStart, nameEnd) );
  +	    }
  +
   	    if( nameEnd== -1 ) nameEnd=end;
   
  -	    int valStart=nameEnd+1;
  -	    int valEnd=str.indexOf('&', valStart);
  -	    if( valEnd== -1 ) valEnd = (valStart < end) ? end : valStart;
  +	    if( ! noEq ) {
  +		valStart=nameEnd+1;
  +		valEnd=str.indexOf('&', valStart);
  +		if( valEnd== -1 ) valEnd = (valStart < end) ? end : valStart;
  +	    }
  +	    
   	    pos=valEnd+1;
   	    
   	    if( nameEnd<=nameStart ) {