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 2018/07/07 17:44:19 UTC

[cxf] 02/02: Adding test cases for multihost version of the X-Forwarded-For header

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

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

commit 5c1099e1ef68eb7b3126821711a65d8befb7f428
Author: reta <dr...@gmail.com>
AuthorDate: Sat Jul 7 13:02:45 2018 -0400

    Adding test cases for multihost version of the X-Forwarded-For header
---
 .../cxf/transport/servlet/AbstractHTTPServlet.java |  7 ++++++-
 .../cxf/systest/jaxrs/XForwardedServletFilter.java | 10 +++++++++-
 .../AbstractSwagger2ServiceDescriptionTest.java    | 23 +++++++++++++++++-----
 .../Swagger2XForwardedDescriptionTest.java         |  7 ++++++-
 .../SwaggerToOpenApiConversionTest.java            |  3 ++-
 5 files changed, 41 insertions(+), 9 deletions(-)

diff --git a/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java b/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java
index eee121c..3a3ea9d 100644
--- a/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java
+++ b/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java
@@ -484,7 +484,12 @@ public abstract class AbstractHTTPServlet extends HttpServlet implements Filter
                 newRemoteAddr = (originalRemoteAddr.split(",")[0]).trim();
             }
             newRequestUri = calculateNewRequestUri(request, originalPrefix);
