diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelOverHttp.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelOverHttp.java index 758ad5d406d7..7aca86b74dd6 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelOverHttp.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelOverHttp.java @@ -102,10 +102,10 @@ public boolean isExpecting102Processing() } @Override - public boolean startRequest(String method, String uri, HttpVersion version) + public boolean startRequest(String method, String requestTarget, HttpVersion version) { _metadata.setMethod(method); - _metadata.getURI().parseRequestTarget(method, uri); + _metadata.getURI().parseRequestTarget(method, requestTarget); _metadata.setHttpVersion(version); _unknownExpectation = false; _expect100Continue = false; @@ -127,7 +127,7 @@ public void parsedHeader(HttpField field) break; case HOST: - if (!_metadata.getURI().isAbsolute() && field instanceof HostPortHttpField) + if (!HttpMethod.CONNECT.is(_metadata.getMethod()) && !_metadata.getURI().isAbsolute() && field instanceof HostPortHttpField) { HostPortHttpField hp = (HostPortHttpField)field; _metadata.getURI().setAuthority(hp.getHost(), hp.getPort()); 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 dd67bf9bc7e1..4d66f75eb8f7 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 @@ -1352,7 +1352,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 9cbd7801264f..f77f39b63018 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 @@ -55,6 +55,7 @@ import org.eclipse.jetty.http.BadMessageException; import org.eclipse.jetty.http.HttpCompliance; import org.eclipse.jetty.http.HttpComplianceSection; +import org.eclipse.jetty.http.HttpStatus; import org.eclipse.jetty.http.HttpTester; import org.eclipse.jetty.http.MimeTypes; import org.eclipse.jetty.io.Connection; @@ -83,6 +84,7 @@ import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.Matchers.startsWith; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -872,6 +874,52 @@ public boolean check(HttpServletRequest request, HttpServletResponse response) 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(nullValue())); + } + + @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(nullValue())); + } + @Test public void testHostPort() throws Exception {