You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by la...@apache.org on 2002/02/02 05:46:01 UTC
cvs commit: jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf UDecoder.java
larryi 02/02/01 20:46:01
Modified: util/java/org/apache/tomcat/util/buf UDecoder.java
Log:
In a query string, '+' is a substitute for space, but not in the path portion of a
URL. Add methods that include a "query" parameter to control if the '+'
should be converted to a space.
Revision Changes Path
1.5 +46 -10 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/UDecoder.java
Index: UDecoder.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/UDecoder.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- UDecoder.java 31 Dec 2001 18:20:04 -0000 1.4
+++ UDecoder.java 2 Feb 2002 04:46:01 -0000 1.5
@@ -78,9 +78,18 @@
{
}
+ /** URLDecode, will modify the source. Includes converting
+ * '+' to ' '.
+ */
+ public void convert( ByteChunk mb )
+ throws IOException
+ {
+ convert(mb, true);
+ }
+
/** URLDecode, will modify the source.
*/
- public void convert(ByteChunk mb)
+ public void convert( ByteChunk mb, boolean query )
throws IOException
{
int start=mb.getOffset();
@@ -88,7 +97,9 @@
int end=mb.getEnd();
int idx= mb.indexOf( buff, start, end, '%' );
- int idx2= mb.indexOf( buff, start, end, '+' );
+ int idx2=-1;
+ if( query )
+ idx2= mb.indexOf( buff, start, end, '+' );
if( idx<0 && idx2<0 ) {
return;
}
@@ -98,7 +109,7 @@
if( idx < 0 ) idx=idx2;
for( int j=idx; j<end; j++, idx++ ) {
- if( buff[ j ] == '+' ) {
+ if( buff[ j ] == '+' && query) {
buff[idx]= (byte)' ' ;
} else if( buff[ j ] != '%' ) {
buff[idx]= buff[j];
@@ -127,17 +138,28 @@
// XXX What do we do about charset ????
/** In-buffer processing - the buffer will be modified
+ * Includes converting '+' to ' '.
*/
public void convert( CharChunk mb )
throws IOException
{
+ convert(mb, true);
+ }
+
+ /** In-buffer processing - the buffer will be modified
+ */
+ public void convert( CharChunk mb, boolean query )
+ throws IOException
+ {
// log( "Converting a char chunk ");
int start=mb.getOffset();
char buff[]=mb.getBuffer();
int cend=mb.getEnd();
int idx= mb.indexOf( buff, start, cend, '%' );
- int idx2= mb.indexOf( buff, start, cend, '+' );
+ int idx2=-1;
+ if( query )
+ idx2= mb.indexOf( buff, start, cend, '+' );
if( idx<0 && idx2<0 ) {
return;
}
@@ -146,7 +168,7 @@
if( idx < 0 ) idx=idx2;
for( int j=idx; j<cend; j++, idx++ ) {
- if( buff[ j ] == '+' ) {
+ if( buff[ j ] == '+' && query ) {
buff[idx]=( ' ' );
} else if( buff[ j ] != '%' ) {
buff[idx]=buff[j];
@@ -170,24 +192,33 @@
}
/** URLDecode, will modify the source
+ * Includes converting '+' to ' '.
*/
public void convert(MessageBytes mb)
throws IOException
{
+ convert(mb, true);
+ }
+
+ /** URLDecode, will modify the source
+ */
+ public void convert(MessageBytes mb, boolean query)
+ throws IOException
+ {
switch (mb.getType()) {
case MessageBytes.T_STR:
String strValue=mb.toString();
if( strValue==null ) return;
- mb.setString( convert( strValue ));
+ mb.setString( convert( strValue, query ));
break;
case MessageBytes.T_CHARS:
CharChunk charC=mb.getCharChunk();
- convert( charC );
+ convert( charC, query );
break;
case MessageBytes.T_BYTES:
ByteChunk bytesC=mb.getByteChunk();
- convert( bytesC );
+ convert( bytesC, query );
break;
}
}
@@ -196,9 +227,14 @@
//
public final String convert(String str)
{
+ return convert(str, true);
+ }
+
+ public final String convert(String str, boolean query)
+ {
if (str == null) return null;
- if( str.indexOf( '+' ) <0 && str.indexOf( '%' ) < 0 )
+ if( (!query || str.indexOf( '+' ) < 0) && str.indexOf( '%' ) < 0 )
return str;
StringBuffer dec = new StringBuffer(); // decoded string output
@@ -212,7 +248,7 @@
// look ahead to next URLencoded metacharacter, if any
for (laPos = strPos; laPos < strLen; laPos++) {
char laChar = str.charAt(laPos);
- if ((laChar == '+') || (laChar == '%')) {
+ if ((laChar == '+' && query) || (laChar == '%')) {
break;
}
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>