From e32d69cb12f6a2ee84980f1a12e00bcd0d3711dc Mon Sep 17 00:00:00 2001 From: Andriy Redko Date: Mon, 6 Jun 2022 20:32:47 -0400 Subject: [PATCH] CXF-8478: fixing jaxrs.ee.rs.container.requestcontext setRequestUriTwoUrisTest (#953) --- .../impl/ContainerRequestContextImpl.java | 19 ++++++++++++++++++- .../apache/cxf/jaxrs/impl/UriInfoImpl.java | 2 +- .../org/apache/cxf/jaxrs/utils/HttpUtils.java | 14 ++++++++++++++ .../cxf/systest/jaxrs/BookServer20.java | 2 ++ .../jaxrs/JAXRS20ClientServerBookTest.java | 6 ++++++ 5 files changed, 41 insertions(+), 2 deletions(-) diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerRequestContextImpl.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerRequestContextImpl.java index a13f6ee1ea0..b3a65bae974 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerRequestContextImpl.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerRequestContextImpl.java @@ -28,6 +28,7 @@ import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.UriInfo; +import org.apache.cxf.common.util.StringUtils; import org.apache.cxf.helpers.IOUtils; import org.apache.cxf.io.DelegatingInputStream; import org.apache.cxf.jaxrs.utils.ExceptionUtils; @@ -38,6 +39,7 @@ public class ContainerRequestContextImpl extends AbstractRequestContextImpl implements ContainerRequestContext { private static final String ENDPOINT_ADDRESS_PROPERTY = "org.apache.cxf.transport.endpoint.address"; + private static final String ENDPOINT_URI_PROPERTY = "org.apache.cxf.transport.endpoint.uri"; private boolean preMatch; public ContainerRequestContextImpl(Message message, boolean preMatch, boolean responseContext) { @@ -108,7 +110,15 @@ public void setRequestUri(URI requestUri) throws IllegalStateException { String baseUriString = new UriInfoImpl(m).getBaseUri().toString(); String requestUriString = requestUri.toString(); if (!requestUriString.startsWith(baseUriString)) { - setRequestUri(requestUri, URI.create("/")); + String path = requestUri.getRawPath(); + if (StringUtils.isEmpty(path)) { + path = "/"; + } + String query = requestUri.getRawQuery(); + if (!StringUtils.isEmpty(query)) { + path = path + "?" + query; + } + setRequestUri(requestUri.resolve("/"), URI.create(path)); return; } requestUriString = requestUriString.substring(baseUriString.length()); @@ -139,7 +149,14 @@ public void setRequestUri(URI baseUri, URI requestUri) throws IllegalStateExcept if (servletRequest != null) { ((javax.servlet.http.HttpServletRequest)servletRequest) .setAttribute(ENDPOINT_ADDRESS_PROPERTY, baseUri.toString()); + + // The base URI and request URI should be treated differently + if (requestUri.isAbsolute() && baseUri.resolve("/").compareTo(requestUri.resolve("/")) != 0) { + ((javax.servlet.http.HttpServletRequest)servletRequest) + .setAttribute(ENDPOINT_URI_PROPERTY, requestUri.resolve("/")); + } } + } @Override diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriInfoImpl.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriInfoImpl.java index ccce59ff289..47dc26e2ad8 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriInfoImpl.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriInfoImpl.java @@ -219,7 +219,7 @@ private String doGetPath(boolean decode, boolean addSlash) { } private String getAbsolutePathAsString() { - String address = getBaseUri().toString(); + String address = URI.create(HttpUtils.getEndpointUri(message)).toString(); if (MessageUtils.isRequestor(message)) { return address; } diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java index 735b32538a3..6230b887e6f 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java @@ -485,6 +485,20 @@ public static String getBaseAddress(Message m) { } } + public static String getEndpointUri(Message m) { + final Object servletRequest = m.get(AbstractHTTPDestination.HTTP_REQUEST); + + if (servletRequest != null) { + final Object property = ((javax.servlet.http.HttpServletRequest)servletRequest) + .getAttribute("org.apache.cxf.transport.endpoint.uri"); + if (property != null) { + return property.toString(); + } + } + + return getEndpointAddress(m); + } + public static String getEndpointAddress(Message m) { String address; Destination d = m.getExchange().getDestination(); diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java index 9071b28ab4d..8a052540a55 100644 --- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java +++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java @@ -147,6 +147,8 @@ public void filter(ContainerRequestContext context) throws IOException { if ("wrongpath".equals(path)) { context.setRequestUri(URI.create("/bookstore/bookheaders/simple")); + } else if ("absolutepath".equals(path)) { + context.setRequestUri(URI.create("http://xx.yy:888/bookstore/bookheaders/simple?q=1")); } else if ("throwException".equals(path)) { context.setProperty("filterexception", "prematch"); throw new InternalServerErrorException( diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java index 0f0f5e2b675..7d9dae6af67 100644 --- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java +++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java @@ -355,6 +355,12 @@ public void testGetBookWrongPathAsync() throws Exception { String address = "http://localhost:" + PORT + "/wrongpath"; doTestGetBookAsync(address, false); } + + @Test + public void testGetBookAbsolutePathAsync() throws Exception { + String address = "http://localhost:" + PORT + "/absolutepath"; + doTestGetBookAsync(address, false); + } @Test public void testPostCollectionGenericEntity() throws Exception {