remm        2003/11/19 15:12:58

  Modified:    util/java/org/apache/tomcat/util/http Parameters.java
  Log:
  - Fix i18n for URL parameters. Hopefully. I didn't test it.
  - Please test this ASAP.
  
  Revision  Changes    Path
  1.12      +46 -40    
jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/http/Parameters.java
  
  Index: Parameters.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/http/Parameters.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- Parameters.java   7 Sep 2003 07:37:12 -0000       1.11
  +++ Parameters.java   19 Nov 2003 23:12:58 -0000      1.12
  @@ -292,30 +292,18 @@
        if( queryMB==null || queryMB.isNull() )
            return;
        
  -     try {
  -            decodedQuery.duplicate( queryMB );
  -            if (queryStringEncoding == null) {
  -                ByteChunk bc = decodedQuery.getByteChunk();
  -                CharChunk cc = decodedQuery.getCharChunk();
  -                cc.allocate(bc.getLength(), -1);
  -                // Default encoding: fast conversion
  -                byte[] bbuf = bc.getBuffer();
  -                char[] cbuf = cc.getBuffer();
  -                int start = bc.getStart();
  -                for (int i = 0; i < bc.getLength(); i++) {
  -                    cbuf[i] = (char) (bbuf[i + start] & 0xff);
  -                }
  -                decodedQuery.setChars(cbuf, 0, bc.getLength());
  -            } else {
  -                decodedQuery.setEncoding(queryStringEncoding);
  -                decodedQuery.toChars();
  -            }
  -     } catch( IOException ex ) {
  -     }
        if( debug > 0  )
            log( "Decoding query " + decodedQuery + " " + queryStringEncoding);
   
  -     processParameters( decodedQuery );
  +        try {
  +            decodedQuery.duplicate( queryMB );
  +        } catch (IOException e) {
  +            // Can't happen, as decodedQuery can't overflow
  +            e.printStackTrace();
  +        }
  +        ByteChunk bc = decodedQuery.getByteChunk();
  +        processParameters( bc.getBytes(), bc.getOffset(),
  +                           bc.getLength(), queryStringEncoding );
       }
   
       // --------------------
  @@ -393,6 +381,11 @@
       CharChunk tmpValueC=new CharChunk(1024);
       
       public void processParameters( byte bytes[], int start, int len ) {
  +        processParameters(bytes, start, len, encoding);
  +    }
  +
  +    public void processParameters( byte bytes[], int start, int len, 
  +                                   String enc ) {
        int end=start+len;
        int pos=start;
        
  @@ -434,31 +427,44 @@
            }
            tmpName.setBytes( bytes, nameStart, nameEnd-nameStart );
            tmpValue.setBytes( bytes, valStart, valEnd-valStart );
  -         tmpName.setEncoding( encoding );
  -         tmpValue.setEncoding( encoding );
  -         
  -         try {
  -             if( debug > 0 )
  -                 log( "Found " + tmpName + "= " + tmpValue);
   
  -             if( urlDec==null ) {
  -                 urlDec=new UDecoder();   
  -             }
  -             urlDec.convert( tmpName );
  -             urlDec.convert( tmpValue );
  -
  -             if( debug > 0 )
  -                 log( "After url decoding " + tmpName + "= " + tmpValue);
  -             
  -             addParam( tmpName.toString(), tmpValue.toString() );
  -         } catch( IOException ex ) {
  -             ex.printStackTrace();
  -         }
  +            try {
  +                addParam( urlDecode(tmpName, enc), urlDecode(tmpValue, enc) );
  +            } catch (IOException e) {
  +                // Exception during character decoding: skip parameter
  +            }
   
            tmpName.recycle();
            tmpValue.recycle();
   
        } while( pos<end );
  +    }
  +
  +    private String urlDecode(ByteChunk bc, String enc)
  +        throws IOException {
  +        if( urlDec==null ) {
  +            urlDec=new UDecoder();   
  +        }
  +        urlDec.convert(bc);
  +        String result = null;
  +        if (enc != null) {
  +            bc.setEncoding(enc);
  +            result = bc.toString();
  +        } else {
  +            CharChunk cc = tmpNameC;
  +            cc.allocate(bc.getLength(), -1);
  +            // Default encoding: fast conversion
  +            byte[] bbuf = bc.getBuffer();
  +            char[] cbuf = cc.getBuffer();
  +            int start = bc.getStart();
  +            for (int i = 0; i < bc.getLength(); i++) {
  +                cbuf[i] = (char) (bbuf[i + start] & 0xff);
  +            }
  +            cc.setChars(cbuf, 0, bc.getLength());
  +            result = cc.toString();
  +            cc.recycle();
  +        }
  +        return result;
       }
   
       public void processParameters( char chars[], int start, int len ) {
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to