Add X-Forwarded-For header support to Jetty
Add a `useForwardHeaders` property to allow embedded Jetty containers to respect X-Forwarded-For headers. Fixes gh-3802
This commit is contained in:
@@ -30,7 +30,9 @@ import java.util.Set;
|
||||
import org.eclipse.jetty.http.HttpVersion;
|
||||
import org.eclipse.jetty.http.MimeTypes;
|
||||
import org.eclipse.jetty.server.AbstractConnector;
|
||||
import org.eclipse.jetty.server.ConnectionFactory;
|
||||
import org.eclipse.jetty.server.Connector;
|
||||
import org.eclipse.jetty.server.ForwardedRequestCustomizer;
|
||||
import org.eclipse.jetty.server.HttpConfiguration;
|
||||
import org.eclipse.jetty.server.HttpConnectionFactory;
|
||||
import org.eclipse.jetty.server.SecureRequestCustomizer;
|
||||
@@ -97,6 +99,8 @@ public class JettyEmbeddedServletContainerFactory extends
|
||||
|
||||
private List<Configuration> configurations = new ArrayList<Configuration>();
|
||||
|
||||
private boolean useForwardHeaders;
|
||||
|
||||
private List<JettyServerCustomizer> jettyServerCustomizers = new ArrayList<JettyServerCustomizer>();
|
||||
|
||||
private ResourceLoader resourceLoader;
|
||||
@@ -153,6 +157,9 @@ public class JettyEmbeddedServletContainerFactory extends
|
||||
for (JettyServerCustomizer customizer : getServerCustomizers()) {
|
||||
customizer.customize(server);
|
||||
}
|
||||
if (this.useForwardHeaders) {
|
||||
new ForwardHeadersCustomizer().customize(server);
|
||||
}
|
||||
return getJettyEmbeddedServletContainer(server);
|
||||
}
|
||||
|
||||
@@ -449,6 +456,15 @@ public class JettyEmbeddedServletContainerFactory extends
|
||||
this.resourceLoader = resourceLoader;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set if x-forward-* headers should be processed.
|
||||
* @param useForwardHeaders if x-forward headers should be used
|
||||
* @since 1.3.0
|
||||
*/
|
||||
public void setUseForwardHeaders(boolean useForwardHeaders) {
|
||||
this.useForwardHeaders = useForwardHeaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets {@link JettyServerCustomizer}s that will be applied to the {@link Server}
|
||||
* before it is started. Calling this method will replace any existing configurations.
|
||||
@@ -669,4 +685,26 @@ public class JettyEmbeddedServletContainerFactory extends
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link JettyServerCustomizer} to add {@link ForwardedRequestCustomizer}. Only
|
||||
* supported with Jetty 9 (hence the inner class)
|
||||
*/
|
||||
private static class ForwardHeadersCustomizer implements JettyServerCustomizer {
|
||||
|
||||
@Override
|
||||
public void customize(Server server) {
|
||||
ForwardedRequestCustomizer customizer = new ForwardedRequestCustomizer();
|
||||
for (Connector connector : server.getConnectors()) {
|
||||
for (ConnectionFactory connectionFactory : connector
|
||||
.getConnectionFactories()) {
|
||||
if (connectionFactory instanceof HttpConfiguration.ConnectionFactory) {
|
||||
((HttpConfiguration.ConnectionFactory) connectionFactory)
|
||||
.getHttpConfiguration().addCustomizer(customizer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -183,6 +183,13 @@ public class JettyEmbeddedServletContainerFactoryTests extends
|
||||
assertThat(getJspServlet().getInitParameters(), is(equalTo(initParameters)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void useForwardHeaders() throws Exception {
|
||||
JettyEmbeddedServletContainerFactory factory = getFactory();
|
||||
factory.setUseForwardHeaders(true);
|
||||
assertForwardHeaderIsUsed(factory);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("serial")
|
||||
// Workaround for Jetty issue - https://bugs.eclipse.org/bugs/show_bug.cgi?id=470646
|
||||
|
||||
Reference in New Issue
Block a user