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 6da1276633..9fdb9d81a3 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 @@ -24,7 +24,7 @@ import org.jboss.netty.buffer.ChannelBuffer; * a {@link ChannelBuffer}. */ public class HttpRequestEncoder extends HttpMessageEncoder { - + private static final char SLASH = '/'; /** * Creates a new instance. */ @@ -37,7 +37,19 @@ public class HttpRequestEncoder extends HttpMessageEncoder { HttpRequest request = (HttpRequest) message; buf.writeBytes(request.getMethod().toString().getBytes("ASCII")); buf.writeByte(SP); - buf.writeBytes(request.getUri().getBytes("UTF-8")); + + // Add / as absolute path if no is present. + // See http://tools.ietf.org/html/rfc2616#section-5.1.2 + String uri = request.getUri(); + int start = uri.indexOf("://"); + if (start != -1) { + int startIndex = start + 3; + if (uri.lastIndexOf(SLASH) <= startIndex) { + uri = uri + SLASH; + } + } + + buf.writeBytes(uri.getBytes("UTF-8")); buf.writeByte(SP); buf.writeBytes(request.getProtocolVersion().toString().getBytes("ASCII")); buf.writeByte(CR); 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 new file mode 100644 index 0000000000..3ecb3b5153 --- /dev/null +++ b/src/test/java/org/jboss/netty/handler/codec/http/HttpRequestEncoderTest.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012 The Netty Project + * + * The Netty Project licenses this file to you under the Apache License, + * version 2.0 (the "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package org.jboss.netty.handler.codec.http; + +import static org.junit.Assert.*; + +import org.jboss.netty.buffer.ChannelBuffer; +import org.jboss.netty.buffer.ChannelBuffers; +import org.junit.Test; + +import java.nio.charset.Charset; + +/** + */ +public class HttpRequestEncoderTest { + + @Test + public void testUriWithoutPath() throws Exception { + HttpRequestEncoder encoder = new HttpRequestEncoder(); + ChannelBuffer buffer = ChannelBuffers.buffer(64); + encoder.encodeInitialLine(buffer, new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "http://localhost")); + String req = buffer.toString(Charset.forName("US-ASCII")); + assertEquals("GET http://localhost/ HTTP/1.1\r\n", req); + } + + + @Test + public void testUriWithPath() throws Exception { + HttpRequestEncoder encoder = new HttpRequestEncoder(); + ChannelBuffer buffer = ChannelBuffers.buffer(64); + encoder.encodeInitialLine(buffer, new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "http://localhost/")); + String req = buffer.toString(Charset.forName("US-ASCII")); + assertEquals("GET http://localhost/ HTTP/1.1\r\n", req); + } +}