diff --git a/containers/jetty-http/pom.xml b/containers/jetty-http/pom.xml index c99d10602b..0acbdd2f12 100644 --- a/containers/jetty-http/pom.xml +++ b/containers/jetty-http/pom.xml @@ -17,7 +17,8 @@ --> - + 4.0.0 @@ -37,7 +38,6 @@ org.glassfish.hk2.external jakarta.inject - org.eclipse.jetty jetty-server @@ -50,6 +50,11 @@ org.eclipse.jetty jetty-continuation + + org.apache.httpcomponents + httpclient + test + @@ -69,7 +74,6 @@ maven-bundle-plugin true - diff --git a/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java b/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java index e1a04d73ed..d79db49eb1 100644 --- a/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java +++ b/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -145,9 +145,9 @@ public void handle(final String target, final Request request, final HttpServlet final Response response = request.getResponse(); final ResponseWriter responseWriter = new ResponseWriter(request, response, configSetStatusOverSendError); - final URI baseUri = getBaseUri(request); - final URI requestUri = getRequestUri(request, baseUri); try { + final URI baseUri = getBaseUri(request); + final URI requestUri = getRequestUri(request, baseUri); final ContainerRequest requestContext = new ContainerRequest( baseUri, requestUri, @@ -171,25 +171,35 @@ public void handle(final String target, final Request request, final HttpServlet // Mark the request as handled before generating the body of the response request.setHandled(true); appHandler.handle(requestContext); + } catch (URISyntaxException e) { + setResponseForInvalidUri(response, e); } catch (final Exception ex) { throw new RuntimeException(ex); } - } - private URI getRequestUri(final Request request, final URI baseUri) { - try { - final String serverAddress = getServerAddress(baseUri); - String uri = request.getRequestURI(); + private URI getRequestUri(final Request request, final URI baseUri) throws URISyntaxException { + final String serverAddress = getServerAddress(baseUri); + String uri = request.getRequestURI(); - final String queryString = request.getQueryString(); - if (queryString != null) { - uri = uri + "?" + ContainerUtils.encodeUnsafeCharacters(queryString); - } + final String queryString = request.getQueryString(); + if (queryString != null) { + uri = uri + "?" + ContainerUtils.encodeUnsafeCharacters(queryString); + } - return new URI(serverAddress + uri); - } catch (URISyntaxException ex) { - throw new IllegalArgumentException(ex); + return new URI(serverAddress + uri); + } + + private void setResponseForInvalidUri(final HttpServletResponse response, final Throwable throwable) throws IOException { + LOGGER.log(Level.FINER, "Error while processing request.", throwable); + + final javax.ws.rs.core.Response.Status badRequest = javax.ws.rs.core.Response.Status.BAD_REQUEST; + if (configSetStatusOverSendError) { + response.reset(); + //noinspection deprecation + response.setStatus(badRequest.getStatusCode(), badRequest.getReasonPhrase()); + } else { + response.sendError(badRequest.getStatusCode(), badRequest.getReasonPhrase()); } } diff --git a/containers/jetty-http/src/test/java/org/glassfish/jersey/jetty/ExceptionTest.java b/containers/jetty-http/src/test/java/org/glassfish/jersey/jetty/ExceptionTest.java index e934e6e61a..e9b51726cc 100644 --- a/containers/jetty-http/src/test/java/org/glassfish/jersey/jetty/ExceptionTest.java +++ b/containers/jetty-http/src/test/java/org/glassfish/jersey/jetty/ExceptionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2021 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -16,6 +16,11 @@ package org.glassfish.jersey.jetty; +import org.apache.http.HttpHost; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.message.BasicHttpRequest; import org.junit.Test; import javax.ws.rs.GET; @@ -28,6 +33,7 @@ import javax.ws.rs.core.Response; import java.io.IOException; +import java.net.URI; import static org.junit.Assert.assertEquals; @@ -44,6 +50,19 @@ public String get(@PathParam("status") int status) { } + @Test + public void test400StatusCodeForIllegalSymbolsInURI() throws IOException { + startServer(ExceptionResource.class); + URI testUri = getUri().build(); + String incorrectFragment = "¶ms[0]=test_status"; + BasicHttpRequest request = new BasicHttpRequest("GET", testUri + incorrectFragment); + CloseableHttpClient client = HttpClientBuilder.create().build(); + + CloseableHttpResponse response = client.execute(new HttpHost(testUri.getHost(), testUri.getPort()), request); + + assertEquals(400, response.getStatusLine().getStatusCode()); + } + @Test public void test400StatusCode() throws IOException { startServer(ExceptionResource.class);