-            String outermostHost = (originalHost.split(",")[0]).trim();
+            // Although per Mozilla documentation 
+            // (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Host) 
+            // it should contain one value, Apache's mod_proxy says the comma separated list could 
+            // be returned (http://httpd.apache.org/docs/2.2/mod/mod_proxy.html). We don't need
+            // more than 2 components.
+            String outermostHost = originalHost != null ? (originalHost.split(",", 2)[0]).trim() : originalHost;
             newRequestUrl = calculateNewRequestUrl(request, 
                                                    originalProto, 
                                                    originalPrefix,
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/XForwardedServletFilter.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/XForwardedServletFilter.java
index 180921b..1703ca8 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/XForwardedServletFilter.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/XForwardedServletFilter.java
@@ -43,6 +43,8 @@ public class XForwardedServletFilter implements Filter {
         HttpServletRequest httpReq = (HttpServletRequest)req;
         if (httpReq.getHeader("USE_XFORWARDED") != null) {
             httpReq = new HttpServletRequestXForwardedFilter(httpReq);
+        } else if (httpReq.getHeader("USE_XFORWARDED_MANY_HOSTS") != null) {
+            httpReq = new HttpServletRequestXForwardedFilter(httpReq, true);
         }
         chain.doFilter(httpReq, resp);
     }
@@ -54,9 +56,15 @@ public class XForwardedServletFilter implements Filter {
     }
 
     private static class HttpServletRequestXForwardedFilter extends HttpServletRequestWrapper {
+        private final boolean multihost;
 
         HttpServletRequestXForwardedFilter(HttpServletRequest request) {
+            this(request, false);
+        }
+
+        HttpServletRequestXForwardedFilter(HttpServletRequest request, boolean multihost) {
             super(request);
+            this.multihost = multihost;
         }
 
         @Override
@@ -70,7 +78,7 @@ public class XForwardedServletFilter implements Filter {
             } else if ("X-Forwarded-Port".equals(name)) {
                 return "8090";
             } else if ("X-Forwarded-Host".equals(name)) {
-                return "external";
+                return !multihost ? "external" : "external1, external2, external3";
             } else { 
                 return super.getHeader(name);
             }
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/AbstractSwagger2ServiceDescriptionTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/AbstractSwagger2ServiceDescriptionTest.java
index 979a8ba..b39b5c6 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/AbstractSwagger2ServiceDescriptionTest.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/AbstractSwagger2ServiceDescriptionTest.java
@@ -62,6 +62,16 @@ import static org.hamcrest.CoreMatchers.equalTo;
 public abstract class AbstractSwagger2ServiceDescriptionTest extends AbstractBusClientServerTestBase {
     static final String SECURITY_DEFINITION_NAME = "basicAuth";
     
+    protected enum XForwarded {
+        NONE,
+        ONE_HOST,
+        MANY_HOSTS;
+        
+        boolean isSet() {
+            return this != NONE;
+        }
+    }
+    
     private static final String CONTACT = "cxf@apache.org";
     private static final String TITLE = "CXF unittest";
     private static final String DESCRIPTION = "API Description";
@@ -131,23 +141,26 @@ public abstract class AbstractSwagger2ServiceDescriptionTest extends AbstractBus
     protected abstract String getExpectedFileYaml();
 
     protected void doTestApiListingIsProperlyReturnedJSON() throws Exception {
-        doTestApiListingIsProperlyReturnedJSON(false);
+        doTestApiListingIsProperlyReturnedJSON(XForwarded.NONE);
     }
-    protected void doTestApiListingIsProperlyReturnedJSON(boolean useXForwarded) throws Exception {
+    protected void doTestApiListingIsProperlyReturnedJSON(XForwarded useXForwarded) throws Exception {
         doTestApiListingIsProperlyReturnedJSON(createWebClient("/swagger.json"), 
                                                useXForwarded);
         checkUiResource();
     }
     protected static void doTestApiListingIsProperlyReturnedJSON(final WebClient client,
-                                                          boolean useXForwarded) throws Exception {    
-        if (useXForwarded) {
+                                                          XForwarded useXForwarded) throws Exception {    
+        if (useXForwarded == XForwarded.ONE_HOST) {
             client.header("USE_XFORWARDED", true);
+        } else if (useXForwarded == XForwarded.MANY_HOSTS) {
+            client.header("USE_XFORWARDED_MANY_HOSTS", true);
         }
+        
         try {
             String swaggerJson = client.get(String.class);
             UserApplication ap = SwaggerParseUtils.getUserApplicationFromJson(swaggerJson);
             assertNotNull(ap);
-            assertEquals(useXForwarded ? "/reverse" : "/", ap.getBasePath());
+            assertEquals(useXForwarded.isSet() ? "/reverse" : "/", ap.getBasePath());
             
             List<UserResource> urs = ap.getResources();
             assertNotNull(urs);
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/Swagger2XForwardedDescriptionTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/Swagger2XForwardedDescriptionTest.java
index f635a06..5f2497e 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/Swagger2XForwardedDescriptionTest.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/Swagger2XForwardedDescriptionTest.java
@@ -40,7 +40,12 @@ public class Swagger2XForwardedDescriptionTest extends AbstractSwagger2ServiceDe
     
     @Test
     public void testApiListingIsProperlyReturnedJSONXForwarded() throws Exception {
-        doTestApiListingIsProperlyReturnedJSON(true);
+        doTestApiListingIsProperlyReturnedJSON(XForwarded.ONE_HOST);
+    }
+    
+    @Test
+    public void testApiListingIsProperlyReturnedJSONXForwardedManyHosts() throws Exception {
+        doTestApiListingIsProperlyReturnedJSON(XForwarded.MANY_HOSTS);
     }
 
     @Override
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/SwaggerToOpenApiConversionTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/SwaggerToOpenApiConversionTest.java
index 33f4de3..79f6cc8 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/SwaggerToOpenApiConversionTest.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/SwaggerToOpenApiConversionTest.java
@@ -33,6 +33,7 @@ import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
 import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
 import org.apache.cxf.jaxrs.swagger.Swagger2Feature;
 import org.apache.cxf.jaxrs.swagger.openapi.SwaggerToOpenApiConversionFilter;
+import org.apache.cxf.systest.jaxrs.description.AbstractSwagger2ServiceDescriptionTest.XForwarded;
 import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
 import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
 
@@ -265,6 +266,6 @@ public class SwaggerToOpenApiConversionTest extends AbstractBusClientServerTestB
     
     private void doTestSwagger2JSON() throws Exception {    
         final WebClient client = createWebClient("/swagger.json");
-        AbstractSwagger2ServiceDescriptionTest.doTestApiListingIsProperlyReturnedJSON(client, false);
+        AbstractSwagger2ServiceDescriptionTest.doTestApiListingIsProperlyReturnedJSON(client, XForwarded.NONE);
     }
 }