FELIX-4923 : SslFilterResponse doesn 't take in account ssl-forward.header property. Apply patch from Antonio Sanso
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1754836 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/http/sslfilter/src/main/java/org/apache/felix/http/sslfilter/internal/SslFilter.java b/http/sslfilter/src/main/java/org/apache/felix/http/sslfilter/internal/SslFilter.java
index 877a555..0cdac9d 100644
--- a/http/sslfilter/src/main/java/org/apache/felix/http/sslfilter/internal/SslFilter.java
+++ b/http/sslfilter/src/main/java/org/apache/felix/http/sslfilter/internal/SslFilter.java
@@ -73,7 +73,7 @@
{
try
{
- httpResp = new SslFilterResponse(httpResp, httpReq);
+ httpResp = new SslFilterResponse(httpResp, httpReq, cfg);
// In case this fails, we fall back to the original HTTP request, which is better than nothing...
httpReq = new SslFilterRequest(httpReq, httpReq.getHeader(cfg.certHeader));
}
diff --git a/http/sslfilter/src/main/java/org/apache/felix/http/sslfilter/internal/SslFilterResponse.java b/http/sslfilter/src/main/java/org/apache/felix/http/sslfilter/internal/SslFilterResponse.java
index db4edce..62b6c15 100644
--- a/http/sslfilter/src/main/java/org/apache/felix/http/sslfilter/internal/SslFilterResponse.java
+++ b/http/sslfilter/src/main/java/org/apache/felix/http/sslfilter/internal/SslFilterResponse.java
@@ -21,6 +21,7 @@
import static org.apache.felix.http.sslfilter.internal.SslFilterConstants.HDR_LOCATION;
import static org.apache.felix.http.sslfilter.internal.SslFilterConstants.HDR_X_FORWARDED_PORT;
import static org.apache.felix.http.sslfilter.internal.SslFilterConstants.HDR_X_FORWARDED_PROTO;
+import static org.apache.felix.http.sslfilter.internal.SslFilterConstants.HDR_X_FORWARDED_SSL;
import static org.apache.felix.http.sslfilter.internal.SslFilterConstants.HTTP;
import static org.apache.felix.http.sslfilter.internal.SslFilterConstants.HTTPS;
import static org.apache.felix.http.sslfilter.internal.SslFilterConstants.HTTPS_PORT;
@@ -36,6 +37,8 @@
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
+import org.apache.felix.http.sslfilter.internal.SslFilter.ConfigHolder;
+
/**
* Provides a custom {@link HttpServletResponse} for use in SSL filter.
*/
@@ -48,7 +51,7 @@
private final String clientProto;
private final int clientPort;
- public SslFilterResponse(HttpServletResponse response, HttpServletRequest request) throws MalformedURLException
+ public SslFilterResponse(HttpServletResponse response, HttpServletRequest request, ConfigHolder config) throws MalformedURLException
{
super(response);
@@ -58,8 +61,10 @@
this.serverName = request.getServerName();
this.serverPort = request.getServerPort();
- String proto = request.getHeader(HDR_X_FORWARDED_PROTO);
- if (HTTP.equalsIgnoreCase(proto))
+ String value = request.getHeader(config.sslHeader);
+
+ if ((HDR_X_FORWARDED_PROTO.equalsIgnoreCase(config.sslHeader) && HTTP.equalsIgnoreCase(value)) ||
+ (HDR_X_FORWARDED_SSL.equalsIgnoreCase(config.sslHeader) && !config.sslValue.equalsIgnoreCase(value)))
{
// Not really a useful scenario: client is talking HTTP to proxy, and we should rewrite all HTTPS-based URLs...
this.clientProto = HTTP;
@@ -165,13 +170,6 @@
String actualProto = uri.getScheme();
-
- if (!this.serverProto.equalsIgnoreCase(actualProto))
- {
- // protocol is already correct
- return null;
- }
-
if (!this.serverName.equals(uri.getHost()))
{
// going to a different host
diff --git a/http/sslfilter/src/test/java/org/apache/felix/http/sslfilter/internal/SslFilterResponseTest.java b/http/sslfilter/src/test/java/org/apache/felix/http/sslfilter/internal/SslFilterResponseTest.java
index 17192d7..7910567 100644
--- a/http/sslfilter/src/test/java/org/apache/felix/http/sslfilter/internal/SslFilterResponseTest.java
+++ b/http/sslfilter/src/test/java/org/apache/felix/http/sslfilter/internal/SslFilterResponseTest.java
@@ -37,9 +37,11 @@
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-
+import org.apache.felix.http.sslfilter.internal.SslFilter.ConfigHolder;
import org.junit.Test;
+import static org.apache.felix.http.sslfilter.internal.SslFilterConstants.HDR_X_FORWARDED_PROTO;
+
public class SslFilterResponseTest
{
private static final String BACKEND_SERVER = "backend.server";
@@ -59,8 +61,9 @@
{
TestHttpServletResponse resp = createServletResponse();
HttpServletRequest req = createServletRequest(BACKEND_SERVER, PATH);
-
- SslFilterResponse sresp = new SslFilterResponse(resp, req);
+ ConfigHolder cfg = new ConfigHolder(HDR_X_FORWARDED_PROTO, "https", null);
+
+ SslFilterResponse sresp = new SslFilterResponse(resp, req, cfg);
sresp.setHeader(LOCATION, null);
@@ -74,8 +77,9 @@
TestHttpServletResponse resp = createServletResponse();
HttpServletRequest req = createServletRequest(BACKEND_SERVER, PATH);
-
- SslFilterResponse sresp = new SslFilterResponse(resp, req);
+ ConfigHolder cfg = new ConfigHolder(HDR_X_FORWARDED_PROTO, "https", null);
+
+ SslFilterResponse sresp = new SslFilterResponse(resp, req, cfg);
location = HTTPS + "://" + BACKEND_SERVER + "/foo";
expected = location;
@@ -93,7 +97,9 @@
TestHttpServletResponse resp = createServletResponse();
HttpServletRequest req = createServletRequest(BACKEND_SERVER, PATH);
- SslFilterResponse sresp = new SslFilterResponse(resp, req);
+ ConfigHolder cfg = new ConfigHolder(HDR_X_FORWARDED_PROTO, "https", null);
+
+ SslFilterResponse sresp = new SslFilterResponse(resp, req, cfg);
location = HTTP + "://" + BACKEND_SERVER + "/foo";
expected = HTTPS + "://" + BACKEND_SERVER + "/foo";
@@ -111,8 +117,9 @@
TestHttpServletResponse resp = createServletResponse();
HttpServletRequest req = createServletRequest(BACKEND_SERVER, PATH);
-
- SslFilterResponse sresp = new SslFilterResponse(resp, req);
+ ConfigHolder cfg = new ConfigHolder(HDR_X_FORWARDED_PROTO, "https", null);
+
+ SslFilterResponse sresp = new SslFilterResponse(resp, req, cfg);
location = HTTP + "://" + BACKEND_SERVER + "/foo#abc";
expected = HTTPS + "://" + BACKEND_SERVER + "/foo#abc";
@@ -130,8 +137,9 @@
TestHttpServletResponse resp = createServletResponse();
HttpServletRequest req = createServletRequest(BACKEND_SERVER, PATH);
-
- SslFilterResponse sresp = new SslFilterResponse(resp, req);
+ ConfigHolder cfg = new ConfigHolder(HDR_X_FORWARDED_PROTO, "https", null);
+
+ SslFilterResponse sresp = new SslFilterResponse(resp, req, cfg);
location = HTTP + "://" + BACKEND_SERVER + ":" + DEFAULT_HTTP_PORT + "/foo";
expected = HTTPS + "://" + BACKEND_SERVER + "/foo";
@@ -148,8 +156,9 @@
TestHttpServletResponse resp = createServletResponse();
HttpServletRequest req = createServletRequest(BACKEND_SERVER, DEFAULT_HTTP_PORT, HTTPS, ALT_HTTPS_PORT, PATH);
-
- SslFilterResponse sresp = new SslFilterResponse(resp, req);
+ ConfigHolder cfg = new ConfigHolder(HDR_X_FORWARDED_PROTO, "https", null);
+
+ SslFilterResponse sresp = new SslFilterResponse(resp, req, cfg);
location = HTTP + "://" + BACKEND_SERVER + "/foo";
expected = HTTPS + "://" + BACKEND_SERVER + ":" + ALT_HTTPS_PORT + "/foo";
@@ -166,8 +175,9 @@
TestHttpServletResponse resp = createServletResponse();
HttpServletRequest req = createServletRequest(BACKEND_SERVER, PATH);
-
- SslFilterResponse sresp = new SslFilterResponse(resp, req);
+ ConfigHolder cfg = new ConfigHolder(HDR_X_FORWARDED_PROTO, "https", null);
+
+ SslFilterResponse sresp = new SslFilterResponse(resp, req, cfg);
location = HTTP + "://" + BACKEND_SERVER + ":" + ALT_HTTP_PORT + "/foo";
expected = location;
@@ -182,8 +192,9 @@
{
TestHttpServletResponse resp = createServletResponse();
HttpServletRequest req = createServletRequest(BACKEND_SERVER, PATH);
-
- SslFilterResponse sresp = new SslFilterResponse(resp, req);
+ ConfigHolder cfg = new ConfigHolder(HDR_X_FORWARDED_PROTO, "https", null);
+
+ SslFilterResponse sresp = new SslFilterResponse(resp, req,cfg);
String location = HTTP + "://" + OTHER_SERVER + "/foo";
String expected = location;
@@ -198,8 +209,9 @@
{
TestHttpServletResponse response = createServletResponse();
HttpServletRequest req = createServletRequest(BACKEND_SERVER, PATH);
-
- SslFilterResponse sresp = new SslFilterResponse(response, req);
+ ConfigHolder cfg = new ConfigHolder(HDR_X_FORWARDED_PROTO, "https", null);
+
+ SslFilterResponse sresp = new SslFilterResponse(response, req, cfg);
final String queryString = "?resource=%2Fen.html%3FpbOpen%3Dtrue&$$login$$=%24%24login%24%24&j_reason=errors.login.account.not.found";
final String setUrl = "http://" + BACKEND_SERVER + "/" + queryString;
@@ -215,8 +227,9 @@
{
TestHttpServletResponse response = createServletResponse();
HttpServletRequest req = createServletRequest(BACKEND_SERVER, PATH);
-
- SslFilterResponse sresp = new SslFilterResponse(response, req);
+ ConfigHolder cfg = new ConfigHolder(HDR_X_FORWARDED_PROTO, "https", null);
+
+ SslFilterResponse sresp = new SslFilterResponse(response, req, cfg);
final String setUrl = "http://" + BACKEND_SERVER + "/apps/test/content/%E4%B8%83%E6%9C%88%E5%8F%B7.redirect";
sresp.setHeader(SslFilterConstants.HDR_LOCATION, setUrl);