diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/HttpUtil.java b/codec-http/src/main/java/io/netty/handler/codec/http/HttpUtil.java index 3aa299e5158..50b1a636937 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/HttpUtil.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/HttpUtil.java @@ -49,8 +49,15 @@ private HttpUtil() { } * rfc7230, 5.3. */ public static boolean isOriginForm(URI uri) { - return uri.getScheme() == null && uri.getSchemeSpecificPart() == null && - uri.getHost() == null && uri.getAuthority() == null; + return isOriginForm(uri.toString()); + } + + /** + * Determine if a string uri is in origin-form according to + * rfc7230, 5.3. + */ + public static boolean isOriginForm(String uri) { + return uri.startsWith("/"); } /** @@ -58,10 +65,15 @@ public static boolean isOriginForm(URI uri) { * rfc7230, 5.3. */ public static boolean isAsteriskForm(URI uri) { - return "*".equals(uri.getPath()) && - uri.getScheme() == null && uri.getSchemeSpecificPart() == null && - uri.getHost() == null && uri.getAuthority() == null && uri.getQuery() == null && - uri.getFragment() == null; + return isAsteriskForm(uri.toString()); + } + + /** + * Determine if a string uri is in asterisk-form according to + * rfc7230, 5.3. + */ + public static boolean isAsteriskForm(String uri) { + return "*".equals(uri); } /** diff --git a/codec-http/src/test/java/io/netty/handler/codec/http/HttpUtilTest.java b/codec-http/src/test/java/io/netty/handler/codec/http/HttpUtilTest.java index 7d6521f5d8d..b9b72e086d7 100644 --- a/codec-http/src/test/java/io/netty/handler/codec/http/HttpUtilTest.java +++ b/codec-http/src/test/java/io/netty/handler/codec/http/HttpUtilTest.java @@ -22,6 +22,7 @@ import java.net.InetAddress; import java.net.InetSocketAddress; +import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @@ -38,6 +39,29 @@ public class HttpUtilTest { + @Test + public void testRecognizesOriginForm() { + // Origin form: https://tools.ietf.org/html/rfc7230#section-5.3.1 + assertTrue(HttpUtil.isOriginForm(URI.create("/where?q=now"))); + // Absolute form: https://tools.ietf.org/html/rfc7230#section-5.3.2 + assertFalse(HttpUtil.isOriginForm(URI.create("http://www.example.org/pub/WWW/TheProject.html"))); + // Authority form: https://tools.ietf.org/html/rfc7230#section-5.3.3 + assertFalse(HttpUtil.isOriginForm(URI.create("www.example.com:80"))); + // Asterisk form: https://tools.ietf.org/html/rfc7230#section-5.3.4 + assertFalse(HttpUtil.isOriginForm(URI.create("*"))); + } + + @Test public void testRecognizesAsteriskForm() { + // Asterisk form: https://tools.ietf.org/html/rfc7230#section-5.3.4 + assertTrue(HttpUtil.isAsteriskForm(URI.create("*"))); + // Origin form: https://tools.ietf.org/html/rfc7230#section-5.3.1 + assertFalse(HttpUtil.isAsteriskForm(URI.create("/where?q=now"))); + // Absolute form: https://tools.ietf.org/html/rfc7230#section-5.3.2 + assertFalse(HttpUtil.isAsteriskForm(URI.create("http://www.example.org/pub/WWW/TheProject.html"))); + // Authority form: https://tools.ietf.org/html/rfc7230#section-5.3.3 + assertFalse(HttpUtil.isAsteriskForm(URI.create("www.example.com:80"))); + } + @Test public void testRemoveTransferEncodingIgnoreCase() { HttpMessage message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); diff --git a/codec-http2/src/main/java/io/netty/handler/codec/http2/HttpConversionUtil.java b/codec-http2/src/main/java/io/netty/handler/codec/http2/HttpConversionUtil.java index 9b677b5170b..d17a17ef91e 100644 --- a/codec-http2/src/main/java/io/netty/handler/codec/http2/HttpConversionUtil.java +++ b/codec-http2/src/main/java/io/netty/handler/codec/http2/HttpConversionUtil.java @@ -49,6 +49,8 @@ import static io.netty.handler.codec.http.HttpResponseStatus.parseLine; import static io.netty.handler.codec.http.HttpScheme.HTTP; import static io.netty.handler.codec.http.HttpScheme.HTTPS; +import static io.netty.handler.codec.http.HttpUtil.isAsteriskForm; +import static io.netty.handler.codec.http.HttpUtil.isOriginForm; import static io.netty.handler.codec.http2.Http2Error.PROTOCOL_ERROR; import static io.netty.handler.codec.http2.Http2Exception.connectionError; import static io.netty.handler.codec.http2.Http2Exception.streamError; @@ -434,8 +436,7 @@ public static Http2Headers toHttp2Headers(HttpMessage in, boolean validateHeader if (in instanceof HttpRequest) { HttpRequest request = (HttpRequest) in; String host = inHeaders.getAsString(HttpHeaderNames.HOST); - if (request.uri().startsWith("/") || "*".equals(request.uri())) { - // Origin or asterisk form + if (isOriginForm(request.uri()) || isAsteriskForm(request.uri())) { out.path(new AsciiString(request.uri())); setHttp2Scheme(inHeaders, out); } else {