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);
}
}