diff --git a/spring-cloud-gateway-server-mvc/pom.xml b/spring-cloud-gateway-server-mvc/pom.xml index e9f6b80c..ad20bf03 100644 --- a/spring-cloud-gateway-server-mvc/pom.xml +++ b/spring-cloud-gateway-server-mvc/pom.xml @@ -107,6 +107,16 @@ org.springframework.cloud spring-cloud-starter-stream-rabbit + + + io.projectreactor.netty + reactor-netty + + + org.springframework.boot + spring-boot-starter-webflux + + test diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfiguration.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfiguration.java index d515b906..37cd5245 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfiguration.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfiguration.java @@ -216,18 +216,19 @@ public class GatewayServerMvcAutoConfiguration { static final boolean REACTOR_NETTY = ClassUtils.isPresent("reactor.netty.http.client.HttpClient", null); static final boolean JDK = ClassUtils.isPresent("java.net.http.HttpClient", null); static final boolean HIGHER_PRIORITY = APACHE || JETTY || REACTOR_NETTY; + static final String SPRING_REDIRECTS_PROPERTY = "spring.http.client.redirects"; + static final String SPRING_HTTP_FACTORY_PROPERTY = "spring.http.client.factory"; @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { - HttpRedirects redirects = environment.getProperty("spring.http.client.settings.redirects", - HttpRedirects.class); + HttpRedirects redirects = environment.getProperty(SPRING_REDIRECTS_PROPERTY, HttpRedirects.class); if (redirects == null) { // the user hasn't set anything, change the default environment.getPropertySources() .addFirst(new MapPropertySource("gatewayHttpClientProperties", - Map.of("spring.http.client.settings.redirects", HttpRedirects.DONT_FOLLOW))); + Map.of(SPRING_REDIRECTS_PROPERTY, HttpRedirects.DONT_FOLLOW))); } - Factory factory = environment.getProperty("spring.http.client.settings.factory", Factory.class); + Factory factory = environment.getProperty(SPRING_HTTP_FACTORY_PROPERTY, Factory.class); boolean setJdkHttpClientProperties = false; if (factory == null && !HIGHER_PRIORITY) { diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java index 886a7429..0eb0ff71 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java @@ -142,11 +142,8 @@ public class GatewayServerMvcAutoConfigurationTests { @Test void gatewayHttpClientPropertiesWork() { ConfigurableApplicationContext context = new SpringApplicationBuilder(TestConfig.class) - .properties("spring.main.web-application-type=none", - "spring.cloud.gateway.mvc.http-client.connect-timeout=1s", - "spring.cloud.gateway.mvc.http-client.read-timeout=2s", - "spring.cloud.gateway.mvc.http-client.ssl-bundle=mybundle", - "spring.cloud.gateway.mvc.http-client.type=autodetect", + .properties("spring.main.web-application-type=none", "spring.http.client.connect-timeout=1s", + "spring.http.client.read-timeout=2s", "spring.http.client.ssl.bundle=mybundle", "spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert, "spring.ssl.bundle.pem.mybundle.keystore.key=" + key) .run(); @@ -201,7 +198,7 @@ public class GatewayServerMvcAutoConfigurationTests { @Test void settingHttpClientFactoryWorks() { ConfigurableApplicationContext context = new SpringApplicationBuilder(TestConfig.class) - .properties("spring.main.web-application-type=none", "spring.http.client.settings.factory=simple") + .properties("spring.main.web-application-type=none", "spring.http.client.factory=simple") .run(); ClientHttpRequestFactoryBuilder builder = context.getBean(ClientHttpRequestFactoryBuilder.class); assertThat(builder).isInstanceOf(SimpleClientHttpRequestFactoryBuilder.class); diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java index f72b1943..4efa9b8c 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java @@ -142,8 +142,7 @@ import static org.springframework.web.servlet.function.RequestPredicates.POST; import static org.springframework.web.servlet.function.RequestPredicates.path; @SuppressWarnings("unchecked") -@SpringBootTest( - properties = { "spring.cloud.gateway.mvc.http-client.type=jdk", "spring.cloud.gateway.function.enabled=false" }, +@SpringBootTest(properties = { "spring.http.client.factory=jdk", "spring.cloud.gateway.function.enabled=false" }, webEnvironment = WebEnvironment.RANDOM_PORT) @ContextConfiguration(initializers = HttpbinTestcontainers.class) @ExtendWith(OutputCaptureExtension.class) diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/AfterFilterFunctionsTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/AfterFilterFunctionsTests.java index a0ee50b8..cbb6e0a6 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/AfterFilterFunctionsTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/AfterFilterFunctionsTests.java @@ -60,58 +60,58 @@ class AfterFilterFunctionsTests { @Test void doesNotRemoveJsonAttributes() { restClient.get() - .uri("/anything/does_not/remove_json_attributes") - .exchange() - .expectStatus() - .isOk() - .expectBody(Map.class) - .consumeWith(res -> { - assertThat(res.getResponseBody()).containsEntry("foo", "bar"); - assertThat(res.getResponseBody()).containsEntry("baz", "qux"); - }); + .uri("/anything/does_not/remove_json_attributes") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + assertThat(res.getResponseBody()).containsEntry("foo", "bar"); + assertThat(res.getResponseBody()).containsEntry("baz", "qux"); + }); } @Test void removeJsonAttributesToAvoidBeingRecursive() { restClient.get() - .uri("/anything/remove_json_attributes_to_avoid_being_recursive") - .exchange() - .expectStatus() - .isOk() - .expectBody(Map.class) - .consumeWith(res -> { - assertThat(res.getResponseBody()).doesNotContainKey("foo"); - assertThat(res.getResponseBody()).containsEntry("baz", "qux"); - }); + .uri("/anything/remove_json_attributes_to_avoid_being_recursive") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + assertThat(res.getResponseBody()).doesNotContainKey("foo"); + assertThat(res.getResponseBody()).containsEntry("baz", "qux"); + }); } @Test void removeJsonAttributesRecursively() { restClient.get() - .uri("/anything/remove_json_attributes_recursively") - .exchange() - .expectStatus() - .isOk() - .expectBody(Map.class) - .consumeWith(res -> { - assertThat(res.getResponseBody()).containsKey("foo"); - assertThat((Map) res.getResponseBody().get("foo")).containsEntry("bar", "A"); - assertThat(res.getResponseBody()).containsEntry("quux", "C"); - assertThat(res.getResponseBody()).doesNotContainKey("qux"); - }); + .uri("/anything/remove_json_attributes_recursively") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + assertThat(res.getResponseBody()).containsKey("foo"); + assertThat((Map) res.getResponseBody().get("foo")).containsEntry("bar", "A"); + assertThat(res.getResponseBody()).containsEntry("quux", "C"); + assertThat(res.getResponseBody()).doesNotContainKey("qux"); + }); } @Test void raisedErrorWhenRemoveJsonAttributes() { restClient.get() - .uri("/anything/raised_error_when_remove_json_attributes") - .exchange() - .expectStatus() - .is5xxServerError() - .expectBody(String.class) - .consumeWith(res -> { - assertThat(res.getResponseBody()).isEqualTo("Failed to process JSON of response body."); - }); + .uri("/anything/raised_error_when_remove_json_attributes") + .exchange() + .expectStatus() + .is5xxServerError() + .expectBody(String.class) + .consumeWith(res -> { + assertThat(res.getResponseBody()).isEqualTo("Failed to process JSON of response body."); + }); } @SpringBootConfiguration