diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index b365d4608b..8ecbb4c9af 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -20,7 +20,6 @@ org.apache.httpcomponents httpclient - true org.springframework.boot @@ -31,6 +30,11 @@ spring-boot-starter-tomcat true + + org.springframework.boot + spring-boot-starter-undertow + 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 88cf0366d6..2ccf160be9 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 @@ -25,6 +25,8 @@ import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.Banner.Mode; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration; @@ -36,8 +38,12 @@ 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.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.TomcatContainerConfiguration; +import org.springframework.cloud.contract.wiremock.ContainerConfiguration.UndertowContainerConfiguration; import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; @@ -57,6 +63,8 @@ import com.github.tomakehurst.wiremock.http.RequestHandler; import com.github.tomakehurst.wiremock.http.StubRequestHandler; import com.github.tomakehurst.wiremock.servlet.WireMockHandlerDispatchingServlet; +import io.undertow.Undertow.Builder; + /** * @author Dave Syer * @@ -182,7 +190,7 @@ class SpringBootHttpServer } @Configuration -@Import({ ServerPropertiesAutoConfiguration.class, BeanPostProcessorsRegistrar.class, +@Import({ TomcatContainerConfiguration.class, UndertowContainerConfiguration.class, ServerPropertiesAutoConfiguration.class, BeanPostProcessorsRegistrar.class, ConfigurationPropertiesAutoConfiguration.class, JacksonAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class }) @@ -231,20 +239,55 @@ class WiremockServerConfiguration { }; } - @Bean - public EmbeddedServletContainerFactory servletContainer() { - // TODO support for other containers - TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); - if (this.options.httpsSettings().enabled()) { - tomcat.addAdditionalTomcatConnectors(createStandardConnector()); +} + +class ContainerConfiguration { + + @Configuration + @ConditionalOnMissingBean(EmbeddedServletContainerFactory.class) + @ConditionalOnClass({TomcatEmbeddedServletContainerFactory.class, Connector.class}) + static class TomcatContainerConfiguration { + @Autowired + private Options options; + + @Bean + public EmbeddedServletContainerFactory servletContainer() { + TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); + if (this.options.httpsSettings().enabled()) { + tomcat.addAdditionalTomcatConnectors(createStandardConnector()); + } + return tomcat; } - return tomcat; + + private Connector createStandardConnector() { + Connector connector = new Connector( + "org.apache.coyote.http11.Http11NioProtocol"); + connector.setPort(this.options.portNumber()); + return connector; + } + } - private Connector createStandardConnector() { - Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); - connector.setPort(this.options.portNumber()); - return connector; + @Configuration + @ConditionalOnMissingBean(EmbeddedServletContainerFactory.class) + @ConditionalOnClass({UndertowEmbeddedServletContainerFactory.class, Builder.class}) + static class UndertowContainerConfiguration { + @Autowired + private Options options; + + @Bean + public EmbeddedServletContainerFactory servletContainer() { + UndertowEmbeddedServletContainerFactory undertow = new UndertowEmbeddedServletContainerFactory(); + if (this.options.httpsSettings().enabled()) { + undertow.addBuilderCustomizers(new UndertowBuilderCustomizer() { + @Override + public void customize(Builder builder) { + builder.addHttpListener(options.portNumber(), "localhost"); + } + }); + } + return undertow; + } } } diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockExpectations.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockExpectations.java index 007f053b77..9a7381a537 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockExpectations.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockExpectations.java @@ -57,6 +57,15 @@ public class WireMockExpectations { return this; } + public WireMockExpectations prefix(String prefix) { + this.prefix = prefix; + return this; + } + public WireMockExpectations suffix(String suffix) { + this.suffix = suffix; + return this; + } + public MockRestServiceServer expect(String... locations) { for (String location : locations) { try {