diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index 8ecbb4c9af..638136d8b0 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -35,6 +35,11 @@ spring-boot-starter-undertow true + + org.springframework.boot + spring-boot-starter-jetty + true + org.springframework spring-web diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/SpringBootHttpServerFactory.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/SpringBootHttpServerFactory.java index 2ccf160be9..b2e692bff4 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/SpringBootHttpServerFactory.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/SpringBootHttpServerFactory.java @@ -19,6 +19,10 @@ package org.springframework.cloud.contract.wiremock; import javax.servlet.ServletContext; import org.apache.catalina.connector.Connector; +import org.eclipse.jetty.server.ConnectionFactory; +import org.eclipse.jetty.server.HttpConfiguration; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanPostProcessor; @@ -37,11 +41,14 @@ import org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfigurat import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory; import org.springframework.boot.context.embedded.Ssl; +import org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory; +import org.springframework.boot.context.embedded.jetty.JettyServerCustomizer; import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; import org.springframework.boot.context.embedded.undertow.UndertowBuilderCustomizer; import org.springframework.boot.context.embedded.undertow.UndertowEmbeddedServletContainerFactory; import org.springframework.boot.context.event.ApplicationPreparedEvent; import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.cloud.contract.wiremock.ContainerConfiguration.JettyContainerConfiguration; import org.springframework.cloud.contract.wiremock.ContainerConfiguration.TomcatContainerConfiguration; import org.springframework.cloud.contract.wiremock.ContainerConfiguration.UndertowContainerConfiguration; import org.springframework.context.ApplicationListener; @@ -190,9 +197,10 @@ class SpringBootHttpServer } @Configuration -@Import({ TomcatContainerConfiguration.class, UndertowContainerConfiguration.class, ServerPropertiesAutoConfiguration.class, BeanPostProcessorsRegistrar.class, - ConfigurationPropertiesAutoConfiguration.class, JacksonAutoConfiguration.class, - HttpMessageConvertersAutoConfiguration.class, +@Import({ TomcatContainerConfiguration.class, JettyContainerConfiguration.class, + UndertowContainerConfiguration.class, ServerPropertiesAutoConfiguration.class, + BeanPostProcessorsRegistrar.class, ConfigurationPropertiesAutoConfiguration.class, + JacksonAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class }) class WiremockServerConfiguration { @@ -245,7 +253,7 @@ class ContainerConfiguration { @Configuration @ConditionalOnMissingBean(EmbeddedServletContainerFactory.class) - @ConditionalOnClass({TomcatEmbeddedServletContainerFactory.class, Connector.class}) + @ConditionalOnClass({ TomcatEmbeddedServletContainerFactory.class, Connector.class }) static class TomcatContainerConfiguration { @Autowired private Options options; @@ -270,7 +278,7 @@ class ContainerConfiguration { @Configuration @ConditionalOnMissingBean(EmbeddedServletContainerFactory.class) - @ConditionalOnClass({UndertowEmbeddedServletContainerFactory.class, Builder.class}) + @ConditionalOnClass({ UndertowEmbeddedServletContainerFactory.class, Builder.class }) static class UndertowContainerConfiguration { @Autowired private Options options; @@ -290,4 +298,42 @@ class ContainerConfiguration { } } + @Configuration + @ConditionalOnMissingBean(EmbeddedServletContainerFactory.class) + @ConditionalOnClass({ JettyEmbeddedServletContainerFactory.class, + ServerConnector.class }) + static class JettyContainerConfiguration { + @Autowired + private Options options; + + @Bean + public EmbeddedServletContainerFactory servletContainer() { + final JettyEmbeddedServletContainerFactory jetty = new JettyEmbeddedServletContainerFactory(); + if (this.options.httpsSettings().enabled()) { + jetty.addServerCustomizers(new JettyServerCustomizer() { + @Override + public void customize(Server server) { + server.addConnector(createStandardConnector(server)); + } + }); + } + return jetty; + } + + private org.eclipse.jetty.server.Connector createStandardConnector( + Server server) { + ServerConnector connector = new ServerConnector(server, -1, -1); + connector.setHost("localhost"); + connector.setPort(options.portNumber()); + for (ConnectionFactory connectionFactory : connector + .getConnectionFactories()) { + if (connectionFactory instanceof HttpConfiguration.ConnectionFactory) { + ((HttpConfiguration.ConnectionFactory) connectionFactory) + .getHttpConfiguration().setSendServerVersion(false); + } + } + return connector; + } + } + }