Author: julien(a)jboss.com
Date: 2007-08-29 10:48:42 -0400 (Wed, 29 Aug 2007)
New Revision: 8093
Added:
modules/common/trunk/common/src/main/org/jboss/portal/test/common/http/
modules/common/trunk/common/src/main/org/jboss/portal/test/common/http/QueryStringParserTestCase.java
Modified:
modules/common/trunk/common/build.xml
modules/common/trunk/common/src/main/org/jboss/portal/common/http/QueryStringParser.java
modules/common/trunk/common/src/main/org/jboss/portal/common/text/CharBuffer.java
modules/common/trunk/common/src/main/org/jboss/portal/common/text/FastURLDecoder.java
modules/common/trunk/common/src/main/org/jboss/portal/common/util/MapBuilder.java
modules/common/trunk/common/src/main/org/jboss/portal/test/common/text/FastURLDecoderTestCase.java
Log:
- improved the FastURLDecoder to provide by default a non strict mode which allows the
parsing of chars other than the alpha numeric / special symbols / % encoded values. Those
chars are just appended to the CharWriter
- Reimplemented the query string parser to provide a more tolerant implementation
- Added test cases for the query string parser to assert its behavior
Modified: modules/common/trunk/common/build.xml
===================================================================
--- modules/common/trunk/common/build.xml 2007-08-29 10:18:40 UTC (rev 8092)
+++ modules/common/trunk/common/build.xml 2007-08-29 14:48:42 UTC (rev 8093)
@@ -208,6 +208,7 @@
</x-sysproperty>
<x-test>
+ <test todir="${test.reports}"
name="org.jboss.portal.test.common.http.QueryStringParserTestCase"/>
<test todir="${test.reports}"
name="org.jboss.portal.test.common.text.FastURLDecoderTestCase"/>
<test todir="${test.reports}"
name="org.jboss.portal.test.common.text.CharBufferTestCase"/>
<test todir="${test.reports}"
name="org.jboss.portal.test.common.text.TextToolsTestCase"/>
Modified:
modules/common/trunk/common/src/main/org/jboss/portal/common/http/QueryStringParser.java
===================================================================
---
modules/common/trunk/common/src/main/org/jboss/portal/common/http/QueryStringParser.java 2007-08-29
10:18:40 UTC (rev 8092)
+++
modules/common/trunk/common/src/main/org/jboss/portal/common/http/QueryStringParser.java 2007-08-29
14:48:42 UTC (rev 8093)
@@ -23,6 +23,12 @@
package org.jboss.portal.common.http;
import org.jboss.portal.common.net.URLTools;
+import org.jboss.portal.common.text.CharEncoder;
+import org.jboss.portal.common.text.FastURLDecoder;
+import org.jboss.portal.common.text.CharBuffer;
+import org.jboss.portal.common.text.EncodingException;
+import org.jboss.portal.common.util.ParameterMap;
+import org.apache.log4j.Logger;
import java.util.Collections;
import java.util.HashMap;
@@ -30,20 +36,98 @@
import java.util.StringTokenizer;
/**
+ * A parser for query string for the HTTP protocol. This class is thread safe.
+ *
* @author <a href="mailto:julien@jboss.org">Julien Viet</a>
* @version $Revision: 7379 $
*/
public class QueryStringParser
{
+ /** . */
+ private static QueryStringParser DEFAULT_PARSER = new QueryStringParser();
+
+ public static QueryStringParser getInstance()
+ {
+ return DEFAULT_PARSER;
+ }
+
+ /** . */
+ private static final Logger log = Logger.getLogger(QueryStringParser.class);
+
+ /** . */
+ private static final int LOOKUP = 0;
+
+ /** . */
+ private static final int INVALID_CHUNK = 1;
+
+ /** . */
+ private static final int PARAM_NAME = 2;
+
+ /** . */
+ private static final int PARAM_VALUE = 3;
+
+ /** . */
+ private CharEncoder parameterDecoder;
+
/**
+ * Create a new parser with the specified parameter decoder.
+ *
+ * @param parameterDecoder the parameter decoder
+ * @throws IllegalArgumentException if the decoder is null
+ */
+ public QueryStringParser(CharEncoder parameterDecoder) throws
IllegalArgumentException
+ {
+ if (parameterDecoder == null)
+ {
+ throw new IllegalArgumentException("No parameter decoder");
+ }
+ this.parameterDecoder = parameterDecoder;
+ }
+
+ /**
+ * Creates a new parser with a decoder that will decode x-www-formurlencoded
parameters with the
+ * UTF-8 charset.
+ */
+ public QueryStringParser()
+ {
+ this(FastURLDecoder.getUTF8Instance());
+ }
+
+ public CharEncoder getParameterDecoder()
+ {
+ return parameterDecoder;
+ }
+
+ private void append(ParameterMap parameterMap, String parameterName, String
parameterValue)
+ {
+ String[] values = parameterMap.getValues(parameterName);
+
+ //
+ if (values == null)
+ {
+ values = new String[]{parameterValue};
+ }
+ else
+ {
+ String[] tmp = new String[values.length + 1];
+ System.arraycopy(values, 0, tmp, 0, values.length);
+ values = tmp;
+ values[values.length - 1] = parameterValue;
+ }
+
+ //
+ parameterMap.setValues(parameterName, values);
+ }
+
+ /**
* Parse the query string and build an unmodifiable parameter map of it.
*
* @param queryString the non null query string
* @return a <String,String[]> map
* @throws IllegalArgumentException if the query string is null
*/
- public static Map parseQueryString(String queryString) throws
IllegalArgumentException
+ public ParameterMap parseQueryString(String queryString) throws
IllegalArgumentException
{
if (queryString == null)
{
@@ -51,53 +135,134 @@
}
//
- Map result = Collections.EMPTY_MAP;
+ // Map result = Collections.EMPTY_MAP;
- //
- for (StringTokenizer tokenizer = new StringTokenizer(queryString,
"&"); tokenizer.hasMoreTokens();)
- {
- String token = tokenizer.nextToken();
- int pos = token.indexOf('=');
- if (pos > 0)
- {
- // Get name and value
- String encodedName = token.substring(0, pos);
- String encodedValue = token.substring(pos + 1, token.length());
+ ParameterMap parameterMap = new ParameterMap();
- // Decode properly
- String name = URLTools.decodeXWWWFormURL(encodedName);
- String value = URLTools.decodeXWWWFormURL(encodedValue);
+ String encodedName = null;
+ CharBuffer buffer = new CharBuffer(50);
- // Put the values in the result map
- String[] values = (String[])result.get(name);
- if (values == null)
- {
- values = new String[1];
- }
- else
- {
- String[] tmp = new String[values.length + 1];
- System.arraycopy(values, 0, tmp, 0, values.length);
- values = tmp;
- }
- values[values.length - 1] = value;
- // Replace the empty map if necessary with a real hashmap
- if (result.isEmpty())
- {
- result = new HashMap();
- }
- result.put(name, values);
+ int pos = 0;
+ int len = queryString.length();
+ int state = LOOKUP;
+ while (true)
+ {
+ char c;
+ if (pos < len)
+ {
+ c = queryString.charAt(pos++);
}
+ else if (pos == len)
+ {
+ c = '&';
+ pos++;
+ }
else
{
- // Not well formed
- // -1 mean we have just a parameter name
- // 0 means we have an empty name
+ break;
}
+
+ //
+ switch(state)
+ {
+ case LOOKUP:
+ if (c == '&')
+ {
+ // Do nothing
+ }
+ else if (c == '=')
+ {
+ state = INVALID_CHUNK;
+ }
+ else
+ {
+ state = PARAM_NAME;
+ buffer.append(c);
+ }
+ break;
+ case PARAM_NAME:
+ if (c == '&')
+ {
+ String tmp = buffer.asString();
+
+ //
+ try
+ {
+ parameterDecoder.encode(tmp, buffer);
+ append(parameterMap, buffer.asString(false), "");
+ }
+ catch (EncodingException e)
+ {
+ log.debug("Could not decode parameter name " + tmp, e);
+ }
+
+ //
+ buffer.reset();
+ state = LOOKUP;
+ }
+ else if (c == '=')
+ {
+ encodedName = buffer.asString();
+ buffer.reset();
+ state = PARAM_VALUE;
+ }
+ else
+ {
+ buffer.append(c);
+ }
+ break;
+ case PARAM_VALUE:
+ if (c == '&')
+ {
+
+ //
+ try
+ {
+ // Save value
+ String encodedValue = buffer.asString();
+
+ // Decode parameter name
+ parameterDecoder.encode(encodedName, buffer);
+ String name = buffer.asString(false);
+
+ // Now decode parameter value
+ try
+ {
+ buffer.reset();
+ parameterDecoder.encode(encodedValue, buffer);
+ String value = buffer.asString();
+ append(parameterMap, name, value);
+ }
+ catch (EncodingException e)
+ {
+ log.debug("Could not decode parameter value " +
encodedValue, e);
+ }
+ }
+ catch (EncodingException e)
+ {
+ log.debug("Could not decode parameter name " +
encodedName, e);
+ }
+
+ //
+ buffer.reset();
+ state = LOOKUP;
+ }
+ else
+ {
+ buffer.append(c);
+ }
+ break;
+ case INVALID_CHUNK:
+ if (c == '&')
+ {
+ state = LOOKUP;
+ }
+ break;
+ }
}
//
- return result.isEmpty() ? result : Collections.unmodifiableMap(result);
+ return parameterMap;
}
}
Modified:
modules/common/trunk/common/src/main/org/jboss/portal/common/text/CharBuffer.java
===================================================================
---
modules/common/trunk/common/src/main/org/jboss/portal/common/text/CharBuffer.java 2007-08-29
10:18:40 UTC (rev 8092)
+++
modules/common/trunk/common/src/main/org/jboss/portal/common/text/CharBuffer.java 2007-08-29
14:48:42 UTC (rev 8093)
@@ -132,9 +132,19 @@
public String asString()
{
- return new String(buffer, 0, length);
+ return asString(true);
}
+ public String asString(boolean reset)
+ {
+ String s = new String(buffer, 0, length);
+ if (reset)
+ {
+ reset();
+ }
+ return s;
+ }
+
public int getCapacity()
{
return buffer.length;
Modified:
modules/common/trunk/common/src/main/org/jboss/portal/common/text/FastURLDecoder.java
===================================================================
---
modules/common/trunk/common/src/main/org/jboss/portal/common/text/FastURLDecoder.java 2007-08-29
10:18:40 UTC (rev 8092)
+++
modules/common/trunk/common/src/main/org/jboss/portal/common/text/FastURLDecoder.java 2007-08-29
14:48:42 UTC (rev 8093)
@@ -30,14 +30,28 @@
{
/** . */
- private static final FastURLDecoder INSTANCE = new
FastURLDecoder(CharToByteEncoder.Generic.UTF8);
+ private static final FastURLDecoder UTF8 = new
FastURLDecoder(CharToByteEncoder.Generic.UTF8);
- public static FastURLDecoder getInstance()
+ /** . */
+ private static final FastURLDecoder UTF8_STRICT = new
FastURLDecoder(CharToByteEncoder.Generic.UTF8, true);
+
+ public static FastURLDecoder getUTF8Instance()
{
- return INSTANCE;
+ return UTF8;
}
+ public static FastURLDecoder getUTF8StrictInstance()
+ {
+ return UTF8_STRICT;
+ }
+
/** . */
+ private static final char FROM = 0;
+
+ /** . */
+ private static final char TO = (char)0x10FFFD;
+
+ /** . */
private static final int AS_IS = 0;
/** . */
@@ -50,7 +64,7 @@
private static final int ERROR = 3;
/** . */
- private final LookupNonTerm root = new LookupNonTerm();
+ private final LookupNonTerm root;
/** . */
private final int[] decisions;
@@ -58,14 +72,21 @@
/** . */
private final int[][] conversions;
+ /** . */
+ private final boolean strict;
+
public FastURLDecoder(CharToByteEncoder encoder)
{
- this(encoder, (char)0, (char)0x10FFFD);
+ this(encoder, false);
}
- public FastURLDecoder(CharToByteEncoder encoder, char from, char to)
+ public FastURLDecoder(CharToByteEncoder encoder, boolean strict)
{
- for (char c = from;c <= to;c++)
+ this.strict = strict;
+
+ //
+ root = new LookupNonTerm();
+ for (char c = FROM;c <= TO;c++)
{
byte[] v = encoder.encode(c);
LookupNonTerm node = root;
@@ -134,6 +155,7 @@
break;
default:
decisions[i] = ERROR;
+ break;
}
}
}
@@ -284,11 +306,24 @@
}
break;
case ERROR:
- throw new MalformedInputException("Cannot decode char " + c);
+ if (strict)
+ {
+ throw new MalformedInputException("Cannot decode char " +
c);
+ }
+ else
+ {
+ tmp.append(c);
+ }
+ break;
}
}
}
+ public boolean isStrict()
+ {
+ return strict;
+ }
+
private static class LookupNode
{
}
Modified:
modules/common/trunk/common/src/main/org/jboss/portal/common/util/MapBuilder.java
===================================================================
---
modules/common/trunk/common/src/main/org/jboss/portal/common/util/MapBuilder.java 2007-08-29
10:18:40 UTC (rev 8092)
+++
modules/common/trunk/common/src/main/org/jboss/portal/common/util/MapBuilder.java 2007-08-29
14:48:42 UTC (rev 8093)
@@ -36,14 +36,43 @@
{
/** . */
- private HashMap map;
+ private final Map map;
- public MapBuilder()
+ private MapBuilder(Map map)
{
- this.map = new HashMap();
+ if (map == null)
+ {
+ throw new IllegalArgumentException();
+ }
+ this.map = map;
}
/**
+ * Creates a new instance.
+ *
+ * @return a new instance
+ */
+ public static MapBuilder hashMap()
+ {
+ return new MapBuilder(new HashMap());
+ }
+
+ /**
+ * Creates a new instance.
+ *
+ * @return a new instance
+ */
+ public static MapBuilder linkedHashMap()
+ {
+ return new MapBuilder(new LinkedHashMap());
+ }
+
+ public static MapBuilder create(Map map)
+ {
+ return new MapBuilder(map);
+ }
+
+ /**
* Add the object to the collection.
*
* @param key the key
@@ -68,23 +97,8 @@
return this;
}
- /**
- * Return a set build from the collection.
- *
- * @return a set
- */
- public HashMap toHashMap()
+ public Map get()
{
return map;
}
-
- /**
- * Return a list build from the collection.
- *
- * @return a list
- */
- public LinkedHashMap toLinkedHashMap()
- {
- return new LinkedHashMap(map);
- }
}
Added:
modules/common/trunk/common/src/main/org/jboss/portal/test/common/http/QueryStringParserTestCase.java
===================================================================
---
modules/common/trunk/common/src/main/org/jboss/portal/test/common/http/QueryStringParserTestCase.java
(rev 0)
+++
modules/common/trunk/common/src/main/org/jboss/portal/test/common/http/QueryStringParserTestCase.java 2007-08-29
14:48:42 UTC (rev 8093)
@@ -0,0 +1,203 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portal.test.common.http;
+
+import junit.framework.TestCase;
+import org.jboss.portal.common.http.QueryStringParser;
+import org.jboss.portal.common.util.MapBuilder;
+import org.jboss.portal.common.util.ParameterMap;
+
+/**
+ * @author <a href="mailto:julien@jboss.org">Julien Viet</a>
+ * @version $Revision: 1.1 $
+ */
+public class QueryStringParserTestCase extends TestCase
+{
+
+ /** . */
+ private final QueryStringParser parser = new QueryStringParser();
+
+ public void testConstructorThrowsIAE()
+ {
+ try
+ {
+ new QueryStringParser(null);
+ fail("Was expecting an IAE");
+ }
+ catch (IllegalArgumentException expected)
+ {
+ }
+ }
+
+ public void testParseThrowsIAE()
+ {
+ try
+ {
+ QueryStringParser.getInstance().parseQueryString(null);
+ fail("Was expecting an IAE");
+ }
+ catch (IllegalArgumentException expected)
+ {
+ }
+ }
+
+ public void testEmpty()
+ {
+ assertEquals(MapBuilder.create(new ParameterMap()).get(),
parser.parseQueryString(""));
+ }
+
+ public void testOneParam()
+ {
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{""}).get(), parser.parseQueryString("f"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{""}).get(), parser.parseQueryString("f="));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"b"}).get(), parser.parseQueryString("f=b"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"bar"}).get(), parser.parseQueryString("f=bar"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{""}).get(), parser.parseQueryString("foo"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{""}).get(), parser.parseQueryString("foo="));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"b"}).get(), parser.parseQueryString("foo=b"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"bar"}).get(), parser.parseQueryString("foo=bar"));
+ }
+
+ public void testTwoValues()
+ {
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"","bar2"}).get(),
parser.parseQueryString("f&f=bar2"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"","bar2"}).get(),
parser.parseQueryString("f=&f=bar2"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"b","bar2"}).get(),
parser.parseQueryString("f=b&f=bar2"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"bar","bar2"}).get(),
parser.parseQueryString("f=bar&f=bar2"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"","bar2"}).get(),
parser.parseQueryString("foo&foo=bar2"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"","bar2"}).get(),
parser.parseQueryString("foo=&foo=bar2"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"b","bar2"}).get(),
parser.parseQueryString("foo=b&foo=bar2"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"bar","bar2"}).get(),
parser.parseQueryString("foo=bar&foo=bar2"));
+
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"bar2",""}).get(),
parser.parseQueryString("f=bar2&f"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"bar2",""}).get(),
parser.parseQueryString("f=bar2&f="));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"bar2","b"}).get(),
parser.parseQueryString("f=bar2&f=b"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"bar2","bar"}).get(),
parser.parseQueryString("f=bar2&f=bar"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"bar2",""}).get(),
parser.parseQueryString("foo=bar2&foo"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"bar2",""}).get(),
parser.parseQueryString("foo=bar2&foo="));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"bar2","b"}).get(),
parser.parseQueryString("foo=bar2&foo=b"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"bar2","bar"}).get(),
parser.parseQueryString("foo=bar2&foo=bar"));
+ }
+
+ public void testEncodedValue()
+ {
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{" "}).get(), parser.parseQueryString("foo=+"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"."}).get(), parser.parseQueryString("foo=."));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"-"}).get(), parser.parseQueryString("foo=-"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"*"}).get(), parser.parseQueryString("foo=*"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"_"}).get(), parser.parseQueryString("foo=_"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"/"}).get(), parser.parseQueryString("foo=%2F"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"/"}).get(), parser.parseQueryString("foo=/"));
+ }
+
+ public void testMalformedValue()
+ {
+ assertEquals(MapBuilder.create(new ParameterMap()).get(),
parser.parseQueryString("foo=%2"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{""}).get(), parser.parseQueryString("foo&foo=%2"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"bar"}).get(),
parser.parseQueryString("foo=bar&foo=%2"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{""}).get(), parser.parseQueryString("foo=%2&foo"));
+ }
+
+ public void testTwoParams()
+ {
+ assertEquals(MapBuilder.create(new ParameterMap()).put("x", new
String[]{"y"}).put("f", new String[]{""}).get(),
parser.parseQueryString("x=y&f"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("x", new
String[]{"y"}).put("f", new String[]{""}).get(),
parser.parseQueryString("x=y&f="));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("x", new
String[]{"y"}).put("f", new String[]{"b"}).get(),
parser.parseQueryString("x=y&f=b"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("x", new
String[]{"y"}).put("f", new String[]{"bar"}).get(),
parser.parseQueryString("x=y&f=bar"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("x", new
String[]{"y"}).put("foo", new String[]{""}).get(),
parser.parseQueryString("x=y&foo"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("x", new
String[]{"y"}).put("foo", new String[]{""}).get(),
parser.parseQueryString("x=y&foo="));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("x", new
String[]{"y"}).put("foo", new String[]{"b"}).get(),
parser.parseQueryString("x=y&foo=b"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("x", new
String[]{"y"}).put("foo", new String[]{"bar"}).get(),
parser.parseQueryString("x=y&foo=bar"));
+ }
+
+ public void testValueContainingEqual()
+ {
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"b=j"}).get(), parser.parseQueryString("f=b=j"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"bar=j"}).get(), parser.parseQueryString("f=bar=j"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"b=juu"}).get(), parser.parseQueryString("f=b=juu"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"bar=juu"}).get(), parser.parseQueryString("f=bar=juu"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"b=j"}).get(), parser.parseQueryString("foo=b=j"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"bar=j"}).get(), parser.parseQueryString("foo=bar=j"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"b=juu"}).get(), parser.parseQueryString("foo=b=juu"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"bar=juu"}).get(), parser.parseQueryString("foo=bar=juu"));
+ }
+
+ public void testInvalidChunck()
+ {
+ assertEquals(MapBuilder.create(new ParameterMap()).get(),
parser.parseQueryString("="));
+ assertEquals(MapBuilder.create(new ParameterMap()).get(),
parser.parseQueryString("=x"));
+ assertEquals(MapBuilder.create(new ParameterMap()).get(),
parser.parseQueryString("=x="));
+ assertEquals(MapBuilder.create(new ParameterMap()).get(),
parser.parseQueryString("=x=y"));
+ }
+
+ public void testInvalidChunckWithAmpersand()
+ {
+ //
+ assertEquals(MapBuilder.create(new ParameterMap()).get(),
parser.parseQueryString("=&"));
+ assertEquals(MapBuilder.create(new ParameterMap()).get(),
parser.parseQueryString("=x&"));
+ assertEquals(MapBuilder.create(new ParameterMap()).get(),
parser.parseQueryString("=x=&"));
+ assertEquals(MapBuilder.create(new ParameterMap()).get(),
parser.parseQueryString("=x=y&"));
+
+ //
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{""}).get(), parser.parseQueryString("=&f"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{""}).get(), parser.parseQueryString("=x&f"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{""}).get(), parser.parseQueryString("=x=&f"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{""}).get(), parser.parseQueryString("=x=y&f"));
+
+ //
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{""}).get(), parser.parseQueryString("=&f="));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{""}).get(), parser.parseQueryString("=x&f="));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{""}).get(), parser.parseQueryString("=x=&f="));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{""}).get(), parser.parseQueryString("=x=y&f="));
+
+ //
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"b"}).get(), parser.parseQueryString("=&f=b"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"b"}).get(), parser.parseQueryString("=x&f=b"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"b"}).get(), parser.parseQueryString("=x=&f=b"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("f", new
String[]{"b"}).get(), parser.parseQueryString("=x=y&f=b"));
+
+ //
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{""}).get(), parser.parseQueryString("=&foo"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{""}).get(), parser.parseQueryString("=x&foo"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{""}).get(), parser.parseQueryString("=x=&foo"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{""}).get(), parser.parseQueryString("=x=y&foo"));
+
+ //
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{""}).get(), parser.parseQueryString("=&foo="));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{""}).get(), parser.parseQueryString("=x&foo="));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{""}).get(), parser.parseQueryString("=x=&foo="));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{""}).get(), parser.parseQueryString("=x=y&foo="));
+
+ //
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"b"}).get(), parser.parseQueryString("=&foo=b"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"b"}).get(), parser.parseQueryString("=x&foo=b"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"b"}).get(), parser.parseQueryString("=x=&foo=b"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"b"}).get(), parser.parseQueryString("=x=y&foo=b"));
+
+ //
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"bar"}).get(), parser.parseQueryString("=&foo=bar"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"bar"}).get(), parser.parseQueryString("=x&foo=bar"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"bar"}).get(), parser.parseQueryString("=x=&foo=bar"));
+ assertEquals(MapBuilder.create(new ParameterMap()).put("foo", new
String[]{"bar"}).get(), parser.parseQueryString("=x=y&foo=bar"));
+ }
+}
Modified:
modules/common/trunk/common/src/main/org/jboss/portal/test/common/text/FastURLDecoderTestCase.java
===================================================================
---
modules/common/trunk/common/src/main/org/jboss/portal/test/common/text/FastURLDecoderTestCase.java 2007-08-29
10:18:40 UTC (rev 8092)
+++
modules/common/trunk/common/src/main/org/jboss/portal/test/common/text/FastURLDecoderTestCase.java 2007-08-29
14:48:42 UTC (rev 8093)
@@ -39,7 +39,7 @@
public void testEncodeThrowsIAE() throws Exception
{
- CharEncoder encoder = FastURLDecoder.getInstance();
+ CharEncoder encoder = FastURLDecoder.getUTF8Instance();
try
{
encoder.encode(new char[10], -1, 0, new CharBuffer());
@@ -134,7 +134,7 @@
public void testEncode() throws Exception
{
- FastURLDecoder encoder = FastURLDecoder.getInstance();
+ FastURLDecoder encoder = FastURLDecoder.getUTF8Instance();
StringBuffer tmp = new StringBuffer();
for (int i = 0;i < 512;i++)
{
@@ -149,7 +149,12 @@
public void testEncodeMalformedInput()
{
- FastURLDecoder encoder = FastURLDecoder.getInstance();
+ testEncodeMalformedInput(FastURLDecoder.getUTF8StrictInstance(), true);
+ testEncodeMalformedInput(FastURLDecoder.getUTF8Instance(), false);
+ }
+
+ private void testEncodeMalformedInput(FastURLDecoder encoder, boolean strict)
+ {
try
{
encoder.encode("%0T", new CharBuffer());
@@ -198,21 +203,39 @@
catch (MalformedInputException expected)
{
}
- try
+
+ //
+ if (strict)
{
- encoder.encode(";", new CharBuffer());
- fail("Was expecting a malformed input exception");
+ try
+ {
+ encoder.encode(";", new CharBuffer());
+ fail("Was expecting a malformed input exception");
+ }
+ catch (MalformedInputException expected)
+ {
+ }
+ try
+ {
+ encoder.encode("\u0100", new CharBuffer());
+ fail("Was expecting a malformed input exception");
+ }
+ catch (MalformedInputException expected)
+ {
+ }
}
- catch (MalformedInputException expected)
+ else
{
+ CharBuffer tmp = new CharBuffer();
+
+ //
+ encoder.encode(";", tmp);
+ assertEquals(";", tmp.asString());
+
+ //
+ tmp.reset();
+ encoder.encode("\u0100", tmp);
+ assertEquals("\u0100", tmp.asString());
}
- try
- {
- encoder.encode("\u0100", new CharBuffer());
- fail("Was expecting a malformed input exception");
- }
- catch (MalformedInputException expected)
- {
- }
}
}