diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactory.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactory.java index 5bcce26fdc5..e4dd4952474 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactory.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactory.java @@ -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 configurations = new ArrayList(); + private boolean useForwardHeaders; + private List jettyServerCustomizers = new ArrayList(); 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); + } + } + } + } + + } + } diff --git a/spring-boot/src/test/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactoryTests.java b/spring-boot/src/test/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactoryTests.java index 180d1da9be9..4429641b1cc 100644 --- a/spring-boot/src/test/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactoryTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactoryTests.java @@ -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