diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java index 55f9b297aa3d..e0929a2a191b 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java @@ -1286,7 +1286,9 @@ public StringBuffer getRequestURL() { final StringBuffer url = new StringBuffer(128); URIUtil.appendSchemeHostPort(url, getScheme(), getServerName(), getServerPort()); - url.append(getRequestURI()); + String path = getRequestURI(); + if (path != null) + url.append(path); return url; } diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java index f2b58d9395b9..e9658d62198e 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java @@ -57,6 +57,7 @@ import org.eclipse.jetty.http.HttpField; import org.eclipse.jetty.http.HttpFields; import org.eclipse.jetty.http.HttpHeader; +import org.eclipse.jetty.http.HttpStatus; import org.eclipse.jetty.http.HttpTester; import org.eclipse.jetty.http.HttpURI; import org.eclipse.jetty.http.HttpVersion; @@ -856,6 +857,52 @@ public void testContentTypeEncoding() throws Exception assertEquals(" x=z; ", results.get(i)); } + @Test + public void testConnectRequestURLSameAsHost() throws Exception + { + final AtomicReference resultRequestURL = new AtomicReference<>(); + final AtomicReference resultRequestURI = new AtomicReference<>(); + _handler._checker = (request, response) -> + { + resultRequestURL.set(request.getRequestURL().toString()); + resultRequestURI.set(request.getRequestURI()); + return true; + }; + + String rawResponse = _connector.getResponse( + "CONNECT myhost:9999 HTTP/1.1\n" + + "Host: myhost:9999\n" + + "Connection: close\n" + + "\n"); + HttpTester.Response response = HttpTester.parseResponse(rawResponse); + assertThat(response.getStatus(), is(HttpStatus.OK_200)); + assertThat("request.getRequestURL", resultRequestURL.get(), is("http://myhost:9999/")); + assertThat("request.getRequestURI", resultRequestURI.get(), is("/")); + } + + @Test + public void testConnectRequestURLDifferentThanHost() throws Exception + { + final AtomicReference resultRequestURL = new AtomicReference<>(); + final AtomicReference resultRequestURI = new AtomicReference<>(); + _handler._checker = (request, response) -> + { + resultRequestURL.set(request.getRequestURL().toString()); + resultRequestURI.set(request.getRequestURI()); + return true; + }; + + String rawResponse = _connector.getResponse( + "CONNECT myhost:9999 HTTP/1.1\n" + + "Host: otherhost:8888\n" + // per spec, this is ignored if request-target is authority-form + "Connection: close\n" + + "\n"); + HttpTester.Response response = HttpTester.parseResponse(rawResponse); + assertThat(response.getStatus(), is(HttpStatus.OK_200)); + assertThat("request.getRequestURL", resultRequestURL.get(), is("http://myhost:9999/")); + assertThat("request.getRequestURI", resultRequestURI.get(), is("/")); + } + @Test public void testHostPort() throws Exception {