You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by re...@apache.org on 2022/06/07 00:41:36 UTC

[cxf] 02/02: CXF-8478: fixing jaxrs.ee.rs.container.requestcontext setRequestUriTwoUrisTest (#953)

This is an automated email from the ASF dual-hosted git repository.

reta pushed a commit to branch 3.6.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit c8011033a900075f60cf90d643023d16074ab6ca
Author: Andriy Redko <dr...@gmail.com>
AuthorDate: Mon Jun 6 20:32:47 2022 -0400

    CXF-8478: fixing jaxrs.ee.rs.container.requestcontext setRequestUriTwoUrisTest (#953)
    
    (cherry picked from commit e32d69cb12f6a2ee84980f1a12e00bcd0d3711dc)
---
 .../cxf/jaxrs/impl/ContainerRequestContextImpl.java   | 19 ++++++++++++++++++-
 .../java/org/apache/cxf/jaxrs/impl/UriInfoImpl.java   |  2 +-
 .../java/org/apache/cxf/jaxrs/utils/HttpUtils.java    | 14 ++++++++++++++
 .../org/apache/cxf/systest/jaxrs/BookServer20.java    |  2 ++
 .../systest/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 a13f6ee1ea..b3a65bae97 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.Request;
 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 class ContainerRequestContextImpl extends AbstractRequestContextImpl
             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 class ContainerRequestContextImpl extends AbstractRequestContextImpl
         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 ccce59ff28..47dc26e2ad 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 @@ public class UriInfoImpl implements UriInfo {
     }
 
     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 735b32538a..6230b887e6 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 final class HttpUtils {
         }
     }
 
+    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 9071b28ab4..8a052540a5 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 class BookServer20 extends AbstractServerTestServerBase {
 
             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 0f0f5e2b67..7d9dae6af6 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 class JAXRS20ClientServerBookTest extends AbstractBusClientServerTestBase
         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 {