diff --git a/src/main/java/org/jboss/netty/handler/codec/http/QueryStringDecoder.java b/src/main/java/org/jboss/netty/handler/codec/http/QueryStringDecoder.java index 7425126e80..1e6f95efd2 100644 --- a/src/main/java/org/jboss/netty/handler/codec/http/QueryStringDecoder.java +++ b/src/main/java/org/jboss/netty/handler/codec/http/QueryStringDecoder.java @@ -162,12 +162,22 @@ public class QueryStringDecoder { throw new IllegalArgumentException( "maxParams: " + maxParams + " (expected: a positive integer)"); } + + String rawPath = uri.getRawPath(); + if (rawPath != null) { + hasPath = true; + } else { + rawPath =""; + hasPath = false; + } + // Also take care of cut of things like "http://localhost" + String newUri = rawPath + "?" + uri.getRawQuery(); // http://en.wikipedia.org/wiki/Query_string - this.uri = uri.toASCIIString().replace(';', '&'); + this.uri = newUri.replace(';', '&'); this.charset = charset; this.maxParams = maxParams; - hasPath = false; + } /** diff --git a/src/test/java/org/jboss/netty/handler/codec/http/QueryStringDecoderTest.java b/src/test/java/org/jboss/netty/handler/codec/http/QueryStringDecoderTest.java index 42e40586ee..6dc327d5c2 100644 --- a/src/test/java/org/jboss/netty/handler/codec/http/QueryStringDecoderTest.java +++ b/src/test/java/org/jboss/netty/handler/codec/http/QueryStringDecoderTest.java @@ -15,8 +15,11 @@ */ package org.jboss.netty.handler.codec.http; +import java.net.URI; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import org.jboss.netty.util.CharsetUtil; import org.junit.Assert; @@ -164,4 +167,91 @@ public class QueryStringDecoderTest { Assert.assertEquals(ed.getPath(), ad.getPath()); Assert.assertEquals(ed.getParameters(), ad.getParameters()); } + + // See #189 + @Test + public void testURI() { + URI uri = URI.create("http://localhost:8080/foo?param1=value1¶m2=value2¶m3=value3"); + QueryStringDecoder decoder = new QueryStringDecoder(uri); + Assert.assertEquals("/foo", decoder.getPath()); + Map> params = decoder.getParameters(); + Assert.assertEquals(3, params.size()); + Iterator>> entries = params.entrySet().iterator(); + + Entry> entry = entries.next(); + Assert.assertEquals("param1", entry.getKey()); + Assert.assertEquals(1, entry.getValue().size()); + Assert.assertEquals("value1", entry.getValue().get(0)); + + + entry = entries.next(); + Assert.assertEquals("param2", entry.getKey()); + Assert.assertEquals(1, entry.getValue().size()); + Assert.assertEquals("value2", entry.getValue().get(0)); + + entry = entries.next(); + Assert.assertEquals("param3", entry.getKey()); + Assert.assertEquals(1, entry.getValue().size()); + Assert.assertEquals("value3", entry.getValue().get(0)); + + Assert.assertFalse(entries.hasNext()); + } + + // See #189 + @Test + public void testURISlashPath() { + URI uri = URI.create("http://localhost:8080/?param1=value1¶m2=value2¶m3=value3"); + QueryStringDecoder decoder = new QueryStringDecoder(uri); + Assert.assertEquals("/", decoder.getPath()); + Map> params = decoder.getParameters(); + Assert.assertEquals(3, params.size()); + Iterator>> entries = params.entrySet().iterator(); + + Entry> entry = entries.next(); + Assert.assertEquals("param1", entry.getKey()); + Assert.assertEquals(1, entry.getValue().size()); + Assert.assertEquals("value1", entry.getValue().get(0)); + + + entry = entries.next(); + Assert.assertEquals("param2", entry.getKey()); + Assert.assertEquals(1, entry.getValue().size()); + Assert.assertEquals("value2", entry.getValue().get(0)); + + entry = entries.next(); + Assert.assertEquals("param3", entry.getKey()); + Assert.assertEquals(1, entry.getValue().size()); + Assert.assertEquals("value3", entry.getValue().get(0)); + + Assert.assertFalse(entries.hasNext()); + } + + // See #189 + @Test + public void testURINoPath() { + URI uri = URI.create("http://localhost:8080?param1=value1¶m2=value2¶m3=value3"); + QueryStringDecoder decoder = new QueryStringDecoder(uri); + Assert.assertEquals("", decoder.getPath()); + Map> params = decoder.getParameters(); + Assert.assertEquals(3, params.size()); + Iterator>> entries = params.entrySet().iterator(); + + Entry> entry = entries.next(); + Assert.assertEquals("param1", entry.getKey()); + Assert.assertEquals(1, entry.getValue().size()); + Assert.assertEquals("value1", entry.getValue().get(0)); + + + entry = entries.next(); + Assert.assertEquals("param2", entry.getKey()); + Assert.assertEquals(1, entry.getValue().size()); + Assert.assertEquals("value2", entry.getValue().get(0)); + + entry = entries.next(); + Assert.assertEquals("param3", entry.getKey()); + Assert.assertEquals(1, entry.getValue().size()); + Assert.assertEquals("value3", entry.getValue().get(0)); + + Assert.assertFalse(entries.hasNext()); + } }