Skip to content

Commit 2f7234b

Browse files
authored
Fix isOriginForm and isAsteriskForm (netty#12568)
Motivation: These methods would always return false using the previously implementation (URI#getSchemeSpecificPart is [documented](https://docs.oracle.com/javase/8/docs/api/java/net/URI.html#getSchemeSpecificPart--) to *never* return `null`). They also had other implementation errors. Modification: Edit methods to conform with RFC 7230. Result: Methods handle the basic examples provided in RFC 7230. More test cases can be added as needed.
1 parent c949fa6 commit 2f7234b

File tree

3 files changed

+45
-8
lines changed

3 files changed

+45
-8
lines changed

codec-http/src/main/java/io/netty/handler/codec/http/HttpUtil.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,19 +49,31 @@ private HttpUtil() { }
4949
* <a href="https://tools.ietf.org/html/rfc7230#section-5.3">rfc7230, 5.3</a>.
5050
*/
5151
public static boolean isOriginForm(URI uri) {
52-
return uri.getScheme() == null && uri.getSchemeSpecificPart() == null &&
53-
uri.getHost() == null && uri.getAuthority() == null;
52+
return isOriginForm(uri.toString());
53+
}
54+
55+
/**
56+
* Determine if a string uri is in origin-form according to
57+
* <a href="https://tools.ietf.org/html/rfc7230#section-5.3">rfc7230, 5.3</a>.
58+
*/
59+
public static boolean isOriginForm(String uri) {
60+
return uri.startsWith("/");
5461
}
5562

5663
/**
5764
* Determine if a uri is in asterisk-form according to
5865
* <a href="https://tools.ietf.org/html/rfc7230#section-5.3">rfc7230, 5.3</a>.
5966
*/
6067
public static boolean isAsteriskForm(URI uri) {
61-
return "*".equals(uri.getPath()) &&
62-
uri.getScheme() == null && uri.getSchemeSpecificPart() == null &&
63-
uri.getHost() == null && uri.getAuthority() == null && uri.getQuery() == null &&
64-
uri.getFragment() == null;
68+
return isAsteriskForm(uri.toString());
69+
}
70+
71+
/**
72+
* Determine if a string uri is in asterisk-form according to
73+
* <a href="https://tools.ietf.org/html/rfc7230#section-5.3">rfc7230, 5.3</a>.
74+
*/
75+
public static boolean isAsteriskForm(String uri) {
76+
return "*".equals(uri);
6577
}
6678

6779
/**

codec-http/src/test/java/io/netty/handler/codec/http/HttpUtilTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import java.net.InetAddress;
2424
import java.net.InetSocketAddress;
25+
import java.net.URI;
2526
import java.nio.charset.StandardCharsets;
2627
import java.util.ArrayList;
2728
import java.util.List;
@@ -38,6 +39,29 @@
3839

3940
public class HttpUtilTest {
4041

42+
@Test
43+
public void testRecognizesOriginForm() {
44+
// Origin form: https://tools.ietf.org/html/rfc7230#section-5.3.1
45+
assertTrue(HttpUtil.isOriginForm(URI.create("/where?q=now")));
46+
// Absolute form: https://tools.ietf.org/html/rfc7230#section-5.3.2
47+
assertFalse(HttpUtil.isOriginForm(URI.create("http://www.example.org/pub/WWW/TheProject.html")));
48+
// Authority form: https://tools.ietf.org/html/rfc7230#section-5.3.3
49+
assertFalse(HttpUtil.isOriginForm(URI.create("www.example.com:80")));
50+
// Asterisk form: https://tools.ietf.org/html/rfc7230#section-5.3.4
51+
assertFalse(HttpUtil.isOriginForm(URI.create("*")));
52+
}
53+
54+
@Test public void testRecognizesAsteriskForm() {
55+
// Asterisk form: https://tools.ietf.org/html/rfc7230#section-5.3.4
56+
assertTrue(HttpUtil.isAsteriskForm(URI.create("*")));
57+
// Origin form: https://tools.ietf.org/html/rfc7230#section-5.3.1
58+
assertFalse(HttpUtil.isAsteriskForm(URI.create("/where?q=now")));
59+
// Absolute form: https://tools.ietf.org/html/rfc7230#section-5.3.2
60+
assertFalse(HttpUtil.isAsteriskForm(URI.create("http://www.example.org/pub/WWW/TheProject.html")));
61+
// Authority form: https://tools.ietf.org/html/rfc7230#section-5.3.3
62+
assertFalse(HttpUtil.isAsteriskForm(URI.create("www.example.com:80")));
63+
}
64+
4165
@Test
4266
public void testRemoveTransferEncodingIgnoreCase() {
4367
HttpMessage message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);

codec-http2/src/main/java/io/netty/handler/codec/http2/HttpConversionUtil.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@
4949
import static io.netty.handler.codec.http.HttpResponseStatus.parseLine;
5050
import static io.netty.handler.codec.http.HttpScheme.HTTP;
5151
import static io.netty.handler.codec.http.HttpScheme.HTTPS;
52+
import static io.netty.handler.codec.http.HttpUtil.isAsteriskForm;
53+
import static io.netty.handler.codec.http.HttpUtil.isOriginForm;
5254
import static io.netty.handler.codec.http2.Http2Error.PROTOCOL_ERROR;
5355
import static io.netty.handler.codec.http2.Http2Exception.connectionError;
5456
import static io.netty.handler.codec.http2.Http2Exception.streamError;
@@ -434,8 +436,7 @@ public static Http2Headers toHttp2Headers(HttpMessage in, boolean validateHeader
434436
if (in instanceof HttpRequest) {
435437
HttpRequest request = (HttpRequest) in;
436438
String host = inHeaders.getAsString(HttpHeaderNames.HOST);
437-
if (request.uri().startsWith("/") || "*".equals(request.uri())) {
438-
// Origin or asterisk form
439+
if (isOriginForm(request.uri()) || isAsteriskForm(request.uri())) {
439440
out.path(new AsciiString(request.uri()));
440441
setHttp2Scheme(inHeaders, out);
441442
} else {

0 commit comments

Comments
 (0)