From 6c0429391ea9b8ea4ad60bf3eda278b452d94e24 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Tue, 5 Aug 2014 09:37:22 +0200 Subject: [PATCH] [#2732] HttpRequestEncoder may produce invalid uri if uri parameters are included. Motivation: If the requests contains uri parameters but not path the HttpRequestEncoder does produce an invalid uri while try to add the missing path. Modifications: Correctly handle the case of uri with paramaters but no path. Result: HttpRequestEncoder produce correct uri in all cases. --- .../codec/http/HttpRequestEncoder.java | 19 +++++++++++++++++-- .../codec/http/HttpRequestEncoderTest.java | 9 +++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jboss/netty/handler/codec/http/HttpRequestEncoder.java b/src/main/java/org/jboss/netty/handler/codec/http/HttpRequestEncoder.java index 80f01cc1a5..bcc453a236 100644 --- a/src/main/java/org/jboss/netty/handler/codec/http/HttpRequestEncoder.java +++ b/src/main/java/org/jboss/netty/handler/codec/http/HttpRequestEncoder.java @@ -25,6 +25,7 @@ import static org.jboss.netty.handler.codec.http.HttpConstants.*; */ public class HttpRequestEncoder extends HttpMessageEncoder { private static final char SLASH = '/'; + private static final char QUESTION_MARK = '?'; @Override protected void encodeInitialLine(ChannelBuffer buf, HttpMessage message) throws Exception { @@ -38,8 +39,22 @@ public class HttpRequestEncoder extends HttpMessageEncoder { int start = uri.indexOf("://"); if (start != -1) { int startIndex = start + 3; - if (uri.lastIndexOf(SLASH) <= startIndex) { - uri += SLASH; + // Correctly handle query params. + // See https://github.com/netty/netty/issues/2732 + int index = uri.indexOf(QUESTION_MARK, startIndex); + if (index == -1) { + if (uri.lastIndexOf(SLASH) <= startIndex) { + uri += SLASH; + } + } else { + if (uri.lastIndexOf(SLASH, index) <= startIndex) { + int len = uri.length(); + StringBuilder sb = new StringBuilder(len + 1); + sb.append(uri, 0, index); + sb.append(SLASH); + sb.append(uri, index, len); + uri = sb.toString(); + } } } diff --git a/src/test/java/org/jboss/netty/handler/codec/http/HttpRequestEncoderTest.java b/src/test/java/org/jboss/netty/handler/codec/http/HttpRequestEncoderTest.java index 3ecb3b5153..4bbff51e9d 100644 --- a/src/test/java/org/jboss/netty/handler/codec/http/HttpRequestEncoderTest.java +++ b/src/test/java/org/jboss/netty/handler/codec/http/HttpRequestEncoderTest.java @@ -45,4 +45,13 @@ public class HttpRequestEncoderTest { String req = buffer.toString(Charset.forName("US-ASCII")); assertEquals("GET http://localhost/ HTTP/1.1\r\n", req); } + + @Test + public void testUriWithoutPath2() throws Exception { + HttpRequestEncoder encoder = new HttpRequestEncoder(); + ChannelBuffer buffer = ChannelBuffers.buffer(64); + encoder.encodeInitialLine(buffer, new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "http://localhost:9999?p1=v1")); + String req = buffer.toString(Charset.forName("US-ASCII")); + assertEquals("GET http://localhost:9999/?p1=v1 HTTP/1.1\r\n", req); + } }