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 {