diff --git a/spring-cloud-gateway-integration-tests/grpc/src/main/java/org/springframework/cloud/gateway/tests/grpc/GRPCApplication.java b/spring-cloud-gateway-integration-tests/grpc/src/main/java/org/springframework/cloud/gateway/tests/grpc/GRPCApplication.java index 241a851f..3018393a 100644 --- a/spring-cloud-gateway-integration-tests/grpc/src/main/java/org/springframework/cloud/gateway/tests/grpc/GRPCApplication.java +++ b/spring-cloud-gateway-integration-tests/grpc/src/main/java/org/springframework/cloud/gateway/tests/grpc/GRPCApplication.java @@ -107,7 +107,7 @@ public class GRPCApplication { public void hello(HelloRequest request, StreamObserver responseObserver) { if ("failWithRuntimeException!".equals(request.getFirstName())) { StatusRuntimeException exception = Status.FAILED_PRECONDITION.withDescription("Invalid firstName") - .asRuntimeException(); + .asRuntimeException(); responseObserver.onError(exception); responseObserver.onCompleted(); return; diff --git a/spring-cloud-gateway-integration-tests/grpc/src/test/java/org/springframework/cloud/gateway/tests/grpc/GRPCApplicationTests.java b/spring-cloud-gateway-integration-tests/grpc/src/test/java/org/springframework/cloud/gateway/tests/grpc/GRPCApplicationTests.java index e5a6bbcb..e1bfe7bd 100644 --- a/spring-cloud-gateway-integration-tests/grpc/src/test/java/org/springframework/cloud/gateway/tests/grpc/GRPCApplicationTests.java +++ b/spring-cloud-gateway-integration-tests/grpc/src/test/java/org/springframework/cloud/gateway/tests/grpc/GRPCApplicationTests.java @@ -59,7 +59,7 @@ public class GRPCApplicationTests { ManagedChannel channel = createSecuredChannel(gatewayPort); final HelloResponse response = HelloServiceGrpc.newBlockingStub(channel) - .hello(HelloRequest.newBuilder().setFirstName("Sir").setLastName("FromClient").build()); + .hello(HelloRequest.newBuilder().setFirstName("Sir").setLastName("FromClient").build()); Assertions.assertThat(response.getGreeting()).isEqualTo("Hello, Sir FromClient"); } @@ -67,9 +67,11 @@ public class GRPCApplicationTests { private ManagedChannel createSecuredChannel(int port) throws SSLException { TrustManager[] trustAllCerts = createTrustAllTrustManager(); - return NettyChannelBuilder.forAddress("localhost", port).useTransportSecurity() - .sslContext(GrpcSslContexts.forClient().trustManager(trustAllCerts[0]).build()).negotiationType(TLS) - .build(); + return NettyChannelBuilder.forAddress("localhost", port) + .useTransportSecurity() + .sslContext(GrpcSslContexts.forClient().trustManager(trustAllCerts[0]).build()) + .negotiationType(TLS) + .build(); } @Test @@ -78,7 +80,7 @@ public class GRPCApplicationTests { try { HelloServiceGrpc.newBlockingStub(channel) - .hello(HelloRequest.newBuilder().setFirstName("failWithRuntimeException!").build()); + .hello(HelloRequest.newBuilder().setFirstName("failWithRuntimeException!").build()); } catch (StatusRuntimeException e) { Assertions.assertThat(FAILED_PRECONDITION.getCode()).isEqualTo(e.getStatus().getCode()); diff --git a/spring-cloud-gateway-integration-tests/grpc/src/test/java/org/springframework/cloud/gateway/tests/grpc/JsonToGrpcApplicationTests.java b/spring-cloud-gateway-integration-tests/grpc/src/test/java/org/springframework/cloud/gateway/tests/grpc/JsonToGrpcApplicationTests.java index 95af1853..e23bde59 100644 --- a/spring-cloud-gateway-integration-tests/grpc/src/test/java/org/springframework/cloud/gateway/tests/grpc/JsonToGrpcApplicationTests.java +++ b/spring-cloud-gateway-integration-tests/grpc/src/test/java/org/springframework/cloud/gateway/tests/grpc/JsonToGrpcApplicationTests.java @@ -74,8 +74,10 @@ public class JsonToGrpcApplicationTests { configurer.addRoute(grpcServerPort, "/json/hello", "JsonToGrpc=file:src/main/proto/hello.pb,file:src/main/proto/hello.proto,HelloService,hello"); - String response = restTemplate.postForEntity("https://localhost:" + this.gatewayPort + "/json/hello", - "{\"firstName\":\"Duff\", \"lastName\":\"McKagan\"}", String.class).getBody(); + String response = restTemplate + .postForEntity("https://localhost:" + this.gatewayPort + "/json/hello", + "{\"firstName\":\"Duff\", \"lastName\":\"McKagan\"}", String.class) + .getBody(); Assertions.assertThat(response).isNotNull(); Assertions.assertThat(response).contains("{\"greeting\":\"Hello, Duff McKagan\"}"); @@ -94,7 +96,9 @@ public class JsonToGrpcApplicationTests { NoopHostnameVerifier.INSTANCE); Registry socketFactoryRegistry = RegistryBuilder.create() - .register("https", sslSocketFactory).register("http", new PlainConnectionSocketFactory()).build(); + .register("https", sslSocketFactory) + .register("http", new PlainConnectionSocketFactory()) + .build(); HttpClientConnectionManager connectionManager = new BasicHttpClientConnectionManager(socketFactoryRegistry); CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).build(); diff --git a/spring-cloud-gateway-integration-tests/grpc/src/test/java/org/springframework/cloud/gateway/tests/grpc/RouteConfigurer.java b/spring-cloud-gateway-integration-tests/grpc/src/test/java/org/springframework/cloud/gateway/tests/grpc/RouteConfigurer.java index a2994833..03ffb152 100644 --- a/spring-cloud-gateway-integration-tests/grpc/src/test/java/org/springframework/cloud/gateway/tests/grpc/RouteConfigurer.java +++ b/spring-cloud-gateway-integration-tests/grpc/src/test/java/org/springframework/cloud/gateway/tests/grpc/RouteConfigurer.java @@ -101,7 +101,9 @@ public class RouteConfigurer { NoopHostnameVerifier.INSTANCE); Registry socketFactoryRegistry = RegistryBuilder.create() - .register("https", sslSocketFactory).register("http", new PlainConnectionSocketFactory()).build(); + .register("https", sslSocketFactory) + .register("http", new PlainConnectionSocketFactory()) + .build(); HttpClientConnectionManager connectionManager = new BasicHttpClientConnectionManager(socketFactoryRegistry); CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).build(); diff --git a/spring-cloud-gateway-integration-tests/http2/src/main/java/org/springframework/cloud/gateway/tests/http2/Http2Application.java b/spring-cloud-gateway-integration-tests/http2/src/main/java/org/springframework/cloud/gateway/tests/http2/Http2Application.java index 0fe5ed34..30a62c98 100644 --- a/spring-cloud-gateway-integration-tests/http2/src/main/java/org/springframework/cloud/gateway/tests/http2/Http2Application.java +++ b/spring-cloud-gateway-integration-tests/http2/src/main/java/org/springframework/cloud/gateway/tests/http2/Http2Application.java @@ -54,10 +54,12 @@ public class Http2Application { @Bean public RouteLocator myRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route(r -> r.path("/myprefix/**").filters(f -> f.stripPrefix(1)).uri("lb://myservice")) - .route(r -> r.path("/nossl/**").filters(f -> f.stripPrefix(1)).uri("lb://nossl")) - .route(r -> r.path("/neverssl/**").filters(f -> f.stripPrefix(1)).uri("http://neverssl.com")) - .route(r -> r.path("/httpbin/**").uri("https://nghttp2.org")).build(); + return builder.routes() + .route(r -> r.path("/myprefix/**").filters(f -> f.stripPrefix(1)).uri("lb://myservice")) + .route(r -> r.path("/nossl/**").filters(f -> f.stripPrefix(1)).uri("lb://nossl")) + .route(r -> r.path("/neverssl/**").filters(f -> f.stripPrefix(1)).uri("http://neverssl.com")) + .route(r -> r.path("/httpbin/**").uri("https://nghttp2.org")) + .build(); } public static void main(String[] args) { diff --git a/spring-cloud-gateway-integration-tests/http2/src/test/java/org/springframework/cloud/gateway/tests/http2/Http2ApplicationTests.java b/spring-cloud-gateway-integration-tests/http2/src/test/java/org/springframework/cloud/gateway/tests/http2/Http2ApplicationTests.java index f609a031..879e0c47 100644 --- a/spring-cloud-gateway-integration-tests/http2/src/test/java/org/springframework/cloud/gateway/tests/http2/Http2ApplicationTests.java +++ b/spring-cloud-gateway-integration-tests/http2/src/test/java/org/springframework/cloud/gateway/tests/http2/Http2ApplicationTests.java @@ -74,13 +74,17 @@ public class Http2ApplicationTests { static HttpClient getHttpClient() { return HttpClient - .create(ConnectionProvider.builder("test").maxConnections(100) - .pendingAcquireTimeout(Duration.ofMillis(0)).pendingAcquireMaxCount(-1).build()) - .protocol(HttpProtocol.HTTP11, HttpProtocol.H2).secure(sslContextSpec -> { - Http2SslContextSpec clientSslCtxt = Http2SslContextSpec.forClient() - .configure(builder -> builder.trustManager(InsecureTrustManagerFactory.INSTANCE)); - sslContextSpec.sslContext(clientSslCtxt); - }); + .create(ConnectionProvider.builder("test") + .maxConnections(100) + .pendingAcquireTimeout(Duration.ofMillis(0)) + .pendingAcquireMaxCount(-1) + .build()) + .protocol(HttpProtocol.HTTP11, HttpProtocol.H2) + .secure(sslContextSpec -> { + Http2SslContextSpec clientSslCtxt = Http2SslContextSpec.forClient() + .configure(builder -> builder.trustManager(InsecureTrustManagerFactory.INSTANCE)); + sslContextSpec.sslContext(clientSslCtxt); + }); } } diff --git a/spring-cloud-gateway-integration-tests/http2/src/test/java/org/springframework/cloud/gateway/tests/http2/nossl/NosslTests.java b/spring-cloud-gateway-integration-tests/http2/src/test/java/org/springframework/cloud/gateway/tests/http2/nossl/NosslTests.java index 78d71e2f..b5eda67c 100644 --- a/spring-cloud-gateway-integration-tests/http2/src/test/java/org/springframework/cloud/gateway/tests/http2/nossl/NosslTests.java +++ b/spring-cloud-gateway-integration-tests/http2/src/test/java/org/springframework/cloud/gateway/tests/http2/nossl/NosslTests.java @@ -64,7 +64,9 @@ public class NosslTests { System.err.println("nossl.port = " + nosslPort); Hooks.onOperatorDebug(); try (ConfigurableApplicationContext context = new SpringApplicationBuilder(NosslConfiguration.class) - .properties("server.port=" + nosslPort).profiles("nossl").run()) { + .properties("server.port=" + nosslPort) + .profiles("nossl") + .run()) { String uri = "https://localhost:" + port + "/nossl"; String expected = "nossl"; assertResponse(uri, expected); diff --git a/spring-cloud-gateway-integration-tests/mvc-failure-analyzer/src/main/java/org/springframework/cloud/gateway/sample/MvcFailureAnalyzerApplication.java b/spring-cloud-gateway-integration-tests/mvc-failure-analyzer/src/main/java/org/springframework/cloud/gateway/sample/MvcFailureAnalyzerApplication.java index 7c23213b..1e69b33d 100644 --- a/spring-cloud-gateway-integration-tests/mvc-failure-analyzer/src/main/java/org/springframework/cloud/gateway/sample/MvcFailureAnalyzerApplication.java +++ b/spring-cloud-gateway-integration-tests/mvc-failure-analyzer/src/main/java/org/springframework/cloud/gateway/sample/MvcFailureAnalyzerApplication.java @@ -47,8 +47,9 @@ public class MvcFailureAnalyzerApplication { @Bean @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE) public RouteLocator myRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route(r -> r.path("/myprefix/**").filters(f -> f.stripPrefix(1)).uri("lb://myservice")) - .build(); + return builder.routes() + .route(r -> r.path("/myprefix/**").filters(f -> f.stripPrefix(1)).uri("lb://myservice")) + .build(); } } diff --git a/spring-cloud-gateway-integration-tests/mvc-failure-analyzer/src/test/java/org/springframework/cloud/gateway/sample/MvcFailureAnalyzerApplicationTests.java b/spring-cloud-gateway-integration-tests/mvc-failure-analyzer/src/test/java/org/springframework/cloud/gateway/sample/MvcFailureAnalyzerApplicationTests.java index d6528f40..ea702715 100644 --- a/spring-cloud-gateway-integration-tests/mvc-failure-analyzer/src/test/java/org/springframework/cloud/gateway/sample/MvcFailureAnalyzerApplicationTests.java +++ b/spring-cloud-gateway-integration-tests/mvc-failure-analyzer/src/test/java/org/springframework/cloud/gateway/sample/MvcFailureAnalyzerApplicationTests.java @@ -40,7 +40,7 @@ public class MvcFailureAnalyzerApplicationTests { @Test public void exceptionThrown(CapturedOutput output) { assertThatThrownBy(() -> new SpringApplication(MvcFailureAnalyzerApplication.class).run("--server.port=0")) - .hasRootCauseInstanceOf(MvcFoundOnClasspathException.class); + .hasRootCauseInstanceOf(MvcFoundOnClasspathException.class); assertThat(output).contains(MvcFoundOnClasspathFailureAnalyzer.MESSAGE, MvcFoundOnClasspathFailureAnalyzer.ACTION); } @@ -48,7 +48,7 @@ public class MvcFailureAnalyzerApplicationTests { @Test public void exceptionNotThrownWhenDisabled(CapturedOutput output) { assertThatCode(() -> new SpringApplication(MvcFailureAnalyzerApplication.class) - .run("--spring.cloud.gateway.enabled=false", "--server.port=0")).doesNotThrowAnyException(); + .run("--spring.cloud.gateway.enabled=false", "--server.port=0")).doesNotThrowAnyException(); assertThat(output).doesNotContain(MvcFoundOnClasspathFailureAnalyzer.MESSAGE, MvcFoundOnClasspathFailureAnalyzer.ACTION); } @@ -57,11 +57,16 @@ public class MvcFailureAnalyzerApplicationTests { public void exceptionNotThrownWhenReactiveTypeSet(CapturedOutput output) { assertThatCode(() -> { ConfigurableApplicationContext context = new SpringApplication(MvcFailureAnalyzerApplication.class) - .run("--spring.main.web-application-type=reactive", "--server.port=0", "--debug=true"); + .run("--spring.main.web-application-type=reactive", "--server.port=0", "--debug=true"); Integer port = context.getEnvironment().getProperty("local.server.port", Integer.class); WebTestClient client = WebTestClient.bindToServer().baseUrl("http://localhost:" + port).build(); - client.get().uri("/myprefix/hello").exchange().expectStatus().isOk().expectBody(String.class) - .isEqualTo("Hello"); + client.get() + .uri("/myprefix/hello") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("Hello"); context.close(); }).doesNotThrowAnyException(); assertThat(output).doesNotContain(MvcFoundOnClasspathFailureAnalyzer.MESSAGE, diff --git a/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java b/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java index e998e029..00cbec88 100644 --- a/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java +++ b/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java @@ -280,8 +280,8 @@ public class ProxyExchange { HttpServletRequest request = this.webRequest.getNativeRequest(HttpServletRequest.class); HttpServletResponse response = this.webRequest.getNativeResponse(HttpServletResponse.class); try { - request.getRequestDispatcher(path).forward(new BodyForwardingHttpServletRequest(request, response), - response); + request.getRequestDispatcher(path) + .forward(new BodyForwardingHttpServletRequest(request, response), response); } catch (Exception e) { throw new IllegalStateException("Cannot forward request", e); @@ -363,8 +363,9 @@ public class ProxyExchange { ArrayList headerNames = new ArrayList<>(); webRequest.getHeaderNames().forEachRemaining(headerNames::add); Set filteredKeys = filterHeaderKeys(headerNames); - filteredKeys.stream().filter(key -> !headers.containsKey(key)) - .forEach(header -> headers.addAll(header, Arrays.asList(webRequest.getHeaderValues(header)))); + filteredKeys.stream() + .filter(key -> !headers.containsKey(key)) + .forEach(header -> headers.addAll(header, Arrays.asList(webRequest.getHeaderValues(header)))); } private BodyBuilder headers(BodyBuilder builder) { @@ -382,8 +383,9 @@ public class ProxyExchange { private Set filterHeaderKeys(Collection headerNames) { final Set excludedHeaders = this.excluded != null ? this.excluded : Collections.emptySet(); - return headerNames.stream().filter(header -> !excludedHeaders.contains(header.toLowerCase())) - .collect(Collectors.toSet()); + return headerNames.stream() + .filter(header -> !excludedHeaders.contains(header.toLowerCase())) + .collect(Collectors.toSet()); } private void proxy() { diff --git a/spring-cloud-gateway-mvc/src/test/java/org/springframework/cloud/gateway/mvc/ProductionConfigurationTests.java b/spring-cloud-gateway-mvc/src/test/java/org/springframework/cloud/gateway/mvc/ProductionConfigurationTests.java index 4b2188e8..96c2e917 100644 --- a/spring-cloud-gateway-mvc/src/test/java/org/springframework/cloud/gateway/mvc/ProductionConfigurationTests.java +++ b/spring-cloud-gateway-mvc/src/test/java/org/springframework/cloud/gateway/mvc/ProductionConfigurationTests.java @@ -109,7 +109,7 @@ public class ProductionConfigurationTests { @Test public void post() { assertThat(rest.postForObject("/proxy/0", Collections.singletonMap("name", "foo"), Bar.class).getName()) - .isEqualTo("host=localhost:" + port + ";foo"); + .isEqualTo("host=localhost:" + port + ";foo"); } @Test @@ -124,7 +124,7 @@ public class ProductionConfigurationTests { headers.setContentLength(json.length()); var request = new HttpEntity<>(json, headers); assertThat(rest.postForEntity("/proxy/checkContentLength", request, Void.class).getStatusCode()) - .isEqualTo(HttpStatus.OK); + .isEqualTo(HttpStatus.OK); } @Test @@ -143,7 +143,7 @@ public class ProductionConfigurationTests { public void postForwardHeader() { ResponseEntity> result = rest.exchange( RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/forward/special/bars")) - .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), + .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), new ParameterizedTypeReference>() { }); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); @@ -153,20 +153,17 @@ public class ProductionConfigurationTests { @Test public void postForwardBody() { ResponseEntity result = rest - .exchange( - RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/forward/body/bars")) - .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), - String.class); + .exchange(RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/forward/body/bars")) + .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), String.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(result.getBody()).contains("foo"); } @Test public void postForwardForgetBody() { - ResponseEntity result = rest.exchange( - RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/forward/forget/bars")) - .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), - String.class); + ResponseEntity result = rest + .exchange(RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/forward/forget/bars")) + .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), String.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(result.getBody()).contains("foo"); } @@ -175,7 +172,7 @@ public class ProductionConfigurationTests { public void postForwardBodyFoo() { ResponseEntity> result = rest.exchange( RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/forward/body/bars")) - .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), + .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), new ParameterizedTypeReference>() { }); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); @@ -186,44 +183,62 @@ public class ProductionConfigurationTests { public void list() { assertThat(rest.exchange( RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy")) - .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), + .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), new ParameterizedTypeReference>() { - }).getBody().iterator().next().getName()).isEqualTo("host=localhost:" + port + ";foo"); + }) + .getBody() + .iterator() + .next() + .getName()).isEqualTo("host=localhost:" + port + ";foo"); } @Test public void bodyless() { assertThat(rest.postForObject("/proxy/0", Collections.singletonMap("name", "foo"), Bar.class).getName()) - .isEqualTo("host=localhost:" + port + ";foo"); + .isEqualTo("host=localhost:" + port + ";foo"); } @Test public void entity() { assertThat( - rest.exchange(RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/entity")) - .body(Collections.singletonMap("name", "foo")), new ParameterizedTypeReference>() { - }).getBody().iterator().next().getName()).isEqualTo("host=localhost:" + port + ";foo"); + rest.exchange( + RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/entity")) + .body(Collections.singletonMap("name", "foo")), + new ParameterizedTypeReference>() { + }) + .getBody() + .iterator() + .next() + .getName()) + .isEqualTo("host=localhost:" + port + ";foo"); } @Test public void entityWithType() { assertThat( - rest.exchange(RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/type")) - .body(Collections.singletonMap("name", "foo")), new ParameterizedTypeReference>() { - }).getBody().iterator().next().getName()).isEqualTo("host=localhost:" + port + ";foo"); + rest.exchange( + RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/type")) + .body(Collections.singletonMap("name", "foo")), + new ParameterizedTypeReference>() { + }) + .getBody() + .iterator() + .next() + .getName()) + .isEqualTo("host=localhost:" + port + ";foo"); } @Test public void single() { assertThat(rest.postForObject("/proxy/single", Collections.singletonMap("name", "foobar"), Bar.class).getName()) - .isEqualTo("host=localhost:" + port + ";foobar"); + .isEqualTo("host=localhost:" + port + ";foobar"); } @Test public void converter() { assertThat( rest.postForObject("/proxy/converter", Collections.singletonMap("name", "foobar"), Bar.class).getName()) - .isEqualTo("host=localhost:" + port + ";foobar"); + .isEqualTo("host=localhost:" + port + ";foobar"); } @Test @@ -254,8 +269,11 @@ public class ProductionConfigurationTests { @SuppressWarnings({ "Duplicates", "unchecked" }) public void testSensitiveHeadersOverride() { RequestEntity request = RequestEntity - .get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers")).header("foo", "bar") - .header("abc", "xyz").header("cookie", "monster").build(); + .get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers")) + .header("foo", "bar") + .header("abc", "xyz") + .header("cookie", "monster") + .build(); Map> headers = rest.exchange(request, Map.class).getBody(); assertThat(headers).doesNotContainKey("foo").doesNotContainKey("hello").containsKeys("bar", "abc"); @@ -265,9 +283,12 @@ public class ProductionConfigurationTests { @Test @SuppressWarnings({ "Duplicates", "unchecked" }) public void testSensitiveHeadersDefault() { - Map> headers = rest.exchange(RequestEntity + Map> headers = rest + .exchange(RequestEntity .get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/sensitive-headers-default")) - .header("cookie", "monster").build(), Map.class).getBody(); + .header("cookie", "monster") + .build(), Map.class) + .getBody(); assertThat(headers).doesNotContainKey("cookie"); } @@ -276,9 +297,12 @@ public class ProductionConfigurationTests { @SuppressWarnings({ "Duplicates", "unchecked" }) public void headers() { Map> headers = rest - .exchange(RequestEntity.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers")) - .header("foo", "bar").header("abc", "xyz").header("baz", "fob").build(), Map.class) - .getBody(); + .exchange(RequestEntity.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers")) + .header("foo", "bar") + .header("abc", "xyz") + .header("baz", "fob") + .build(), Map.class) + .getBody(); assertThat(headers).doesNotContainKey("foo").doesNotContainKey("hello").containsKeys("bar", "abc"); assertThat(headers.get("bar")).containsOnly("hello"); @@ -289,9 +313,10 @@ public class ProductionConfigurationTests { @Test public void forwardedHeaderUsesHost() { Map> headers = rest - .exchange(RequestEntity.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers")) - .header("host", "foo:1234").build(), Map.class) - .getBody(); + .exchange(RequestEntity.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers")) + .header("host", "foo:1234") + .build(), Map.class) + .getBody(); assertThat(headers).containsKey("forwarded"); assertThat(headers.get("forwarded").size()).isEqualTo(1); @@ -381,9 +406,11 @@ public class ProductionConfigurationTests { @PostMapping("/proxy/converter") public ResponseEntity implicitEntityWithConverter(@RequestBody Foo foo, ProxyExchange> proxy) { - return proxy.uri(home.toString() + "/bars").body(Arrays.asList(foo)) - .post(response -> ResponseEntity.status(response.getStatusCode()).headers(response.getHeaders()) - .body(response.getBody().iterator().next())); + return proxy.uri(home.toString() + "/bars") + .body(Arrays.asList(foo)) + .post(response -> ResponseEntity.status(response.getStatusCode()) + .headers(response.getHeaders()) + .body(response.getBody().iterator().next())); } @PostMapping("/proxy/no-body") @@ -399,8 +426,11 @@ public class ProductionConfigurationTests { @DeleteMapping("/proxy/{id}") public ResponseEntity deleteWithBody(@PathVariable Integer id, @RequestBody Foo foo, ProxyExchange proxy) { - return proxy.uri(home.toString() + "/foos/" + id).body(foo).delete(response -> ResponseEntity - .status(response.getStatusCode()).headers(response.getHeaders()).body(response.getBody())); + return proxy.uri(home.toString() + "/foos/" + id) + .body(foo) + .delete(response -> ResponseEntity.status(response.getStatusCode()) + .headers(response.getHeaders()) + .body(response.getBody())); } @GetMapping("/forward/**") @@ -461,8 +491,9 @@ public class ProductionConfigurationTests { } private ResponseEntity first(ResponseEntity> response) { - return ResponseEntity.status(response.getStatusCode()).headers(response.getHeaders()) - .body(response.getBody().iterator().next()); + return ResponseEntity.status(response.getStatusCode()) + .headers(response.getHeaders()) + .body(response.getBody().iterator().next()); } } diff --git a/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java b/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java index 15842cac..4ebe38ec 100644 --- a/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java +++ b/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java @@ -165,8 +165,9 @@ public class GatewaySampleApplication { @Bean public RouterFunction testWhenMetricPathIsNotMeet() { RouterFunction route = RouterFunctions.route( - RequestPredicates.path("/actuator/metrics/spring.cloud.gateway.requests"), request -> ServerResponse - .ok().body(BodyInserters.fromValue(HELLO_FROM_FAKE_ACTUATOR_METRICS_GATEWAY_REQUESTS))); + RequestPredicates.path("/actuator/metrics/spring.cloud.gateway.requests"), + request -> ServerResponse.ok() + .body(BodyInserters.fromValue(HELLO_FROM_FAKE_ACTUATOR_METRICS_GATEWAY_REQUESTS))); return route; } diff --git a/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/ThrottleGatewayFilter.java b/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/ThrottleGatewayFilter.java index 9cf02b42..86a8d71f 100644 --- a/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/ThrottleGatewayFilter.java +++ b/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/ThrottleGatewayFilter.java @@ -52,8 +52,10 @@ public class ThrottleGatewayFilter implements GatewayFilter { } synchronized (this) { if (tokenBucket == null) { - tokenBucket = TokenBuckets.builder().withCapacity(capacity) - .withFixedIntervalRefillStrategy(refillTokens, refillPeriod, refillUnit).build(); + tokenBucket = TokenBuckets.builder() + .withCapacity(capacity) + .withFixedIntervalRefillStrategy(refillTokens, refillPeriod, refillUnit) + .build(); } } return tokenBucket; diff --git a/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationTests.java b/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationTests.java index 60aa4fdf..6cc18e7f 100644 --- a/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationTests.java +++ b/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationTests.java @@ -92,100 +92,171 @@ public class GatewaySampleApplicationTests { @Test @SuppressWarnings("unchecked") public void readBodyPredicateStringWorks() { - webClient.post().uri("/post").header("Host", "www.readbody.org").bodyValue("hi").exchange().expectStatus() - .isOk().expectHeader().valueEquals("X-TestHeader", "read_body_pred").expectBody(Map.class) - .consumeWith(result -> assertThat(result.getResponseBody()).containsEntry("data", "hi")); + webClient.post() + .uri("/post") + .header("Host", "www.readbody.org") + .bodyValue("hi") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-TestHeader", "read_body_pred") + .expectBody(Map.class) + .consumeWith(result -> assertThat(result.getResponseBody()).containsEntry("data", "hi")); } @Test @SuppressWarnings("unchecked") public void rewriteRequestBodyStringWorks() { - webClient.post().uri("/post").header("Host", "www.rewriterequestupper.org").bodyValue("hello").exchange() - .expectStatus().isOk().expectHeader().valueEquals("X-TestHeader", "rewrite_request_upper") - .expectBody(Map.class) - .consumeWith(result -> assertThat(result.getResponseBody()).containsEntry("data", "HELLOHELLO")); + webClient.post() + .uri("/post") + .header("Host", "www.rewriterequestupper.org") + .bodyValue("hello") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-TestHeader", "rewrite_request_upper") + .expectBody(Map.class) + .consumeWith(result -> assertThat(result.getResponseBody()).containsEntry("data", "HELLOHELLO")); } @Test @SuppressWarnings("unchecked") public void rewriteRequestBodyObjectWorks() { - webClient.post().uri("/post").header("Host", "www.rewriterequestobj.org").bodyValue("hello").exchange() - .expectStatus().isOk().expectHeader().valueEquals("X-TestHeader", "rewrite_request") - .expectBody(Map.class).consumeWith(result -> assertThat(result.getResponseBody()).containsEntry("data", - "{\"message\":\"HELLO\"}")); + webClient.post() + .uri("/post") + .header("Host", "www.rewriterequestobj.org") + .bodyValue("hello") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-TestHeader", "rewrite_request") + .expectBody(Map.class) + .consumeWith( + result -> assertThat(result.getResponseBody()).containsEntry("data", "{\"message\":\"HELLO\"}")); } @Test @SuppressWarnings("unchecked") public void rewriteResponseBodyStringWorks() { - webClient.post().uri("/post").header("Host", "www.rewriteresponseupper.org").bodyValue("hello").exchange() - .expectStatus().isOk().expectHeader().valueEquals("X-TestHeader", "rewrite_response_upper") - .expectBody(Map.class) - .consumeWith(result -> assertThat(result.getResponseBody()).containsEntry("DATA", "HELLO")); + webClient.post() + .uri("/post") + .header("Host", "www.rewriteresponseupper.org") + .bodyValue("hello") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-TestHeader", "rewrite_response_upper") + .expectBody(Map.class) + .consumeWith(result -> assertThat(result.getResponseBody()).containsEntry("DATA", "HELLO")); } @Test @SuppressWarnings("unchecked") public void rewriteResponseEmptyBodyToStringWorks() { - webClient.post().uri("/post/empty").header("Host", "www.rewriteemptyresponse.org").exchange().expectStatus() - .isOk().expectHeader().valueEquals("X-TestHeader", "rewrite_empty_response").expectBody(String.class) - .consumeWith(result -> assertThat(result.getResponseBody()).isEqualTo("emptybody")); + webClient.post() + .uri("/post/empty") + .header("Host", "www.rewriteemptyresponse.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-TestHeader", "rewrite_empty_response") + .expectBody(String.class) + .consumeWith(result -> assertThat(result.getResponseBody()).isEqualTo("emptybody")); } @Test @SuppressWarnings("unchecked") public void emptyBodySupplierNotCalledWhenBodyPresent() { - webClient.post().uri("/post").header("Host", "www.rewriteresponsewithfailsupplier.org").bodyValue("hello") - .exchange().expectStatus().isOk().expectHeader() - .valueEquals("X-TestHeader", "rewrite_response_fail_supplier").expectBody(Map.class) - .consumeWith(result -> assertThat(result.getResponseBody()).containsEntry("DATA", "HELLO")); + webClient.post() + .uri("/post") + .header("Host", "www.rewriteresponsewithfailsupplier.org") + .bodyValue("hello") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-TestHeader", "rewrite_response_fail_supplier") + .expectBody(Map.class) + .consumeWith(result -> assertThat(result.getResponseBody()).containsEntry("DATA", "HELLO")); } @Test @SuppressWarnings("unchecked") public void rewriteResponeBodyObjectWorks() { - webClient.post().uri("/post").header("Host", "www.rewriteresponseobj.org").bodyValue("hello").exchange() - .expectStatus().isOk().expectHeader().valueEquals("X-TestHeader", "rewrite_response_obj") - .expectBody(String.class) - .consumeWith(result -> assertThat(result.getResponseBody()).isEqualTo("hello")); + webClient.post() + .uri("/post") + .header("Host", "www.rewriteresponseobj.org") + .bodyValue("hello") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-TestHeader", "rewrite_response_obj") + .expectBody(String.class) + .consumeWith(result -> assertThat(result.getResponseBody()).isEqualTo("hello")); } @Test public void complexPredicate() { - webClient.get().uri("/anything/png").header("Host", "www.abc.org").exchange().expectHeader() - .valueEquals("X-TestHeader", "foobar").expectStatus().isOk(); + webClient.get() + .uri("/anything/png") + .header("Host", "www.abc.org") + .exchange() + .expectHeader() + .valueEquals("X-TestHeader", "foobar") + .expectStatus() + .isOk(); } @Test public void routeFromKotlin() { - webClient.get().uri("/anything/kotlinroute").header("Host", "kotlin.abc.org").exchange().expectHeader() - .valueEquals("X-TestHeader", "foobar").expectStatus().isOk(); + webClient.get() + .uri("/anything/kotlinroute") + .header("Host", "kotlin.abc.org") + .exchange() + .expectHeader() + .valueEquals("X-TestHeader", "foobar") + .expectStatus() + .isOk(); } @Test public void actuatorManagementPort() { - webClient.get().uri("http://localhost:" + managementPort + "/actuator/gateway/routes").exchange().expectStatus() - .isOk(); + webClient.get() + .uri("http://localhost:" + managementPort + "/actuator/gateway/routes") + .exchange() + .expectStatus() + .isOk(); } @Test public void actuatorMetrics() { contextLoads(); String metricName = metricsProperties.getPrefix() + ".requests"; - webClient.get().uri("http://localhost:" + managementPort + "/actuator/metrics/" + metricName).exchange() - .expectStatus().isOk().expectBody().consumeWith(i -> { - String body = new String(i.getResponseBodyContent()); - ObjectMapper mapper = new ObjectMapper(); - try { - JsonNode actualObj = mapper.readTree(body); - JsonNode findValue = actualObj.findValue("name"); - assertThat(findValue.asText()).as("Expected to find metric with name gateway.requests") - .isEqualTo(metricName); - } - catch (IOException e) { - throw new IllegalStateException(e); - } - }); + webClient.get() + .uri("http://localhost:" + managementPort + "/actuator/metrics/" + metricName) + .exchange() + .expectStatus() + .isOk() + .expectBody() + .consumeWith(i -> { + String body = new String(i.getResponseBodyContent()); + ObjectMapper mapper = new ObjectMapper(); + try { + JsonNode actualObj = mapper.readTree(body); + JsonNode findValue = actualObj.findValue("name"); + assertThat(findValue.asText()).as("Expected to find metric with name gateway.requests") + .isEqualTo(metricName); + } + catch (IOException e) { + throw new IllegalStateException(e); + } + }); } @Configuration(proxyBeanMethods = false) diff --git a/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationWithoutMetricsTests.java b/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationWithoutMetricsTests.java index 1295559e..1ec14ff5 100644 --- a/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationWithoutMetricsTests.java +++ b/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationWithoutMetricsTests.java @@ -62,16 +62,21 @@ public class GatewaySampleApplicationWithoutMetricsTests { protected ConfigurableApplicationContext init(Class config) { return new SpringApplicationBuilder().web(WebApplicationType.REACTIVE) - .sources(GatewaySampleApplication.class, config).run(); + .sources(GatewaySampleApplication.class, config) + .run(); } @Test public void actuatorMetrics() { init(TestConfig.class); webClient.get().uri("/get").exchange().expectStatus().isOk(); - webClient.get().uri("http://localhost:" + port + "/actuator/metrics/spring.cloud.gateway.requests").exchange() - .expectStatus().isOk().expectBody(String.class) - .isEqualTo(GatewaySampleApplication.HELLO_FROM_FAKE_ACTUATOR_METRICS_GATEWAY_REQUESTS); + webClient.get() + .uri("http://localhost:" + port + "/actuator/metrics/spring.cloud.gateway.requests") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo(GatewaySampleApplication.HELLO_FROM_FAKE_ACTUATOR_METRICS_GATEWAY_REQUESTS); } } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/common/ArgumentSupplierBeanPostProcessor.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/common/ArgumentSupplierBeanPostProcessor.java index 49e441c6..efb66dbf 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/common/ArgumentSupplierBeanPostProcessor.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/common/ArgumentSupplierBeanPostProcessor.java @@ -52,7 +52,7 @@ public class ArgumentSupplierBeanPostProcessor implements BeanPostProcessor { routerFunction.accept(routerFunctionVisitor); if (predicateVisitor.argumentSupplier != null) { ArgumentSuppliedEvent argumentSuppliedEvent = predicateVisitor.argumentSupplier - .getArgumentSuppliedEvent(); + .getArgumentSuppliedEvent(); if (predicateVisitor.attributes != null) { argumentSuppliedEvent = new AttributedArugmentSuppliedEvent<>(argumentSuppliedEvent, predicateVisitor.attributes); diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/common/MvcUtils.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/common/MvcUtils.java index 51a1edd1..5e635b71 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/common/MvcUtils.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/common/MvcUtils.java @@ -144,7 +144,7 @@ public abstract class MvcUtils { public static ApplicationContext getApplicationContext(ServerRequest request) { WebApplicationContext webApplicationContext = RequestContextUtils - .findWebApplicationContext(request.servletRequest()); + .findWebApplicationContext(request.servletRequest()); if (webApplicationContext == null) { throw new IllegalStateException("No Application Context in request attributes"); } @@ -165,16 +165,16 @@ public abstract class MvcUtils { // attribute resetting in RequestPredicates // computeIfAbsent if the used vanilla RouterFunctions.route() Map attributes = (Map) request.attributes() - .computeIfAbsent(GATEWAY_ATTRIBUTES_ATTR, s -> new HashMap()); + .computeIfAbsent(GATEWAY_ATTRIBUTES_ATTR, s -> new HashMap()); return attributes; } @SuppressWarnings("unchecked") public static Map getUriTemplateVariables(ServerRequest request) { Map reqUriTemplateVars = (Map) request.attributes() - .get(URI_TEMPLATE_VARIABLES_ATTRIBUTE); + .get(URI_TEMPLATE_VARIABLES_ATTRIBUTE); Map gatewayUriTemplateVars = (Map) getGatewayAttributes(request) - .get(URI_TEMPLATE_VARIABLES_ATTRIBUTE); + .get(URI_TEMPLATE_VARIABLES_ATTRIBUTE); Map merged = mergeMaps(reqUriTemplateVars, gatewayUriTemplateVars); return merged; } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/common/WeightConfig.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/common/WeightConfig.java index f8533910..d1c768c1 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/common/WeightConfig.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/common/WeightConfig.java @@ -80,8 +80,10 @@ public class WeightConfig { @Override public String toString() { - return new ToStringCreator(this).append("routeId", routeId).append("group", group).append("weight", weight) - .toString(); + return new ToStringCreator(this).append("routeId", routeId) + .append("group", group) + .append("weight", weight) + .toString(); } } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcAotRuntimeHintsRegistrar.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcAotRuntimeHintsRegistrar.java index 9312a8b0..e4482d3a 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcAotRuntimeHintsRegistrar.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcAotRuntimeHintsRegistrar.java @@ -76,7 +76,7 @@ public class GatewayMvcAotRuntimeHintsRegistrar implements RuntimeHintsRegistrar return; // safety net } Arrays.stream(clazz.getMethods()) - .forEach(method -> reflectionHints.registerMethod(method, ExecutableMode.INVOKE)); + .forEach(method -> reflectionHints.registerMethod(method, ExecutableMode.INVOKE)); } } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcProperties.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcProperties.java index 782953e5..9bea9ddd 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcProperties.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcProperties.java @@ -73,8 +73,10 @@ public class GatewayMvcProperties { @Override public String toString() { - return new ToStringCreator(this).append("httpClient", httpClient).append("routes", routes) - .append("routesMap", routesMap).toString(); + return new ToStringCreator(this).append("httpClient", httpClient) + .append("routes", routes) + .append("routesMap", routesMap) + .toString(); } public static class HttpClient { @@ -125,8 +127,11 @@ public class GatewayMvcProperties { @Override public String toString() { - return new ToStringCreator(this).append("connectTimeout", connectTimeout).append("readTimeout", readTimeout) - .append("sslBundle", sslBundle).append("type", type).toString(); + return new ToStringCreator(this).append("connectTimeout", connectTimeout) + .append("readTimeout", readTimeout) + .append("sslBundle", sslBundle) + .append("type", type) + .toString(); } } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcPropertiesBeanDefinitionRegistrar.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcPropertiesBeanDefinitionRegistrar.java index 3b9f1261..1b8106ac 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcPropertiesBeanDefinitionRegistrar.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcPropertiesBeanDefinitionRegistrar.java @@ -53,9 +53,9 @@ public class GatewayMvcPropertiesBeanDefinitionRegistrar implements ImportBeanDe // Registers RouterFunctionHolderFactory::routerFunctionHolderSupplier so when the // bean is refreshed, that method is called again. AbstractBeanDefinition routerFnProviderBeanDefinition = BeanDefinitionBuilder - .rootBeanDefinition(RouterFunctionHolder.class) - .setFactoryMethodOnBean("routerFunctionHolderSupplier", "routerFunctionHolderFactory") - .getBeanDefinition(); + .rootBeanDefinition(RouterFunctionHolder.class) + .setFactoryMethodOnBean("routerFunctionHolderSupplier", "routerFunctionHolderFactory") + .getBeanDefinition(); BeanDefinitionHolder holder = new BeanDefinitionHolder(routerFnProviderBeanDefinition, "gatewayRouterFunctionHolder"); BeanDefinitionHolder proxy = ScopedProxyUtils.createScopedProxy(holder, registry, true); @@ -73,7 +73,8 @@ public class GatewayMvcPropertiesBeanDefinitionRegistrar implements ImportBeanDe // holder can be refreshed and all config based routes will be reloaded. AbstractBeanDefinition routerFunctionBeanDefinition = BeanDefinitionBuilder - .genericBeanDefinition(DelegatingRouterFunction.class).getBeanDefinition(); + .genericBeanDefinition(DelegatingRouterFunction.class) + .getBeanDefinition(); registry.registerBeanDefinition("gatewayCompositeRouterFunction", routerFunctionBeanDefinition); } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/RouterFunctionHolderFactory.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/RouterFunctionHolderFactory.java index 2da4fbbe..e75b259f 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/RouterFunctionHolderFactory.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/RouterFunctionHolderFactory.java @@ -109,8 +109,8 @@ public class RouterFunctionHolderFactory { */ @SuppressWarnings({ "unchecked", "rawtypes" }) private GatewayMvcPropertiesBeanDefinitionRegistrar.RouterFunctionHolder routerFunctionHolderSupplier() { - GatewayMvcProperties properties = Binder.get(env).bindOrCreate(GatewayMvcProperties.PREFIX, - GatewayMvcProperties.class); + GatewayMvcProperties properties = Binder.get(env) + .bindOrCreate(GatewayMvcProperties.PREFIX, GatewayMvcProperties.class); log.trace(LogMessage.format("RouterFunctionHolder initializing with %d map routes and %d list routes", properties.getRoutesMap().size(), properties.getRoutes().size())); @@ -242,9 +242,11 @@ public class RouterFunctionHolderFactory { private Optional findOperation(MultiValueMap operations, String operationName, Map operationArgs) { - return operations.getOrDefault(operationName, Collections.emptyList()).stream() - .map(operationMethod -> new NormalizedOperationMethod(operationMethod, operationArgs)) - .filter(opeMethod -> matchOperation(opeMethod, operationArgs)).findFirst(); + return operations.getOrDefault(operationName, Collections.emptyList()) + .stream() + .map(operationMethod -> new NormalizedOperationMethod(operationMethod, operationArgs)) + .filter(opeMethod -> matchOperation(opeMethod, operationArgs)) + .findFirst(); } private static boolean matchOperation(NormalizedOperationMethod operationMethod, Map args) { @@ -291,7 +293,7 @@ public class RouterFunctionHolderFactory { } Bindable bindable = Bindable.of(configurableType); List propertySources = Collections - .singletonList(new MapConfigurationPropertySource(args)); + .singletonList(new MapConfigurationPropertySource(args)); // TODO: potentially deal with conversion service Binder binder = new Binder(propertySources, null, DefaultConversionService.getSharedInstance()); Object config = binder.bindOrCreate("", bindable, new IgnoreTopLevelConverterNotFoundBindHandler()); diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/AfterFilterFunctions.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/AfterFilterFunctions.java index 9c8f3af0..3b6ef2f9 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/AfterFilterFunctions.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/AfterFilterFunctions.java @@ -116,7 +116,8 @@ public abstract class AfterFilterFunctions { return (request, response) -> { response.headers().computeIfPresent(name, (key, values) -> { List rewrittenValues = values.stream() - .map(value -> pattern.matcher(value).replaceAll(replacement)).toList(); + .map(value -> pattern.matcher(value).replaceAll(replacement)) + .toList(); return new ArrayList<>(rewrittenValues); }); return response; diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BeforeFilterFunctions.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BeforeFilterFunctions.java index 56a3a94b..93a3eb7c 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BeforeFilterFunctions.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BeforeFilterFunctions.java @@ -105,8 +105,11 @@ public abstract class BeforeFilterFunctions { return request -> { ServerRequest.Builder requestBuilder = ServerRequest.from(request); newHeaders.forEach((newHeaderName, newHeaderValues) -> { - boolean headerIsMissingOrBlank = request.headers().asHttpHeaders().getOrEmpty(newHeaderName).stream() - .allMatch(h -> !StringUtils.hasText(h)); + boolean headerIsMissingOrBlank = request.headers() + .asHttpHeaders() + .getOrEmpty(newHeaderName) + .stream() + .allMatch(h -> !StringUtils.hasText(h)); if (headerIsMissingOrBlank) { requestBuilder.headers(httpHeaders -> { List expandedValues = MvcUtils.expandMultiple(request, newHeaderValues); @@ -134,20 +137,22 @@ public abstract class BeforeFilterFunctions { Consumer configConsumer) { FallbackHeadersConfig config = new FallbackHeadersConfig(); configConsumer.accept(config); - return request -> request.attribute(CIRCUITBREAKER_EXECUTION_EXCEPTION_ATTR).map(Throwable.class::cast) - .map(throwable -> ServerRequest.from(request).headers(httpHeaders -> { - httpHeaders.add(config.getExecutionExceptionTypeHeaderName(), throwable.getClass().getName()); - if (throwable.getMessage() != null) { - httpHeaders.add(config.getExecutionExceptionMessageHeaderName(), throwable.getMessage()); + return request -> request.attribute(CIRCUITBREAKER_EXECUTION_EXCEPTION_ATTR) + .map(Throwable.class::cast) + .map(throwable -> ServerRequest.from(request).headers(httpHeaders -> { + httpHeaders.add(config.getExecutionExceptionTypeHeaderName(), throwable.getClass().getName()); + if (throwable.getMessage() != null) { + httpHeaders.add(config.getExecutionExceptionMessageHeaderName(), throwable.getMessage()); + } + Throwable rootCause = getRootCause(throwable); + if (rootCause != null) { + httpHeaders.add(config.getRootCauseExceptionTypeHeaderName(), rootCause.getClass().getName()); + if (rootCause.getMessage() != null) { + httpHeaders.add(config.getRootCauseExceptionMessageHeaderName(), rootCause.getMessage()); } - Throwable rootCause = getRootCause(throwable); - if (rootCause != null) { - httpHeaders.add(config.getRootCauseExceptionTypeHeaderName(), rootCause.getClass().getName()); - if (rootCause.getMessage() != null) { - httpHeaders.add(config.getRootCauseExceptionMessageHeaderName(), rootCause.getMessage()); - } - } - }).build()).orElse(request); + } + }).build()) + .orElse(request); } private static Throwable getRootCause(Throwable throwable) { @@ -211,7 +216,9 @@ public abstract class BeforeFilterFunctions { // remove from uri URI newUri = UriComponentsBuilder.fromUri(request.uri()) - .replaceQueryParams(unmodifiableMultiValueMap(queryParams)).build().toUri(); + .replaceQueryParams(unmodifiableMultiValueMap(queryParams)) + .build() + .toUri(); // remove resolved params from request return ServerRequest.from(request).params(params -> params.remove(name)).uri(newUri).build(); @@ -252,7 +259,7 @@ public abstract class BeforeFilterFunctions { StringBuilder errorMessage = new StringBuilder( String.format(REQUEST_HEADER_SIZE_ERROR_PREFIX, maxSize)); longHeaders.forEach((header, size) -> errorMessage - .append(String.format(REQUEST_HEADER_SIZE_ERROR, header, DataSize.of(size, DataUnit.BYTES)))); + .append(String.format(REQUEST_HEADER_SIZE_ERROR, header, DataSize.of(size, DataUnit.BYTES)))); throw new ResponseStatusException(HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE, errorMessage.toString()) { @Override @@ -398,8 +405,10 @@ public abstract class BeforeFilterFunctions { } // TODO: end duplicate code from StripPrefixGatewayFilterFactory - URI prefixedUri = UriComponentsBuilder.fromUri(request.uri()).replacePath(newPath.toString()).build() - .toUri(); + URI prefixedUri = UriComponentsBuilder.fromUri(request.uri()) + .replacePath(newPath.toString()) + .build() + .toUri(); return ServerRequest.from(request).uri(prefixedUri).build(); }; } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BodyFilterFunctions.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BodyFilterFunctions.java index 0664f43a..73f5a4e7 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BodyFilterFunctions.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BodyFilterFunctions.java @@ -128,7 +128,8 @@ public abstract class BodyFilterFunctions { ByteArrayHttpOutputMessage outputMessage = new ByteArrayHttpOutputMessage(headers); ((HttpMessageConverter) messageConverter).write(convertedBody, contentType, outputMessage); ServerRequest modified = ServerRequest.from(request) - .headers(httpHeaders -> httpHeaders.putAll(headers)).build(); + .headers(httpHeaders -> httpHeaders.putAll(headers)) + .build(); return wrapRequest(modified, outputMessage.getBytes()); } catch (IOException e) { diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/Bucket4jFilterFunctions.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/Bucket4jFilterFunctions.java index 48cdc6ad..d42152ee 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/Bucket4jFilterFunctions.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/Bucket4jFilterFunctions.java @@ -45,9 +45,12 @@ public abstract class Bucket4jFilterFunctions { public static final String DEFAULT_HEADER_NAME = "X-RateLimit-Remaining"; private static final Function DEFAULT_CONFIGURATION_BUILDER = config -> BucketConfiguration - .builder().addLimit(Bandwidth.builder().capacity(config.getCapacity()) - .refillGreedy(config.getCapacity(), config.getPeriod()).build()) - .build(); + .builder() + .addLimit(Bandwidth.builder() + .capacity(config.getCapacity()) + .refillGreedy(config.getCapacity(), config.getPeriod()) + .build()) + .build(); private Bucket4jFilterFunctions() { } @@ -87,7 +90,8 @@ public abstract class Bucket4jFilterFunctions { return serverResponse; } return ServerResponse.status(config.getStatusCode()) - .header(config.getHeaderName(), String.valueOf(remainingTokens)).build(); + .header(config.getHeaderName(), String.valueOf(remainingTokens)) + .build(); }; } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/CircuitBreakerFilterFunctions.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/CircuitBreakerFilterFunctions.java index 6ebc6d9c..54ae1709 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/CircuitBreakerFilterFunctions.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/CircuitBreakerFilterFunctions.java @@ -71,11 +71,13 @@ public abstract class CircuitBreakerFilterFunctions { @Shortcut @Configurable public static HandlerFilterFunction circuitBreaker(CircuitBreakerConfig config) { - Set failureStatuses = config.getStatusCodes().stream() - .map(status -> HttpStatusHolder.valueOf(status).resolve()).collect(Collectors.toSet()); + Set failureStatuses = config.getStatusCodes() + .stream() + .map(status -> HttpStatusHolder.valueOf(status).resolve()) + .collect(Collectors.toSet()); return (request, next) -> { CircuitBreakerFactory circuitBreakerFactory = MvcUtils.getApplicationContext(request) - .getBean(CircuitBreakerFactory.class); + .getBean(CircuitBreakerFactory.class); // TODO: cache CircuitBreaker circuitBreaker = circuitBreakerFactory.create(config.getId()); return circuitBreaker.run(() -> { @@ -117,8 +119,10 @@ public abstract class CircuitBreakerFilterFunctions { return GatewayServerResponse.ok().build((httpServletRequest, httpServletResponse) -> { try { String expandedFallback = MvcUtils.expand(request, config.getFallbackPath()); - request.servletRequest().getServletContext().getRequestDispatcher(expandedFallback) - .forward(httpServletRequest, httpServletResponse); + request.servletRequest() + .getServletContext() + .getRequestDispatcher(expandedFallback) + .forward(httpServletRequest, httpServletResponse); return null; } catch (ServletException | IOException e) { diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FilterFunctions.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FilterFunctions.java index 31f49053..d21c08f5 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FilterFunctions.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FilterFunctions.java @@ -117,8 +117,8 @@ public interface FilterFunctions { static HandlerFilterFunction redirectTo(HttpStatusHolder status, URI uri) { Assert.isTrue(status.is3xxRedirection(), "status must be a 3xx code, but was " + status); - return (request, next) -> ServerResponse.status(status.resolve()).header(HttpHeaders.LOCATION, uri.toString()) - .build(); + return (request, + next) -> ServerResponse.status(status.resolve()).header(HttpHeaders.LOCATION, uri.toString()).build(); } @Shortcut @@ -162,9 +162,11 @@ public interface FilterFunctions { @Shortcut static HandlerFilterFunction rewriteLocationResponseHeader(String stripVersion, String locationHeaderName, String hostValue, String protocolsRegex) { - return ofResponseProcessor(RewriteLocationResponseHeaderFilterFunctions.rewriteLocationResponseHeader( - config -> config.setStripVersion(stripVersion).setLocationHeaderName(locationHeaderName) - .setHostValue(hostValue).setProtocolsRegex(protocolsRegex))); + return ofResponseProcessor(RewriteLocationResponseHeaderFilterFunctions + .rewriteLocationResponseHeader(config -> config.setStripVersion(stripVersion) + .setLocationHeaderName(locationHeaderName) + .setHostValue(hostValue) + .setProtocolsRegex(protocolsRegex))); } @Shortcut diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FormFilter.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FormFilter.java index d25b2ab0..c4de9ccc 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FormFilter.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FormFilter.java @@ -121,7 +121,7 @@ public class FormFilter implements Filter, Ordered { UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromUriString(requestURL.toString()); MultiValueMap queryParams = uriComponentsBuilder.build().getQueryParams(); for (Iterator> entryIterator = form.entrySet().iterator(); entryIterator - .hasNext();) { + .hasNext();) { Map.Entry entry = entryIterator.next(); String name = entry.getKey(); List values = Arrays.asList(entry.getValue()); diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/LoadBalancerFilterFunctions.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/LoadBalancerFilterFunctions.java index a07d41ce..ab6d47dc 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/LoadBalancerFilterFunctions.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/LoadBalancerFilterFunctions.java @@ -64,10 +64,10 @@ public abstract class LoadBalancerFilterFunctions { BiFunction reconstructUriFunction) { return (request, next) -> { LoadBalancerClientFactory clientFactory = getApplicationContext(request) - .getBean(LoadBalancerClientFactory.class); + .getBean(LoadBalancerClientFactory.class); Set supportedLifecycleProcessors = LoadBalancerLifecycleValidator - .getSupportedLifecycleProcessors(clientFactory.getInstances(serviceId, LoadBalancerLifecycle.class), - RequestDataContext.class, ResponseData.class, ServiceInstance.class); + .getSupportedLifecycleProcessors(clientFactory.getInstances(serviceId, LoadBalancerLifecycle.class), + RequestDataContext.class, ResponseData.class, ServiceInstance.class); RequestData requestData = new RequestData(request.method(), request.uri(), request.headers().asHttpHeaders(), buildCookies(request.cookies()), request.attributes()); DefaultRequest lbRequest = new DefaultRequest<>( @@ -82,7 +82,7 @@ public abstract class LoadBalancerFilterFunctions { ServiceInstance retrievedInstance = loadBalancerClient.choose(serviceId, lbRequest); if (retrievedInstance == null) { supportedLifecycleProcessors.forEach(lifecycle -> lifecycle - .onComplete(new CompletionContext<>(CompletionContext.Status.DISCARD, lbRequest))); + .onComplete(new CompletionContext<>(CompletionContext.Status.DISCARD, lbRequest))); throw new HttpServerErrorException(HttpStatus.SERVICE_UNAVAILABLE, "Unable to find instance for " + serviceId); // throw NotFoundException.create(properties.isUse404(), "Unable to find @@ -110,9 +110,9 @@ public abstract class LoadBalancerFilterFunctions { try { ServerResponse serverResponse = next.handle(request); - supportedLifecycleProcessors.forEach( - lifecycle -> lifecycle.onComplete(new CompletionContext<>(CompletionContext.Status.SUCCESS, - lbRequest, defaultResponse, serverResponse))); + supportedLifecycleProcessors + .forEach(lifecycle -> lifecycle.onComplete(new CompletionContext<>(CompletionContext.Status.SUCCESS, + lbRequest, defaultResponse, serverResponse))); return serverResponse; } catch (Exception e) { @@ -136,7 +136,7 @@ public abstract class LoadBalancerFilterFunctions { HttpHeaders newCookies = new HttpHeaders(); if (cookies != null) { cookies.forEach((key, value) -> value - .forEach(cookie -> newCookies.put(cookie.getName(), Collections.singletonList(cookie.getValue())))); + .forEach(cookie -> newCookies.put(cookie.getName(), Collections.singletonList(cookie.getValue())))); } return newCookies; } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/RetryFilterFunctions.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/RetryFilterFunctions.java index c7fd9acb..ac8358f0 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/RetryFilterFunctions.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/RetryFilterFunctions.java @@ -67,7 +67,7 @@ public abstract class RetryFilterFunctions { config.getExceptions().forEach(exception -> retryableExceptions.put(exception, true)); SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(config.getRetries(), retryableExceptions); compositeRetryPolicy - .setPolicies(Arrays.asList(simpleRetryPolicy, new HttpRetryPolicy(config)).toArray(new RetryPolicy[0])); + .setPolicies(Arrays.asList(simpleRetryPolicy, new HttpRetryPolicy(config)).toArray(new RetryPolicy[0])); RetryTemplate retryTemplate = retryTemplateBuilder.customPolicy(compositeRetryPolicy).build(); return (request, next) -> retryTemplate.execute(context -> { ServerResponse serverResponse = next.handle(request); diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/TokenRelayFilterFunctions.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/TokenRelayFilterFunctions.java index a9d0d67c..19edecca 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/TokenRelayFilterFunctions.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/TokenRelayFilterFunctions.java @@ -42,13 +42,16 @@ public abstract class TokenRelayFilterFunctions { if (principle instanceof OAuth2AuthenticationToken token) { String clientRegistrationId = token.getAuthorizedClientRegistrationId(); OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest - .withClientRegistrationId(clientRegistrationId).principal(token).build(); + .withClientRegistrationId(clientRegistrationId) + .principal(token) + .build(); OAuth2AuthorizedClientManager clientManager = getApplicationContext(request) - .getBean(OAuth2AuthorizedClientManager.class); + .getBean(OAuth2AuthorizedClientManager.class); OAuth2AuthorizedClient authorizedClient = clientManager.authorize(authorizeRequest); OAuth2AccessToken accessToken = authorizedClient.getAccessToken(); ServerRequest modified = ServerRequest.from(request) - .headers(httpHeaders -> httpHeaders.setBearerAuth(accessToken.getTokenValue())).build(); + .headers(httpHeaders -> httpHeaders.setBearerAuth(accessToken.getTokenValue())) + .build(); return next.handle(modified); } return next.handle(request); diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/WeightCalculatorFilter.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/WeightCalculatorFilter.java index 4acf4567..87b3f86c 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/WeightCalculatorFilter.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/WeightCalculatorFilter.java @@ -254,8 +254,11 @@ public class WeightCalculatorFilter implements Filter, Ordered, SmartApplication @Override public String toString() { - return new ToStringCreator(this).append("group", group).append("weights", weights) - .append("normalizedWeights", normalizedWeights).append("rangeIndexes", rangeIndexes).toString(); + return new ToStringCreator(this).append("group", group) + .append("weights", weights) + .append("normalizedWeights", normalizedWeights) + .append("rangeIndexes", rangeIndexes) + .toString(); } } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/ClientHttpRequestFactoryProxyExchange.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/ClientHttpRequestFactoryProxyExchange.java index 0a35a59c..ccda73d4 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/ClientHttpRequestFactoryProxyExchange.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/ClientHttpRequestFactoryProxyExchange.java @@ -47,20 +47,20 @@ public class ClientHttpRequestFactoryProxyExchange implements ProxyExchange { // put the body input stream in a request attribute so filters can read it. MvcUtils.putAttribute(request.getServerRequest(), MvcUtils.CLIENT_RESPONSE_INPUT_STREAM_ATTR, body); ServerResponse serverResponse = GatewayServerResponse.status(clientHttpResponse.getStatusCode()) - .build((req, httpServletResponse) -> { - try (clientHttpResponse) { - // get input stream from request attribute in case it was - // modified. - InputStream inputStream = MvcUtils.getAttribute(request.getServerRequest(), - MvcUtils.CLIENT_RESPONSE_INPUT_STREAM_ATTR); - // copy body from request to clientHttpRequest - StreamUtils.copy(inputStream, httpServletResponse.getOutputStream()); - } - return null; - }); + .build((req, httpServletResponse) -> { + try (clientHttpResponse) { + // get input stream from request attribute in case it was + // modified. + InputStream inputStream = MvcUtils.getAttribute(request.getServerRequest(), + MvcUtils.CLIENT_RESPONSE_INPUT_STREAM_ATTR); + // copy body from request to clientHttpRequest + StreamUtils.copy(inputStream, httpServletResponse.getOutputStream()); + } + return null; + }); ClientHttpResponseAdapter proxyExchangeResponse = new ClientHttpResponseAdapter(clientHttpResponse); request.getResponseConsumers() - .forEach(responseConsumer -> responseConsumer.accept(proxyExchangeResponse, serverResponse)); + .forEach(responseConsumer -> responseConsumer.accept(proxyExchangeResponse, serverResponse)); return serverResponse; } catch (IOException e) { diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayEntityResponseBuilder.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayEntityResponseBuilder.java index a1a8e8bf..aa900454 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayEntityResponseBuilder.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayEntityResponseBuilder.java @@ -268,10 +268,10 @@ final class GatewayEntityResponseBuilder implements EntityResponse.Builder entityType = RESOURCE_REGION_LIST_TYPE; } catch (IllegalArgumentException ex) { - serverResponse.getHeaders().set(HttpHeaders.CONTENT_RANGE, - "bytes */" + resource.contentLength()); + serverResponse.getHeaders() + .set(HttpHeaders.CONTENT_RANGE, "bytes */" + resource.contentLength()); serverResponse.getServletResponse() - .setStatus(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE.value()); + .setStatus(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE.value()); } } } @@ -316,9 +316,10 @@ final class GatewayEntityResponseBuilder implements EntityResponse.Builder private static List producibleMediaTypes(List> messageConverters, Class entityClass) { - return messageConverters.stream().filter(messageConverter -> messageConverter.canWrite(entityClass, null)) - .flatMap(messageConverter -> messageConverter.getSupportedMediaTypes(entityClass).stream()) - .toList(); + return messageConverters.stream() + .filter(messageConverter -> messageConverter.canWrite(entityClass, null)) + .flatMap(messageConverter -> messageConverter.getSupportedMediaTypes(entityClass).stream()) + .toList(); } } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayErrorHandlingServerResponse.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayErrorHandlingServerResponse.java index dcd6a18b..31f1c596 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayErrorHandlingServerResponse.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayErrorHandlingServerResponse.java @@ -79,7 +79,7 @@ abstract class GatewayErrorHandlingServerResponse implements ServerResponse { for (ErrorHandler errorHandler : this.errorHandlers) { if (errorHandler.test(t)) { ServerRequest serverRequest = (ServerRequest) servletRequest - .getAttribute(RouterFunctions.REQUEST_ATTRIBUTE); + .getAttribute(RouterFunctions.REQUEST_ATTRIBUTE); return errorHandler.handle(t, serverRequest); } } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayServerResponse.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayServerResponse.java index b03f106e..b13b8e1a 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayServerResponse.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayServerResponse.java @@ -49,7 +49,7 @@ public interface GatewayServerResponse extends ServerResponse { */ static ServerResponse from(ErrorResponse response) { return status(response.getStatusCode()).headers(headers -> headers.putAll(response.getHeaders())) - .body(response.getBody()); + .body(response.getBody()); } /** diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayServerResponseBuilder.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayServerResponseBuilder.java index 5b921fcd..66e1a114 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayServerResponseBuilder.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/GatewayServerResponseBuilder.java @@ -173,30 +173,38 @@ class GatewayServerResponseBuilder implements ServerResponse.BodyBuilder { @Override public ServerResponse body(Object body) { - return GatewayEntityResponseBuilder.fromObject(body).status(this.statusCode) - .headers(headers -> headers.putAll(this.headers)).cookies(cookies -> cookies.addAll(this.cookies)) - .build(); + return GatewayEntityResponseBuilder.fromObject(body) + .status(this.statusCode) + .headers(headers -> headers.putAll(this.headers)) + .cookies(cookies -> cookies.addAll(this.cookies)) + .build(); } @Override public ServerResponse body(T body, ParameterizedTypeReference bodyType) { - return GatewayEntityResponseBuilder.fromObject(body, bodyType).status(this.statusCode) - .headers(headers -> headers.putAll(this.headers)).cookies(cookies -> cookies.addAll(this.cookies)) - .build(); + return GatewayEntityResponseBuilder.fromObject(body, bodyType) + .status(this.statusCode) + .headers(headers -> headers.putAll(this.headers)) + .cookies(cookies -> cookies.addAll(this.cookies)) + .build(); } @Override public ServerResponse render(String name, Object... modelAttributes) { return new GatewayRenderingResponseBuilder(name).status(this.statusCode) - .headers(headers -> headers.putAll(this.headers)).cookies(cookies -> cookies.addAll(this.cookies)) - .modelAttributes(modelAttributes).build(); + .headers(headers -> headers.putAll(this.headers)) + .cookies(cookies -> cookies.addAll(this.cookies)) + .modelAttributes(modelAttributes) + .build(); } @Override public ServerResponse render(String name, Map model) { return new GatewayRenderingResponseBuilder(name).status(this.statusCode) - .headers(headers -> headers.putAll(this.headers)).cookies(cookies -> cookies.addAll(this.cookies)) - .modelAttributes(model).build(); + .headers(headers -> headers.putAll(this.headers)) + .cookies(cookies -> cookies.addAll(this.cookies)) + .modelAttributes(model) + .build(); } private static class WriteFunctionResponse extends AbstractGatewayServerResponse { diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/HandlerFunctions.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/HandlerFunctions.java index 81760ff1..9b3d118b 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/HandlerFunctions.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/HandlerFunctions.java @@ -46,8 +46,10 @@ public abstract class HandlerFunctions { return request -> GatewayServerResponse.ok().build((httpServletRequest, httpServletResponse) -> { try { String expandedFallback = MvcUtils.expand(request, path); - request.servletRequest().getServletContext().getRequestDispatcher(expandedFallback) - .forward(httpServletRequest, httpServletResponse); + request.servletRequest() + .getServletContext() + .getRequestDispatcher(expandedFallback) + .forward(httpServletRequest, httpServletResponse); return null; } catch (ServletException | IOException e) { diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/ProxyExchangeHandlerFunction.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/ProxyExchangeHandlerFunction.java index 315f883b..84ce2018 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/ProxyExchangeHandlerFunction.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/ProxyExchangeHandlerFunction.java @@ -59,7 +59,7 @@ public class ProxyExchangeHandlerFunction ObjectProvider responseHttpHeadersFilters) { this(proxyExchange, requestHttpHeadersFilters, responseHttpHeadersFilters, request -> (URI) request.attribute(MvcUtils.GATEWAY_REQUEST_URL_ATTR) - .orElseThrow(() -> new IllegalStateException("No routeUri resolved"))); + .orElseThrow(() -> new IllegalStateException("No routeUri resolved"))); } public ProxyExchangeHandlerFunction(ProxyExchange proxyExchange, @@ -99,7 +99,7 @@ public class ProxyExchangeHandlerFunction serverRequest.headers().asHttpHeaders(), serverRequest); boolean preserveHost = (boolean) serverRequest.attributes() - .getOrDefault(MvcUtils.PRESERVE_HOST_HEADER_ATTRIBUTE, false); + .getOrDefault(MvcUtils.PRESERVE_HOST_HEADER_ATTRIBUTE, false); if (preserveHost) { filteredRequestHeaders.set(HttpHeaders.HOST, serverRequest.headers().firstHeader(HttpHeaders.HOST)); } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/RestClientProxyExchange.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/RestClientProxyExchange.java index 598dba05..37493b6b 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/RestClientProxyExchange.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/RestClientProxyExchange.java @@ -36,10 +36,11 @@ public class RestClientProxyExchange implements ProxyExchange { @Override public ServerResponse exchange(Request request) { - return restClient.method(request.getMethod()).uri(request.getUri()) - .headers(httpHeaders -> httpHeaders.putAll(request.getHeaders())) - .body(outputStream -> copyBody(request, outputStream)) - .exchange((clientRequest, clientResponse) -> doExchange(request, clientResponse), false); + return restClient.method(request.getMethod()) + .uri(request.getUri()) + .headers(httpHeaders -> httpHeaders.putAll(request.getHeaders())) + .body(outputStream -> copyBody(request, outputStream)) + .exchange((clientRequest, clientResponse) -> doExchange(request, clientResponse), false); } private static int copyBody(Request request, OutputStream outputStream) throws IOException { @@ -51,20 +52,20 @@ public class RestClientProxyExchange implements ProxyExchange { // put the body input stream in a request attribute so filters can read it. MvcUtils.putAttribute(request.getServerRequest(), MvcUtils.CLIENT_RESPONSE_INPUT_STREAM_ATTR, body); ServerResponse serverResponse = GatewayServerResponse.status(clientResponse.getStatusCode()) - .build((req, httpServletResponse) -> { - try (clientResponse) { - // get input stream from request attribute in case it was - // modified. - InputStream inputStream = MvcUtils.getAttribute(request.getServerRequest(), - MvcUtils.CLIENT_RESPONSE_INPUT_STREAM_ATTR); - // copy body from request to clientHttpRequest - StreamUtils.copy(inputStream, httpServletResponse.getOutputStream()); - } - return null; - }); + .build((req, httpServletResponse) -> { + try (clientResponse) { + // get input stream from request attribute in case it was + // modified. + InputStream inputStream = MvcUtils.getAttribute(request.getServerRequest(), + MvcUtils.CLIENT_RESPONSE_INPUT_STREAM_ATTR); + // copy body from request to clientHttpRequest + StreamUtils.copy(inputStream, httpServletResponse.getOutputStream()); + } + return null; + }); ClientHttpResponseAdapter proxyExchangeResponse = new ClientHttpResponseAdapter(clientResponse); request.getResponseConsumers() - .forEach(responseConsumer -> responseConsumer.accept(proxyExchangeResponse, serverResponse)); + .forEach(responseConsumer -> responseConsumer.accept(proxyExchangeResponse, serverResponse)); return serverResponse; } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/invoke/reflect/OperationMethodParameter.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/invoke/reflect/OperationMethodParameter.java index 0c136f66..6b88d0ef 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/invoke/reflect/OperationMethodParameter.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/invoke/reflect/OperationMethodParameter.java @@ -84,10 +84,10 @@ class OperationMethodParameter implements OperationParameter { boolean isMandatory(Parameter parameter) { MergedAnnotation annotation = MergedAnnotations.from(parameter).get(Nonnull.class); - return !annotation.isPresent()/* - * || annotation.getEnum("when", When.class) - * == When.ALWAYS - */; + return !annotation + .isPresent()/* + * || annotation.getEnum("when", When.class) == When.ALWAYS + */; } } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/invoke/reflect/ReflectiveOperationInvoker.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/invoke/reflect/ReflectiveOperationInvoker.java index a1b921c2..0cccfa2b 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/invoke/reflect/ReflectiveOperationInvoker.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/invoke/reflect/ReflectiveOperationInvoker.java @@ -88,8 +88,10 @@ public class ReflectiveOperationInvoker implements OperationInvoker { } private void validateRequiredParameters(InvocationContext context) { - Set missing = this.operationMethod.getParameters().stream() - .filter((parameter) -> isMissing(context, parameter)).collect(Collectors.toSet()); + Set missing = this.operationMethod.getParameters() + .stream() + .filter((parameter) -> isMissing(context, parameter)) + .collect(Collectors.toSet()); if (!missing.isEmpty()) { throw new MissingParametersException(missing); } @@ -106,8 +108,10 @@ public class ReflectiveOperationInvoker implements OperationInvoker { } private Object[] resolveArguments(InvocationContext context) { - return this.operationMethod.getParameters().stream().map((parameter) -> resolveArgument(parameter, context)) - .toArray(); + return this.operationMethod.getParameters() + .stream() + .map((parameter) -> resolveArgument(parameter, context)) + .toArray(); } private Object resolveArgument(OperationParameter parameter, InvocationContext context) { @@ -121,8 +125,9 @@ public class ReflectiveOperationInvoker implements OperationInvoker { @Override public String toString() { - return new ToStringCreator(this).append("target", this.target).append("method", this.operationMethod) - .toString(); + return new ToStringCreator(this).append("target", this.target) + .append("method", this.operationMethod) + .toString(); } } diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/predicate/GatewayRequestPredicates.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/predicate/GatewayRequestPredicates.java index 977d8a7d..5dbb3c7d 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/predicate/GatewayRequestPredicates.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/predicate/GatewayRequestPredicates.java @@ -533,8 +533,8 @@ public abstract class GatewayRequestPredicates { @SuppressWarnings("unchecked") @Override public boolean test(ServerRequest request) { - Map weights = (Map) request.attributes().getOrDefault(WEIGHT_ATTR, - Collections.emptyMap()); + Map weights = (Map) request.attributes() + .getOrDefault(WEIGHT_ATTR, Collections.emptyMap()); String routeId = (String) request.attributes().get(GATEWAY_ROUTE_ID_ATTR); if (ObjectUtils.isEmpty(routeId)) { 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 2b45a297..e8c139e7 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 @@ -38,26 +38,27 @@ public class GatewayServerMvcAutoConfigurationTests { @Test void filterEnabledPropertiesWork() { - new ApplicationContextRunner().withConfiguration(AutoConfigurations.of(GatewayServerMvcAutoConfiguration.class, - RestTemplateAutoConfiguration.class, RestClientAutoConfiguration.class, SslAutoConfiguration.class)) - .withPropertyValues("spring.cloud.gateway.mvc.form-filter.enabled=false", - "spring.cloud.gateway.mvc.forwarded-request-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.remove-content-length-request-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.remove-hop-by-hop-request-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.remove-hop-by-hop-response-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.transfer-encoding-normalization-request-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.weight-calculator-filter.enabled=false", - "spring.cloud.gateway.mvc.x-forwarded-request-headers-filter.enabled=false") - .run(context -> { - assertThat(context).doesNotHaveBean(FormFilter.class); - assertThat(context).doesNotHaveBean(ForwardedRequestHeadersFilter.class); - assertThat(context).doesNotHaveBean(RemoveContentLengthRequestHeadersFilter.class); - assertThat(context).doesNotHaveBean(RemoveHopByHopRequestHeadersFilter.class); - assertThat(context).doesNotHaveBean(RemoveHopByHopResponseHeadersFilter.class); - assertThat(context).doesNotHaveBean(TransferEncodingNormalizationRequestHeadersFilter.class); - assertThat(context).doesNotHaveBean(WeightCalculatorFilter.class); - assertThat(context).doesNotHaveBean(XForwardedRequestHeadersFilter.class); - }); + new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(GatewayServerMvcAutoConfiguration.class, + RestTemplateAutoConfiguration.class, RestClientAutoConfiguration.class, SslAutoConfiguration.class)) + .withPropertyValues("spring.cloud.gateway.mvc.form-filter.enabled=false", + "spring.cloud.gateway.mvc.forwarded-request-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.remove-content-length-request-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.remove-hop-by-hop-request-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.remove-hop-by-hop-response-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.transfer-encoding-normalization-request-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.weight-calculator-filter.enabled=false", + "spring.cloud.gateway.mvc.x-forwarded-request-headers-filter.enabled=false") + .run(context -> { + assertThat(context).doesNotHaveBean(FormFilter.class); + assertThat(context).doesNotHaveBean(ForwardedRequestHeadersFilter.class); + assertThat(context).doesNotHaveBean(RemoveContentLengthRequestHeadersFilter.class); + assertThat(context).doesNotHaveBean(RemoveHopByHopRequestHeadersFilter.class); + assertThat(context).doesNotHaveBean(RemoveHopByHopResponseHeadersFilter.class); + assertThat(context).doesNotHaveBean(TransferEncodingNormalizationRequestHeadersFilter.class); + assertThat(context).doesNotHaveBean(WeightCalculatorFilter.class); + assertThat(context).doesNotHaveBean(XForwardedRequestHeadersFilter.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 06bfb437..c43fd629 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 @@ -178,131 +178,208 @@ public class ServerMvcIntegrationTests { @Test public void addRequestParameterWorks() { - restClient.get().uri("/anything/addrequestparam").exchange().expectStatus().isOk().expectBody(Map.class) - .consumeWith(res -> { - Map map = res.getResponseBody(); - Map args = getMap(map, "args"); - assertThat(args).containsEntry("param1", "param1val"); - }); + restClient.get() + .uri("/anything/addrequestparam") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + Map args = getMap(map, "args"); + assertThat(args).containsEntry("param1", "param1val"); + }); } @Test public void removeHopByHopRequestHeadersFilterWorks() { - restClient.get().uri("/anything/removehopbyhoprequestheaders").exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(res -> { - Map map = res.getResponseBody(); - Map headers = getMap(map, "headers"); - assertThat(headers).doesNotContainKeys("x-application-context"); - }); + restClient.get() + .uri("/anything/removehopbyhoprequestheaders") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + Map headers = getMap(map, "headers"); + assertThat(headers).doesNotContainKeys("x-application-context"); + }); } @Test public void setPathWorks() { - restClient.get().uri("/mycustompathextra1").exchange().expectStatus().isOk().expectBody(Map.class) - .consumeWith(res -> { - Map map = res.getResponseBody(); - Map args = getMap(map, "args"); - assertThat(args).containsEntry("param1", "param1valextra1"); - }); + restClient.get() + .uri("/mycustompathextra1") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + Map args = getMap(map, "args"); + assertThat(args).containsEntry("param1", "param1valextra1"); + }); } @Test public void setPathPostWorks() { - restClient.post().uri("/mycustompathpost").bodyValue("hello").header("Host", "www.setpathpost.org").exchange() - .expectStatus().isOk().expectBody(Map.class).consumeWith(res -> { - Map map = res.getResponseBody(); - assertThat(map).containsEntry("data", "hello"); - }); + restClient.post() + .uri("/mycustompathpost") + .bodyValue("hello") + .header("Host", "www.setpathpost.org") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + assertThat(map).containsEntry("data", "hello"); + }); } @Test public void stripPrefixWorks() { - restClient.get().uri("/long/path/to/get").exchange().expectStatus().isOk().expectBody(Map.class) - .consumeWith(res -> { - Map map = res.getResponseBody(); - Map headers = getMap(map, "headers"); - assertThat(headers).containsEntry("X-Test", "stripPrefix"); - }); + restClient.get() + .uri("/long/path/to/get") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + Map headers = getMap(map, "headers"); + assertThat(headers).containsEntry("X-Test", "stripPrefix"); + }); } @Test public void stripPrefixPostWorks() { - restClient.post().uri("/long/path/to/post").bodyValue("hello").header("Host", "www.stripprefixpost.org") - .exchange().expectStatus().isOk().expectBody(Map.class).consumeWith(res -> { - Map map = res.getResponseBody(); - assertThat(map).containsEntry("data", "hello"); - Map headers = getMap(map, "headers"); - assertThat(headers).containsEntry("X-Test", "stripPrefixPost"); - }); + restClient.post() + .uri("/long/path/to/post") + .bodyValue("hello") + .header("Host", "www.stripprefixpost.org") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + assertThat(map).containsEntry("data", "hello"); + Map headers = getMap(map, "headers"); + assertThat(headers).containsEntry("X-Test", "stripPrefixPost"); + }); } @Test public void setStatusGatewayRouterFunctionWorks() { - restClient.get().uri("/status/201").exchange().expectStatus().isEqualTo(HttpStatus.TOO_MANY_REQUESTS) - .expectHeader().valueEquals("x-status", "201"); // .expectBody(String.class).isEqualTo("Failed - // with 201"); + restClient.get() + .uri("/status/201") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.TOO_MANY_REQUESTS) + .expectHeader() + .valueEquals("x-status", "201"); // .expectBody(String.class).isEqualTo("Failed + // with 201"); } @Test public void addResponseHeaderWorks() { - restClient.get().uri("/anything/addresheader").exchange().expectStatus().isOk().expectBody(Map.class) - .consumeWith(res -> { - Map map = res.getResponseBody(); - Map headers = getMap(map, "headers"); - assertThat(headers).doesNotContainKey("x-bar"); - assertThat(res.getResponseHeaders()).containsEntry("x-bar", Collections.singletonList("val1")); - }); + restClient.get() + .uri("/anything/addresheader") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + Map headers = getMap(map, "headers"); + assertThat(headers).doesNotContainKey("x-bar"); + assertThat(res.getResponseHeaders()).containsEntry("x-bar", Collections.singletonList("val1")); + }); } @Test public void postWorks() { - restClient.post().uri("/post").bodyValue("Post Value").header("test", "post").exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(res -> { - Map map = res.getResponseBody(); - assertThat(map).isNotEmpty().containsEntry("data", "Post Value"); - }); + restClient.post() + .uri("/post") + .bodyValue("Post Value") + .header("test", "post") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + assertThat(map).isNotEmpty().containsEntry("data", "Post Value"); + }); } @Test public void loadbalancerWorks() { - restClient.get().uri("/anything/loadbalancer").exchange().expectStatus().isOk().expectBody(Map.class) - .consumeWith(res -> { - Map map = res.getResponseBody(); - Map headers = getMap(map, "headers"); - assertThat(headers).containsEntry("X-Test", "loadbalancer"); - }); + restClient.get() + .uri("/anything/loadbalancer") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + Map headers = getMap(map, "headers"); + assertThat(headers).containsEntry("X-Test", "loadbalancer"); + }); } @Test public void hostPredicateWorks() { String host = "www1.myjavadslhost.com"; - restClient.get().uri("/anything/hostpredicate").header("Host", host).exchange().expectStatus().isOk() - .expectHeader().valueEquals("X-SubDomain", "www1").expectBody(Map.class).consumeWith(res -> { - Map map = res.getResponseBody(); - Map headers = getMap(map, "headers"); - assertThat(headers).containsEntry("Host", host); - }); + restClient.get() + .uri("/anything/hostpredicate") + .header("Host", host) + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-SubDomain", "www1") + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + Map headers = getMap(map, "headers"); + assertThat(headers).containsEntry("Host", host); + }); } @Test public void circuitBreakerFallbackWorks() { - restClient.get().uri("/anything/circuitbreakerfallback").exchange().expectStatus().isOk() - .expectBody(String.class).isEqualTo("Hello"); + restClient.get() + .uri("/anything/circuitbreakerfallback") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("Hello"); } @Test public void circuitBreakerGatewayFallbackWorks() { - restClient.get().uri("/anything/circuitbreakergatewayfallback").exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(res -> { - Map headers = getMap(res.getResponseBody(), "headers"); - assertThat(headers).containsKeys(CB_EXECUTION_EXCEPTION_TYPE, CB_EXECUTION_EXCEPTION_MESSAGE); - }); + restClient.get() + .uri("/anything/circuitbreakergatewayfallback") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map headers = getMap(res.getResponseBody(), "headers"); + assertThat(headers).containsKeys(CB_EXECUTION_EXCEPTION_TYPE, CB_EXECUTION_EXCEPTION_MESSAGE); + }); } @Test public void circuitBreakerNoFallbackWorks() { - restClient.get().uri("/anything/circuitbreakernofallback").exchange().expectStatus() - .isEqualTo(HttpStatus.GATEWAY_TIMEOUT); + restClient.get() + .uri("/anything/circuitbreakernofallback") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.GATEWAY_TIMEOUT); } @Test @@ -320,8 +397,13 @@ public class ServerMvcIntegrationTests { restClient.get().uri("/retry?key=get").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("3"); // test for: java.lang.IllegalArgumentException: You have already selected another // retry policy - restClient.get().uri("/retry?key=get2").exchange().expectStatus().isOk().expectBody(String.class) - .isEqualTo("3"); + restClient.get() + .uri("/retry?key=get2") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("3"); } @Test @@ -333,97 +415,152 @@ public class ServerMvcIntegrationTests { @Test public void headerRegexWorks() { restClient.get().uri("/headerregex").exchange().expectStatus().isNotFound(); - restClient.get().uri("/headerregex").header("X-MyHeader", "foo").exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(res -> { - Map map = res.getResponseBody(); - Map headers = getMap(map, "headers"); - assertThat(headers).containsEntry("X-Myheader", "foo"); - }); + restClient.get() + .uri("/headerregex") + .header("X-MyHeader", "foo") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + Map headers = getMap(map, "headers"); + assertThat(headers).containsEntry("X-Myheader", "foo"); + }); } @Test public void cookieRegexWorks() { restClient.get().uri("/cookieregex").exchange().expectStatus().isNotFound(); - restClient.get().uri("/cookieregex").cookie("mycookie", "foo").exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(res -> { - Map map = res.getResponseBody(); - Map headers = getMap(map, "headers"); - assertThat(headers).containsEntry("Cookie", "mycookie=foo"); - }); + restClient.get() + .uri("/cookieregex") + .cookie("mycookie", "foo") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + Map headers = getMap(map, "headers"); + assertThat(headers).containsEntry("Cookie", "mycookie=foo"); + }); } @Test public void rewritePathWorks() { - restClient.get().uri("/foo/get").header("Host", "www.rewritepath.org").exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(res -> { - Map map = res.getResponseBody(); - Map headers = getMap(map, "headers"); - assertThat(headers).containsEntry("X-Test", "rewritepath"); - }); + restClient.get() + .uri("/foo/get") + .header("Host", "www.rewritepath.org") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + Map headers = getMap(map, "headers"); + assertThat(headers).containsEntry("X-Test", "rewritepath"); + }); } @Test public void rewritePathPostWorks() { - restClient.post().uri("/baz/post").bodyValue("hello").header("Host", "www.rewritepathpost.org").exchange() - .expectStatus().isOk().expectBody(Map.class).consumeWith(res -> { - Map map = res.getResponseBody(); - assertThat(map).containsEntry("data", "hello"); - Map headers = getMap(map, "headers"); - assertThat(headers).containsEntry("X-Test", "rewritepathpost"); - }); + restClient.post() + .uri("/baz/post") + .bodyValue("hello") + .header("Host", "www.rewritepathpost.org") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + assertThat(map).containsEntry("data", "hello"); + Map headers = getMap(map, "headers"); + assertThat(headers).containsEntry("X-Test", "rewritepathpost"); + }); } @Test public void rewritePathPostLocalWorks() { - restClient.post().uri("/baz/post").bodyValue("hello").header("Host", "www.rewritepathpostlocal.org").exchange() - .expectStatus().isOk().expectBody(Map.class).consumeWith(res -> { - Map map = res.getResponseBody(); - assertThat(map).containsEntry("data", "hello"); - Map headers = getMap(map, "headers"); - assertThat(headers).containsEntry("x-test", "rewritepathpostlocal"); - }); + restClient.post() + .uri("/baz/post") + .bodyValue("hello") + .header("Host", "www.rewritepathpostlocal.org") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + assertThat(map).containsEntry("data", "hello"); + Map headers = getMap(map, "headers"); + assertThat(headers).containsEntry("x-test", "rewritepathpostlocal"); + }); } @Test public void forwardedHeadersWork() { - restClient.get().uri("/headers").header("test", "forwarded").exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(res -> { - Map map = res.getResponseBody(); - Map headers = getMap(map, "headers"); - assertThat(headers).containsKeys(ForwardedRequestHeadersFilter.FORWARDED_HEADER, - XForwardedRequestHeadersFilter.X_FORWARDED_FOR_HEADER, - XForwardedRequestHeadersFilter.X_FORWARDED_HOST_HEADER, - XForwardedRequestHeadersFilter.X_FORWARDED_PORT_HEADER, - XForwardedRequestHeadersFilter.X_FORWARDED_PROTO_HEADER); - assertThat(headers.get(ForwardedRequestHeadersFilter.FORWARDED_HEADER)).asString() - .contains("proto=http").contains("host=\"localhost:").contains("for=\"127.0.0.1:"); - assertThat(headers.get(XForwardedRequestHeadersFilter.X_FORWARDED_HOST_HEADER)).asString() - .isEqualTo("localhost:" + this.port); - assertThat(headers.get(XForwardedRequestHeadersFilter.X_FORWARDED_PORT_HEADER)).asString() - .isEqualTo(String.valueOf(this.port)); - assertThat(headers.get(XForwardedRequestHeadersFilter.X_FORWARDED_PROTO_HEADER).toString()) - .asString().isEqualTo("http"); - }); + restClient.get() + .uri("/headers") + .header("test", "forwarded") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + Map headers = getMap(map, "headers"); + assertThat(headers).containsKeys(ForwardedRequestHeadersFilter.FORWARDED_HEADER, + XForwardedRequestHeadersFilter.X_FORWARDED_FOR_HEADER, + XForwardedRequestHeadersFilter.X_FORWARDED_HOST_HEADER, + XForwardedRequestHeadersFilter.X_FORWARDED_PORT_HEADER, + XForwardedRequestHeadersFilter.X_FORWARDED_PROTO_HEADER); + assertThat(headers.get(ForwardedRequestHeadersFilter.FORWARDED_HEADER)).asString() + .contains("proto=http") + .contains("host=\"localhost:") + .contains("for=\"127.0.0.1:"); + assertThat(headers.get(XForwardedRequestHeadersFilter.X_FORWARDED_HOST_HEADER)).asString() + .isEqualTo("localhost:" + this.port); + assertThat(headers.get(XForwardedRequestHeadersFilter.X_FORWARDED_PORT_HEADER)).asString() + .isEqualTo(String.valueOf(this.port)); + assertThat(headers.get(XForwardedRequestHeadersFilter.X_FORWARDED_PROTO_HEADER).toString()).asString() + .isEqualTo("http"); + }); } @Test public void requestSizeWorks() { - restClient.post().uri("/post").bodyValue("123456").header("test", "requestsize").exchange().expectStatus() - .isEqualTo(HttpStatus.PAYLOAD_TOO_LARGE).expectHeader().valueMatches("errormessage", - "Request size is larger than permissible limit. Request size is .* where permissible limit is .*"); + restClient.post() + .uri("/post") + .bodyValue("123456") + .header("test", "requestsize") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.PAYLOAD_TOO_LARGE) + .expectHeader() + .valueMatches("errormessage", + "Request size is larger than permissible limit. Request size is .* where permissible limit is .*"); } @Test public void requestHeaderSizeWorks() { - restClient.get().uri("/headers").header("test", "requestheadersize") - .header("X-AnyHeader", - "11111111112222222222333333333344444444445555555555666666666677777777778888888888") - .exchange().expectStatus().isEqualTo(HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE).expectHeader() - .valueMatches("errormessage", - "Request Header/s size is larger than permissible limit (.*). Request Header/s size for 'x-anyheader' is .*"); - restClient.get().uri("/headers").header("test", "requestheadersize") - .header("X-AnyHeader", "111111111122222222223333333333444444444455555555556666666666").exchange() - .expectStatus().isOk(); + restClient.get() + .uri("/headers") + .header("test", "requestheadersize") + .header("X-AnyHeader", "11111111112222222222333333333344444444445555555555666666666677777777778888888888") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE) + .expectHeader() + .valueMatches("errormessage", + "Request Header/s size is larger than permissible limit (.*). Request Header/s size for 'x-anyheader' is .*"); + restClient.get() + .uri("/headers") + .header("test", "requestheadersize") + .header("X-AnyHeader", "111111111122222222223333333333444444444455555555556666666666") + .exchange() + .expectStatus() + .isOk(); } public static final MediaType FORM_URL_ENCODED_CONTENT_TYPE = new MediaType(APPLICATION_FORM_URLENCODED, @@ -469,7 +606,9 @@ public class ServerMvcIntegrationTests { void multipartFormDataRestTemplateWorks() { MultiValueMap> formData = createMultipartData(); RequestEntity>> request = RequestEntity.post("/post") - .contentType(MULTIPART_FORM_DATA).header("Host", "www.testform.org").body(formData); + .contentType(MULTIPART_FORM_DATA) + .header("Host", "www.testform.org") + .body(formData); ResponseEntity response = restTemplate.exchange(request, Map.class); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); assertMultipartData(response.getBody()); @@ -477,8 +616,13 @@ public class ServerMvcIntegrationTests { @Test public void redirectToWorks() { - restClient.get().uri("/anything/redirect").exchange().expectStatus().isEqualTo(HttpStatus.MOVED_PERMANENTLY) - .expectHeader().valueEquals(HttpHeaders.LOCATION, "https://exampleredirect.com"); + restClient.get() + .uri("/anything/redirect") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.MOVED_PERMANENTLY) + .expectHeader() + .valueEquals(HttpHeaders.LOCATION, "https://exampleredirect.com"); } private MultiValueMap> createMultipartData() { @@ -497,41 +641,65 @@ public class ServerMvcIntegrationTests { @Test public void removeRequestHeaderWorks() { - restClient.get().uri("/anything/removerequestheader").header("X-Request-Foo", "Bar").exchange().expectStatus() - .isOk().expectBody(Map.class).consumeWith(res -> { - Map map = res.getResponseBody(); - Map headers = getMap(map, "headers"); - assertThat(headers).doesNotContainKey("X-Request-Foo"); - }); + restClient.get() + .uri("/anything/removerequestheader") + .header("X-Request-Foo", "Bar") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map map = res.getResponseBody(); + Map headers = getMap(map, "headers"); + assertThat(headers).doesNotContainKey("X-Request-Foo"); + }); } @Test public void setRequestHeaderWorks() { - restClient.get().uri("/headers").header("test", "setrequestheader").exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(res -> { - Map headers = getMap(res.getResponseBody(), "headers"); - assertThat(headers).doesNotContainEntry("X-Test", "value1"); - assertThat(headers).containsEntry("X-Test", "value2"); - }); + restClient.get() + .uri("/headers") + .header("test", "setrequestheader") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map headers = getMap(res.getResponseBody(), "headers"); + assertThat(headers).doesNotContainEntry("X-Test", "value1"); + assertThat(headers).containsEntry("X-Test", "value2"); + }); } @Test public void setRequestHeaderHostWorks() { - restClient.get().uri("/headers").header("Host", "www.setrequesthostheader.org").exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(res -> { - Map headers = getMap(res.getResponseBody(), "headers"); - assertThat(headers).containsEntry("Host", "otherhost.io"); - }); + restClient.get() + .uri("/headers") + .header("Host", "www.setrequesthostheader.org") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map headers = getMap(res.getResponseBody(), "headers"); + assertThat(headers).containsEntry("Host", "otherhost.io"); + }); } @Test public void setResponseHeaderWorks() { - restClient.get().uri("/anything/setresponseheader").header("test", "setresponseheader").exchange() - .expectStatus().isOk().expectBody(Map.class).consumeWith(res -> { - HttpHeaders headers = res.getResponseHeaders(); - assertThat(headers).doesNotContainEntry("X-Test", List.of("value1")); - assertThat(headers).containsEntry("X-Test", List.of("value2")); - }); + restClient.get() + .uri("/anything/setresponseheader") + .header("test", "setresponseheader") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + HttpHeaders headers = res.getResponseHeaders(); + assertThat(headers).doesNotContainEntry("X-Test", List.of("value1")); + assertThat(headers).containsEntry("X-Test", List.of("value2")); + }); } @Test @@ -541,38 +709,70 @@ public class ServerMvcIntegrationTests { } private void testNestedRoute(String nestedPath) { - restClient.get().uri("/anything/nested/" + nestedPath).header("test", "nested").exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(res -> { - Map headers = getMap(res.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Test", nestedPath); - }); + restClient.get() + .uri("/anything/nested/" + nestedPath) + .header("test", "nested") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map headers = getMap(res.getResponseBody(), "headers"); + assertThat(headers).containsEntry("X-Test", nestedPath); + }); } @Test public void removeRequestParameterWorks() { - restClient.get().uri("/anything/removerequestparameter?foo=bar").header("test", "removerequestparam").exchange() - .expectStatus().isOk().expectHeader().doesNotExist("foo"); + restClient.get() + .uri("/anything/removerequestparameter?foo=bar") + .header("test", "removerequestparam") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .doesNotExist("foo"); } @Test public void removeRequestParameterPostWorks() { - restClient.post().uri("/post?foo=bar").bodyValue("hello").header("Host", "www.removerequestparampost.org") - .exchange().expectStatus().isOk().expectHeader().doesNotExist("foo").expectBody(Map.class) - .consumeWith(res -> { - assertThat(res.getResponseBody()).containsEntry("data", "hello"); - }); + restClient.post() + .uri("/post?foo=bar") + .bodyValue("hello") + .header("Host", "www.removerequestparampost.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .doesNotExist("foo") + .expectBody(Map.class) + .consumeWith(res -> { + assertThat(res.getResponseBody()).containsEntry("data", "hello"); + }); } @Test public void removeResponseHeaderWorks() { - restClient.get().uri("/anything/removeresponseheader").header("test", "removeresponseheader").exchange() - .expectStatus().isOk().expectHeader().doesNotExist("X-Test"); + restClient.get() + .uri("/anything/removeresponseheader") + .header("test", "removeresponseheader") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .doesNotExist("X-Test"); } @Test public void rewriteResponseHeaderWorks() { - restClient.get().uri("/headers").header("test", "rewriteresponseheader").exchange().expectStatus().isOk() - .expectHeader().valueEquals("X-Request-Foo", "/42?user=ford&password=***&flag=true"); + restClient.get() + .uri("/headers") + .header("test", "rewriteresponseheader") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-Request-Foo", "/42?user=ford&password=***&flag=true"); } @Test @@ -589,75 +789,126 @@ public class ServerMvcIntegrationTests { @Test public void mapRequestHeaderWorks() { - restClient.get().uri("/anything/maprequestheader").header("X-Foo", "fooval").exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(res -> { - Map headers = getMap(res.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Bar", "fooval"); - }); + restClient.get() + .uri("/anything/maprequestheader") + .header("X-Foo", "fooval") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map headers = getMap(res.getResponseBody(), "headers"); + assertThat(headers).containsEntry("X-Bar", "fooval"); + }); } @Test public void dedupeResponseHeaderWorks() { - restClient.get().uri("/headers").header("Host", "www.deduperesponseheader.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals("Access-Control-Allow-Credentials", "true").expectHeader() - .valueEquals("Access-Control-Allow-Origin", "https://example.org").expectHeader() - .valueEquals("Scout-Cookie", "S'mores").expectHeader() - .valueEquals("Next-Week-Lottery-Numbers", "4", "2", "42"); + restClient.get() + .uri("/headers") + .header("Host", "www.deduperesponseheader.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("Access-Control-Allow-Credentials", "true") + .expectHeader() + .valueEquals("Access-Control-Allow-Origin", "https://example.org") + .expectHeader() + .valueEquals("Scout-Cookie", "S'mores") + .expectHeader() + .valueEquals("Next-Week-Lottery-Numbers", "4", "2", "42"); } @Test public void addRequestHeadersIfNotPresentWorks() { - restClient.get().uri("/headers").header("Host", "www.addrequestheadersifnotpresent.org") - .header("X-Request-Beta", "Value1").exchange().expectStatus().isOk().expectBody(Map.class) - .consumeWith(res -> { - Map headers = getMap(res.getResponseBody(), "headers"); - // this asserts that Value2 was not added - assertThat(headers).containsEntry("X-Request-Beta", "Value1"); - assertThat(headers).containsKey("X-Request-Acme"); - List values = (List) headers.get("X-Request-Acme"); - assertThat(values).hasSize(4).containsOnly("ValueX", "ValueY", "ValueZ", "www"); - }); + restClient.get() + .uri("/headers") + .header("Host", "www.addrequestheadersifnotpresent.org") + .header("X-Request-Beta", "Value1") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map headers = getMap(res.getResponseBody(), "headers"); + // this asserts that Value2 was not added + assertThat(headers).containsEntry("X-Request-Beta", "Value1"); + assertThat(headers).containsKey("X-Request-Acme"); + List values = (List) headers.get("X-Request-Acme"); + assertThat(values).hasSize(4).containsOnly("ValueX", "ValueY", "ValueZ", "www"); + }); } @Test public void rewriteLocationResponseHeaderWorks() { - restClient.get().uri("/anything/rewritelocationresponseheader") - .header("Host", "test1.rewritelocationresponseheader.org").exchange().expectStatus().isOk() - .expectHeader() - .valueEquals("Location", "https://test1.rewritelocationresponseheader.org/some/object/id"); + restClient.get() + .uri("/anything/rewritelocationresponseheader") + .header("Host", "test1.rewritelocationresponseheader.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("Location", "https://test1.rewritelocationresponseheader.org/some/object/id"); } @Test public void readBodyWorks() { Event messageEvent = new Event("message", "bar"); - restClient.post().uri("/events").bodyValue(messageEvent).exchange().expectStatus().isOk().expectHeader() - .valueEquals("X-Foo", "message").expectBody(Event.class) - .consumeWith(res -> assertThat(res.getResponseBody()).isEqualTo(messageEvent)); + restClient.post() + .uri("/events") + .bodyValue(messageEvent) + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-Foo", "message") + .expectBody(Event.class) + .consumeWith(res -> assertThat(res.getResponseBody()).isEqualTo(messageEvent)); Event messageChannelEvent = new Event("message.channel", "baz"); - restClient.post().uri("/events").bodyValue(messageChannelEvent).exchange().expectStatus().isOk().expectHeader() - .valueEquals("X-Channel-Foo", "message.channel").expectBody(Event.class) - .consumeWith(res -> assertThat(res.getResponseBody()).isEqualTo(messageChannelEvent)); + restClient.post() + .uri("/events") + .bodyValue(messageChannelEvent) + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-Channel-Foo", "message.channel") + .expectBody(Event.class) + .consumeWith(res -> assertThat(res.getResponseBody()).isEqualTo(messageChannelEvent)); } @Test @SuppressWarnings("unchecked") public void rewriteRequestBodyStringWorks() { - restClient.post().uri("/post").header("Host", "www.modifyrequestbodystring.org").bodyValue("hello").exchange() - .expectStatus().isOk().expectBody(Map.class) - .consumeWith(result -> assertThat(result.getResponseBody()).containsEntry("data", "HELLOHELLO")); + restClient.post() + .uri("/post") + .header("Host", "www.modifyrequestbodystring.org") + .bodyValue("hello") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> assertThat(result.getResponseBody()).containsEntry("data", "HELLOHELLO")); } @Test @SuppressWarnings("unchecked") public void rewriteRequestBodyObjectWorks() { - restClient.post().uri("/post").header("Host", "www.modifyrequestbodyobject.org").bodyValue("hello world") - .exchange().expectStatus().isOk().expectBody(Map.class) - .consumeWith(result -> assertThat(result.getResponseBody()).containsEntry("data", - "{\"message\":\"HELLO WORLD\"}")); + restClient.post() + .uri("/post") + .header("Host", "www.modifyrequestbodyobject.org") + .bodyValue("hello world") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> assertThat(result.getResponseBody()).containsEntry("data", + "{\"message\":\"HELLO WORLD\"}")); } @Test @@ -667,45 +918,66 @@ public class ServerMvcIntegrationTests { @Test public void forwardNon200StatusWorks() { - restClient.get().uri("/doforward2").exchange().expectStatus().isCreated().expectBody(String.class) - .isEqualTo("hello2"); + restClient.get() + .uri("/doforward2") + .exchange() + .expectStatus() + .isCreated() + .expectBody(String.class) + .isEqualTo("hello2"); } @Test @SuppressWarnings("rawtypes") public void queryParamWorks() { - restClient.get().uri("/get?foo=bar").exchange().expectStatus().isOk().expectBody(Map.class) - .consumeWith(result -> { - Map responseBody = result.getResponseBody(); - assertThat(responseBody).containsKey("args"); - Map args = getMap(responseBody, "args"); - assertThat(args).containsKey("foo"); - assertThat(args.get("foo")).isEqualTo("bar"); - }); + restClient.get() + .uri("/get?foo=bar") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + Map responseBody = result.getResponseBody(); + assertThat(responseBody).containsKey("args"); + Map args = getMap(responseBody, "args"); + assertThat(args).containsKey("foo"); + assertThat(args.get("foo")).isEqualTo("bar"); + }); } @SuppressWarnings("rawtypes") @Test public void queryParamWithSpecialCharactersWorks() { - restClient.get().uri("/get?myparam= &intlparam=æøå").exchange().expectStatus().isOk().expectBody(Map.class) - .consumeWith(result -> { - Map responseBody = result.getResponseBody(); - assertThat(responseBody).containsKey("args"); - Map args = getMap(responseBody, "args"); - assertThat(args).containsKey("myparam"); - assertThat(args.get("myparam")).isEqualTo(" "); - assertThat(args).containsKey("intlparam"); - assertThat(args.get("intlparam")).isEqualTo("æøå"); - }); + restClient.get() + .uri("/get?myparam= &intlparam=æøå") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + Map responseBody = result.getResponseBody(); + assertThat(responseBody).containsKey("args"); + Map args = getMap(responseBody, "args"); + assertThat(args).containsKey("myparam"); + assertThat(args.get("myparam")).isEqualTo(" "); + assertThat(args).containsKey("intlparam"); + assertThat(args.get("intlparam")).isEqualTo("æøå"); + }); } @Test public void clientResponseBodyAttributeWorks() { - restClient.get().uri("/anything/readresponsebody").header("X-Foo", "fooval").exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(res -> { - Map headers = getMap(res.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Foo", "FOOVAL"); - }); + restClient.get() + .uri("/anything/readresponsebody") + .header("X-Foo", "fooval") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map headers = getMap(res.getResponseBody(), "headers"); + assertThat(headers).containsEntry("X-Foo", "FOOVAL"); + }); } @SpringBootConfiguration @@ -742,7 +1014,7 @@ public class ServerMvcIntegrationTests { @Bean public RouterFunction nonGatewayRouterFunctions2() { return route(GET("/hello2"), request -> ServerResponse.status(HttpStatus.CREATED).body("hello2")) - .withAttribute(MvcUtils.GATEWAY_ROUTE_ID_ATTR, "hello2"); + .withAttribute(MvcUtils.GATEWAY_ROUTE_ID_ATTR, "hello2"); } @Bean diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/TokenRelayFilterFunctionsTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/TokenRelayFilterFunctionsTests.java index a0647581..7f896216 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/TokenRelayFilterFunctionsTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/TokenRelayFilterFunctionsTests.java @@ -86,8 +86,10 @@ public class TokenRelayFilterFunctionsTests { when(accessToken.getTokenValue()).thenReturn("mytoken"); ClientRegistration clientRegistration = ClientRegistration.withRegistrationId("myregistrationid") - .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS).clientId("myclientid") - .tokenUri("mytokenuri").build(); + .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS) + .clientId("myclientid") + .tokenUri("mytokenuri") + .build(); OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(clientRegistration, "joe", accessToken); when(authorizedClientManager.authorize(any(OAuth2AuthorizeRequest.class))).thenReturn(authorizedClient); diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/VanillaRouterFunctionTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/VanillaRouterFunctionTests.java index d187329d..4959d897 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/VanillaRouterFunctionTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/VanillaRouterFunctionTests.java @@ -56,10 +56,17 @@ public class VanillaRouterFunctionTests { @SuppressWarnings("rawtypes") @Test public void routerFunctionsRouteWorks() { - restClient.post().uri("/anything/routerfunctionsroute").header("Host", "www.routerfunctionsroute.org") - .bodyValue("hello").exchange().expectStatus().isOk().expectBody(Map.class).consumeWith(result -> { - System.out.println(); - }); + restClient.post() + .uri("/anything/routerfunctionsroute") + .header("Host", "www.routerfunctionsroute.org") + .bodyValue("hello") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + System.out.println(); + }); } @SpringBootConfiguration diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcPropertiesBeanDefinitionRegistrarTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcPropertiesBeanDefinitionRegistrarTests.java index f9d65fa4..f4f7675c 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcPropertiesBeanDefinitionRegistrarTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcPropertiesBeanDefinitionRegistrarTests.java @@ -65,8 +65,8 @@ public class GatewayMvcPropertiesBeanDefinitionRegistrarTests { void contextLoads(ApplicationContext context) { Map routerFunctions = getRouterFunctions(context); - assertThat(routerFunctions).hasSizeGreaterThanOrEqualTo(5).containsKeys("listRoute1", "route1", - "route2CustomId", "listRoute2", "listRoute3", "listRoute4"); + assertThat(routerFunctions).hasSizeGreaterThanOrEqualTo(5) + .containsKeys("listRoute1", "route1", "route2CustomId", "listRoute2", "listRoute3", "listRoute4"); RouterFunction listRoute1RouterFunction = routerFunctions.get("listRoute1"); listRoute1RouterFunction.accept(new AbstractRouterFunctionsVisitor() { @Override @@ -152,7 +152,7 @@ public class GatewayMvcPropertiesBeanDefinitionRegistrarTests { public void attributes(Map attributes) { if (attributes.containsKey("gatewayRouterFunctions")) { Map map = (Map) attributes - .get("gatewayRouterFunctions"); + .get("gatewayRouterFunctions"); routerFunctionsRef.compareAndSet(null, map); } } @@ -165,21 +165,32 @@ public class GatewayMvcPropertiesBeanDefinitionRegistrarTests { @Test @SuppressWarnings("unchecked") public void configuredRouteWorks() { - restClient.get().uri("/anything/listRoute1").exchange().expectStatus().isOk().expectBody(Map.class) - .consumeWith(res -> { - Map headers = getMap(res.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Test", "listRoute1"); - }); + restClient.get() + .uri("/anything/listRoute1") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map headers = getMap(res.getResponseBody(), "headers"); + assertThat(headers).containsEntry("X-Test", "listRoute1"); + }); } @Test @SuppressWarnings("unchecked") public void lbRouteWorks() { - restClient.get().uri("/anything/listRoute3").header("MyHeaderName", "MyHeaderVal").exchange().expectStatus() - .isOk().expectBody(Map.class).consumeWith(res -> { - Map headers = getMap(res.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Test", "listRoute3"); - }); + restClient.get() + .uri("/anything/listRoute3") + .header("MyHeaderName", "MyHeaderVal") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map headers = getMap(res.getResponseBody(), "headers"); + assertThat(headers).containsEntry("X-Test", "listRoute3"); + }); } @Test @@ -187,21 +198,28 @@ public class GatewayMvcPropertiesBeanDefinitionRegistrarTests { void refreshWorks(ConfigurableApplicationContext context) { Map routerFunctions = getRouterFunctions(context); assertThat(routerFunctions).hasSize(6); - TestPropertyValues.of("spring.cloud.gateway.mvc.routesMap.route3.uri=https://example3.com", - "spring.cloud.gateway.mvc.routesMap.route3.predicates[0].name=Path", - "spring.cloud.gateway.mvc.routesMap.route3.predicates[0].args.pattern=/anything/mapRoute3", - "spring.cloud.gateway.mvc.routesMap.route3.filters[0].Name=HttpbinUriResolver", - "spring.cloud.gateway.mvc.routesMap.route3.filters[1].Name=AddRequestHeader", - "spring.cloud.gateway.mvc.routesMap.route3.filters[1].args.name=X-Test", - "spring.cloud.gateway.mvc.routesMap.route3.filters[1].args.values=mapRoute3").applyTo(context); + TestPropertyValues + .of("spring.cloud.gateway.mvc.routesMap.route3.uri=https://example3.com", + "spring.cloud.gateway.mvc.routesMap.route3.predicates[0].name=Path", + "spring.cloud.gateway.mvc.routesMap.route3.predicates[0].args.pattern=/anything/mapRoute3", + "spring.cloud.gateway.mvc.routesMap.route3.filters[0].Name=HttpbinUriResolver", + "spring.cloud.gateway.mvc.routesMap.route3.filters[1].Name=AddRequestHeader", + "spring.cloud.gateway.mvc.routesMap.route3.filters[1].args.name=X-Test", + "spring.cloud.gateway.mvc.routesMap.route3.filters[1].args.values=mapRoute3") + .applyTo(context); ContextRefresher contextRefresher = context.getBean(ContextRefresher.class); contextRefresher.refresh(); // make http call before getRouterFunction() - restClient.get().uri("/anything/mapRoute3").exchange().expectStatus().isOk().expectBody(Map.class) - .consumeWith(res -> { - Map headers = getMap(res.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Test", "mapRoute3"); - }); + restClient.get() + .uri("/anything/mapRoute3") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map headers = getMap(res.getResponseBody(), "headers"); + assertThat(headers).containsEntry("X-Test", "mapRoute3"); + }); GatewayMvcProperties properties = context.getBean(GatewayMvcProperties.class); assertThat(properties.getRoutesMap()).hasSize(3).containsKey("route3"); diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/ForwardedRequestHeadersFilterTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/ForwardedRequestHeadersFilterTests.java index e3117e53..4da36cdc 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/ForwardedRequestHeadersFilterTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/ForwardedRequestHeadersFilterTests.java @@ -55,7 +55,9 @@ public class ForwardedRequestHeadersFilterTests { @Test public void forwardedHeaderDoesNotExist() { MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/get") - .remoteAddress("10.0.0.1:80").header(HttpHeaders.HOST, "myhost").buildRequest(null); + .remoteAddress("10.0.0.1:80") + .header(HttpHeaders.HOST, "myhost") + .buildRequest(null); servletRequest.setRemoteHost("10.0.0.1"); ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList()); @@ -70,16 +72,17 @@ public class ForwardedRequestHeadersFilterTests { assertThat(forwardeds).hasSize(1); Forwarded forwarded = forwardeds.get(0); - assertThat(forwarded.getValues()).containsEntry("host", "myhost").containsEntry("proto", "http") - .containsEntry("for", "\"10.0.0.1:80\""); + assertThat(forwarded.getValues()).containsEntry("host", "myhost") + .containsEntry("proto", "http") + .containsEntry("for", "\"10.0.0.1:80\""); } @Test public void forwardedHeaderExists() { MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/get") - .remoteAddress("10.0.0.1:80") - .header(FORWARDED_HEADER, "for=12.34.56.78;host=example.com;proto=https; for=23.45.67.89") - .buildRequest(null); + .remoteAddress("10.0.0.1:80") + .header(FORWARDED_HEADER, "for=12.34.56.78;host=example.com;proto=https; for=23.45.67.89") + .buildRequest(null); servletRequest.setRemoteHost("10.0.0.1"); ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList()); @@ -95,17 +98,18 @@ public class ForwardedRequestHeadersFilterTests { Forwarded addedForwardedHeader = forwardeds.get(0); Forwarded existingForwardedHeader = forwardeds.get(1); - assertThat(existingForwardedHeader.getValues()).containsEntry("proto", "http").containsEntry("for", - "\"10.0.0.1:80\""); + assertThat(existingForwardedHeader.getValues()).containsEntry("proto", "http") + .containsEntry("for", "\"10.0.0.1:80\""); - assertThat(addedForwardedHeader.getValues()).containsEntry("proto", "https").containsEntry("for", - "23.45.67.89"); + assertThat(addedForwardedHeader.getValues()).containsEntry("proto", "https") + .containsEntry("for", "23.45.67.89"); } @Test public void noHostHeader() throws UnknownHostException { MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/get") - .remoteAddress("10.0.0.1:80").buildRequest(null); + .remoteAddress("10.0.0.1:80") + .buildRequest(null); servletRequest.setRemoteHost("10.0.0.1"); ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList()); @@ -126,7 +130,9 @@ public class ForwardedRequestHeadersFilterTests { @Test public void correctIPv6RemoteAddressMapping() throws UnknownHostException { MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/get") - .remoteAddress("2001:db8:cafe:0:0:0:0:17:80").header(HttpHeaders.HOST, "myhost").buildRequest(null); + .remoteAddress("2001:db8:cafe:0:0:0:0:17:80") + .header(HttpHeaders.HOST, "myhost") + .buildRequest(null); servletRequest.setRemoteHost("2001:db8:cafe:0:0:0:0:17"); ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList()); @@ -147,7 +153,8 @@ public class ForwardedRequestHeadersFilterTests { @Test public void unresolvedRemoteAddressFallsBackToHostName() throws UnknownHostException { MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/get") - .remoteAddress("unresolvable-hostname:80").buildRequest(null); + .remoteAddress("unresolvable-hostname:80") + .buildRequest(null); servletRequest.setRemoteHost("unresolvable-hostname"); ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList()); @@ -162,8 +169,8 @@ public class ForwardedRequestHeadersFilterTests { assertThat(forwardeds).hasSize(1); Forwarded forwarded = forwardeds.get(0); - assertThat(forwarded.getValues()).containsEntry("proto", "http").containsEntry("for", - "\"unresolvable-hostname:80\""); + assertThat(forwarded.getValues()).containsEntry("proto", "http") + .containsEntry("for", "\"unresolvable-hostname:80\""); } @Test diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/TransferEncodingNormalizationRequestHeadersFilterTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/TransferEncodingNormalizationRequestHeadersFilterTests.java index b9a8703c..11c1a779 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/TransferEncodingNormalizationRequestHeadersFilterTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/TransferEncodingNormalizationRequestHeadersFilterTests.java @@ -32,7 +32,8 @@ public class TransferEncodingNormalizationRequestHeadersFilterTests { @Test public void noTransferEncodingWithContentLength() { MockHttpServletRequest servletRequest = MockMvcRequestBuilders.post("http://localhost/post") - .header(HttpHeaders.CONTENT_LENGTH, "6").buildRequest(null); + .header(HttpHeaders.CONTENT_LENGTH, "6") + .buildRequest(null); HttpHeaders headers = testFilter(ServerRequest.create(servletRequest, Collections.emptyList())); assertThat(headers).containsKey(HttpHeaders.CONTENT_LENGTH).doesNotContainKey(HttpHeaders.TRANSFER_ENCODING); @@ -41,8 +42,9 @@ public class TransferEncodingNormalizationRequestHeadersFilterTests { @Test public void transferEncodingWithContentLength() { MockHttpServletRequest servletRequest = MockMvcRequestBuilders.post("http://localhost/post") - .header(HttpHeaders.CONTENT_LENGTH, "6").header(HttpHeaders.TRANSFER_ENCODING, "chunked") - .buildRequest(null); + .header(HttpHeaders.CONTENT_LENGTH, "6") + .header(HttpHeaders.TRANSFER_ENCODING, "chunked") + .buildRequest(null); HttpHeaders headers = testFilter(ServerRequest.create(servletRequest, Collections.emptyList())); assertThat(headers).doesNotContainKey(HttpHeaders.CONTENT_LENGTH).containsKey(HttpHeaders.TRANSFER_ENCODING); @@ -51,8 +53,9 @@ public class TransferEncodingNormalizationRequestHeadersFilterTests { @Test public void transferEncodingCaseInsensitiveWithContentLength() { MockHttpServletRequest servletRequest = MockMvcRequestBuilders.post("http://localhost/post") - .header(HttpHeaders.CONTENT_LENGTH, "6").header(HttpHeaders.TRANSFER_ENCODING, "Chunked ") - .buildRequest(null); + .header(HttpHeaders.CONTENT_LENGTH, "6") + .header(HttpHeaders.TRANSFER_ENCODING, "Chunked ") + .buildRequest(null); HttpHeaders headers = testFilter(ServerRequest.create(servletRequest, Collections.emptyList())); assertThat(headers).doesNotContainKey(HttpHeaders.CONTENT_LENGTH).containsKey(HttpHeaders.TRANSFER_ENCODING); diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/WeightRequestPredicateIntegrationTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/WeightRequestPredicateIntegrationTests.java index d33babbd..a962711d 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/WeightRequestPredicateIntegrationTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/WeightRequestPredicateIntegrationTests.java @@ -64,16 +64,28 @@ public class WeightRequestPredicateIntegrationTests { public void highWeight() { filter.setRandomSupplier(getRandom(0.9)); - testClient.get().uri("/get").header(HttpHeaders.HOST, "www.weight-high.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals("X-Route", "weight_high_test"); + testClient.get() + .uri("/get") + .header(HttpHeaders.HOST, "www.weight-high.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-Route", "weight_high_test"); } @Test public void lowWeight() { filter.setRandomSupplier(getRandom(0.1)); - testClient.get().uri("/get").header(HttpHeaders.HOST, "www.weight-low.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals("X-Route", "weight_low_test"); + testClient.get() + .uri("/get") + .header(HttpHeaders.HOST, "www.weight-low.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-Route", "weight_low_test"); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/HttpbinTestcontainers.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/HttpbinTestcontainers.java index 8b1f7be9..e1dc98a4 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/HttpbinTestcontainers.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/HttpbinTestcontainers.java @@ -49,7 +49,7 @@ public class HttpbinTestcontainers implements ApplicationContextInitializer createContainer() { return new GenericContainer<>(DEFAULT_IMAGE_NAME).withExposedPorts(DEFAULT_PORT) - .waitingFor(new HttpWaitStrategy().forPort(DEFAULT_PORT)); + .waitingFor(new HttpWaitStrategy().forPort(DEFAULT_PORT)); } @Override diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/DefaultTestRestClient.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/DefaultTestRestClient.java index 0f2db1ec..b3605f39 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/DefaultTestRestClient.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/DefaultTestRestClient.java @@ -569,7 +569,8 @@ public class DefaultTestRestClient implements TestRestClient { return ""; } Charset charset = Optional.ofNullable(this.result.getResponseHeaders().getContentType()) - .map(MimeType::getCharset).orElse(StandardCharsets.UTF_8); + .map(MimeType::getCharset) + .orElse(StandardCharsets.UTF_8); return new String(body, charset); } diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/ExchangeResult.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/ExchangeResult.java index 694a7e02..427aed77 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/ExchangeResult.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/ExchangeResult.java @@ -264,8 +264,10 @@ public class ExchangeResult { } private String formatHeaders(HttpHeaders headers, String delimiter) { - return headers.entrySet().stream().map(entry -> entry.getKey() + ": " + entry.getValue()) - .collect(Collectors.joining(delimiter)); + return headers.entrySet() + .stream() + .map(entry -> entry.getKey() + ": " + entry.getValue()) + .collect(Collectors.joining(delimiter)); } @Nullable diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/HeaderAssertions.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/HeaderAssertions.java index 4d640a4d..6e56a0e8 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/HeaderAssertions.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/HeaderAssertions.java @@ -124,10 +124,10 @@ public class HeaderAssertions { this.exchangeResult.assertWithDiagnostics(() -> { List values = getRequiredValues(name); AssertionErrors - .assertTrue( - getMessage(name) + " has fewer or more values " + values - + " than number of patterns to match with " + Arrays.toString(patterns), - values.size() == patterns.length); + .assertTrue( + getMessage(name) + " has fewer or more values " + values + + " than number of patterns to match with " + Arrays.toString(patterns), + values.size() == patterns.length); for (int i = 0; i < values.size(); i++) { String value = values.get(i); String pattern = patterns[i]; diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/StatusAssertions.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/StatusAssertions.java index 41b526ed..8f115e5d 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/StatusAssertions.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/StatusAssertions.java @@ -150,7 +150,7 @@ public class StatusAssertions { public TestRestClient.ResponseSpec reasonEquals(String reason) { String actual = getReasonPhrase(this.exchangeResult.getStatus()); this.exchangeResult - .assertWithDiagnostics(() -> AssertionErrors.assertEquals("Response status reason", reason, actual)); + .assertWithDiagnostics(() -> AssertionErrors.assertEquals("Response status reason", reason, actual)); return this.responseSpec; } diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/XpathAssertions.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/XpathAssertions.java index 1612d2f5..dee9edcf 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/XpathAssertions.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/client/XpathAssertions.java @@ -180,8 +180,12 @@ public class XpathAssertions { } private String getCharset() { - return Optional.of(this.bodySpec.returnResult()).map(EntityExchangeResult::getResponseHeaders) - .map(HttpHeaders::getContentType).map(MimeType::getCharset).orElse(StandardCharsets.UTF_8).name(); + return Optional.of(this.bodySpec.returnResult()) + .map(EntityExchangeResult::getResponseHeaders) + .map(HttpHeaders::getContentType) + .map(MimeType::getCharset) + .orElse(StandardCharsets.UTF_8) + .name(); } @Override diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/AbstractGatewayControllerEndpoint.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/AbstractGatewayControllerEndpoint.java index c1f57892..77c4f846 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/AbstractGatewayControllerEndpoint.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/AbstractGatewayControllerEndpoint.java @@ -120,35 +120,43 @@ public class AbstractGatewayControllerEndpoint implements ApplicationEventPublis getAvailableEndpointsForClass(AbstractGatewayControllerEndpoint.class.getName()), getAvailableEndpointsForClass(GatewayControllerEndpoint.class.getName())); - return Flux.fromIterable(endpoints).map(p -> p) - .flatMap(path -> this.routeLocator.getRoutes().map(r -> generateHref(r, path)).distinct().collectList() - .flatMapMany(Flux::fromIterable)) - .distinct() // Ensure overall uniqueness - .collectList(); + return Flux.fromIterable(endpoints) + .map(p -> p) + .flatMap(path -> this.routeLocator.getRoutes() + .map(r -> generateHref(r, path)) + .distinct() + .collectList() + .flatMapMany(Flux::fromIterable)) + .distinct() // Ensure overall uniqueness + .collectList(); } private List mergeEndpoints(List listA, List listB) { Map> mergedMap = new HashMap<>(); - Stream.concat(listA.stream(), listB.stream()).forEach(e -> mergedMap - .computeIfAbsent(e.getHref(), k -> new ArrayList<>()).addAll(Arrays.asList(e.getMethods()))); + Stream.concat(listA.stream(), listB.stream()) + .forEach(e -> mergedMap.computeIfAbsent(e.getHref(), k -> new ArrayList<>()) + .addAll(Arrays.asList(e.getMethods()))); - return mergedMap.entrySet().stream().map(entry -> new GatewayEndpointInfo(entry.getKey(), entry.getValue())) - .collect(Collectors.toList()); + return mergedMap.entrySet() + .stream() + .map(entry -> new GatewayEndpointInfo(entry.getKey(), entry.getValue())) + .collect(Collectors.toList()); } private List getAvailableEndpointsForClass(String className) { try { MetadataReader metadataReader = simpleMetadataReaderFactory.getMetadataReader(className); Set annotatedMethods = metadataReader.getAnnotationMetadata() - .getAnnotatedMethods(RequestMapping.class.getName()); + .getAnnotatedMethods(RequestMapping.class.getName()); String gatewayActuatorPath = webEndpointProperties.getBasePath() + "/gateway"; - return annotatedMethods.stream().map(method -> new GatewayEndpointInfo(gatewayActuatorPath - + ((String[]) method.getAnnotationAttributes(RequestMapping.class.getName()).get("path"))[0], - ((RequestMethod[]) method.getAnnotationAttributes(RequestMapping.class.getName()).get("method"))[0] - .name())) - .collect(Collectors.toList()); + return annotatedMethods.stream() + .map(method -> new GatewayEndpointInfo(gatewayActuatorPath + + ((String[]) method.getAnnotationAttributes(RequestMapping.class.getName()).get("path"))[0], + ((RequestMethod[]) method.getAnnotationAttributes(RequestMapping.class.getName()) + .get("method"))[0].name())) + .collect(Collectors.toList()); } catch (IOException exception) { log.warn(exception.getMessage()); @@ -186,8 +194,9 @@ public class AbstractGatewayControllerEndpoint implements ApplicationEventPublis } private Map convertToMap(List byMetadata) { - return byMetadata.stream().map(keyValueStr -> keyValueStr.split(":")) - .collect(Collectors.toMap(kv -> kv[0], kv -> kv.length > 1 ? kv[1] : null)); + return byMetadata.stream() + .map(keyValueStr -> keyValueStr.split(":")) + .collect(Collectors.toMap(kv -> kv[0], kv -> kv.length > 1 ? kv[1] : null)); } @GetMapping("/globalfilters") @@ -228,13 +237,14 @@ public class AbstractGatewayControllerEndpoint implements ApplicationEventPublis @SuppressWarnings("unchecked") public Mono> save(@PathVariable String id, @RequestBody RouteDefinition route) { - return Mono.just(route).doOnNext(this::validateRouteDefinition) - .flatMap(routeDefinition -> this.routeDefinitionWriter.save(Mono.just(routeDefinition).map(r -> { - r.setId(id); - log.debug("Saving route: " + route); - return r; - })).then(Mono.defer(() -> Mono.just(ResponseEntity.created(URI.create("/routes/" + id)).build())))) - .switchIfEmpty(Mono.defer(() -> Mono.just(ResponseEntity.badRequest().build()))); + return Mono.just(route) + .doOnNext(this::validateRouteDefinition) + .flatMap(routeDefinition -> this.routeDefinitionWriter.save(Mono.just(routeDefinition).map(r -> { + r.setId(id); + log.debug("Saving route: " + route); + return r; + })).then(Mono.defer(() -> Mono.just(ResponseEntity.created(URI.create("/routes/" + id)).build())))) + .switchIfEmpty(Mono.defer(() -> Mono.just(ResponseEntity.badRequest().build()))); } @PostMapping("/routes") @@ -246,11 +256,12 @@ public class AbstractGatewayControllerEndpoint implements ApplicationEventPublis }); return Flux.fromIterable(routes) - .flatMap(routeDefinition -> this.routeDefinitionWriter.save(Mono.just(routeDefinition).map(r -> { - log.debug("Saving route: " + routeDefinition); - return r; - }))).then(Mono.defer(() -> Mono.just(ResponseEntity.ok().build()))) - .switchIfEmpty(Mono.defer(() -> Mono.just(ResponseEntity.badRequest().build()))); + .flatMap(routeDefinition -> this.routeDefinitionWriter.save(Mono.just(routeDefinition).map(r -> { + log.debug("Saving route: " + routeDefinition); + return r; + }))) + .then(Mono.defer(() -> Mono.just(ResponseEntity.ok().build()))) + .switchIfEmpty(Mono.defer(() -> Mono.just(ResponseEntity.badRequest().build()))); } private void validateRouteId(RouteDefinition routeDefinition) { @@ -260,11 +271,17 @@ public class AbstractGatewayControllerEndpoint implements ApplicationEventPublis } private void validateRouteDefinition(RouteDefinition routeDefinition) { - Set unavailableFilterDefinitions = routeDefinition.getFilters().stream().filter(rd -> !isAvailable(rd)) - .map(FilterDefinition::getName).collect(Collectors.toSet()); + Set unavailableFilterDefinitions = routeDefinition.getFilters() + .stream() + .filter(rd -> !isAvailable(rd)) + .map(FilterDefinition::getName) + .collect(Collectors.toSet()); - Set unavailablePredicatesDefinitions = routeDefinition.getPredicates().stream() - .filter(rd -> !isAvailable(rd)).map(PredicateDefinition::getName).collect(Collectors.toSet()); + Set unavailablePredicatesDefinitions = routeDefinition.getPredicates() + .stream() + .filter(rd -> !isAvailable(rd)) + .map(PredicateDefinition::getName) + .collect(Collectors.toSet()); if (!unavailableFilterDefinitions.isEmpty()) { handleUnavailableDefinition(FilterDefinition.class.getSimpleName(), unavailableFilterDefinitions); } @@ -298,12 +315,12 @@ public class AbstractGatewayControllerEndpoint implements ApplicationEventPublis private boolean isAvailable(FilterDefinition filterDefinition) { return GatewayFilters.stream() - .anyMatch(gatewayFilterFactory -> filterDefinition.getName().equals(gatewayFilterFactory.name())); + .anyMatch(gatewayFilterFactory -> filterDefinition.getName().equals(gatewayFilterFactory.name())); } private boolean isAvailable(PredicateDefinition predicateDefinition) { return routePredicates.stream() - .anyMatch(routePredicate -> predicateDefinition.getName().equals(routePredicate.name())); + .anyMatch(routePredicate -> predicateDefinition.getName().equals(routePredicate.name())); } @DeleteMapping("/routes/{id}") @@ -317,8 +334,9 @@ public class AbstractGatewayControllerEndpoint implements ApplicationEventPublis @GetMapping("/routes/{id}/combinedfilters") public Mono> combinedfilters(@PathVariable String id) { // TODO: missing global filters - return this.routeLocator.getRoutes().filter(route -> route.getId().equals(id)).reduce(new HashMap<>(), - this::putItem); + return this.routeLocator.getRoutes() + .filter(route -> route.getId().equals(id)) + .reduce(new HashMap<>(), this::putItem); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/GatewayLegacyControllerEndpoint.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/GatewayLegacyControllerEndpoint.java index 32f9b184..3bc19176 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/GatewayLegacyControllerEndpoint.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/GatewayLegacyControllerEndpoint.java @@ -56,7 +56,7 @@ public class GatewayLegacyControllerEndpoint extends AbstractGatewayControllerEn @GetMapping("/routes") public Mono>> routes() { Mono> routeDefs = this.routeDefinitionLocator.getRouteDefinitions() - .collectMap(RouteDefinition::getId); + .collectMap(RouteDefinition::getId); Mono> routes = this.routeLocator.getRoutes().collectList(); return Mono.zip(routeDefs, routes).map(tuple -> { Map defs = tuple.getT1(); @@ -103,8 +103,11 @@ public class GatewayLegacyControllerEndpoint extends AbstractGatewayControllerEn @GetMapping("/routes/{id}") public Mono> route(@PathVariable String id) { // TODO: missing RouteLocator - return this.routeDefinitionLocator.getRouteDefinitions().filter(route -> route.getId().equals(id)) - .singleOrEmpty().map(ResponseEntity::ok).switchIfEmpty(Mono.just(ResponseEntity.notFound().build())); + return this.routeDefinitionLocator.getRouteDefinitions() + .filter(route -> route.getId().equals(id)) + .singleOrEmpty() + .map(ResponseEntity::ok) + .switchIfEmpty(Mono.just(ResponseEntity.notFound().build())); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/AbstractSslConfigurer.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/AbstractSslConfigurer.java index bd5ac9dc..e31ee43a 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/AbstractSslConfigurer.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/AbstractSslConfigurer.java @@ -87,7 +87,7 @@ public abstract class AbstractSslConfigurer { try { if (ssl.getKeyStore() != null && ssl.getKeyStore().length() > 0) { KeyManagerFactory keyManagerFactory = KeyManagerFactory - .getInstance(KeyManagerFactory.getDefaultAlgorithm()); + .getInstance(KeyManagerFactory.getDefaultAlgorithm()); char[] keyPassword = ssl.getKeyPassword() != null ? ssl.getKeyPassword().toCharArray() : null; if (keyPassword == null && ssl.getKeyStorePassword() != null) { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/ConfigurableHintsRegistrationProcessor.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/ConfigurableHintsRegistrationProcessor.java index a2d525c1..6e8a5a93 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/ConfigurableHintsRegistrationProcessor.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/ConfigurableHintsRegistrationProcessor.java @@ -106,8 +106,9 @@ class ConfigurableHintsRegistrationProcessor implements BeanFactoryInitializatio private static void addGenericsForClass(Set> genericsToAdd, ResolvableType resolvableType) { if (resolvableType.getSuperType().hasGenerics()) { - genericsToAdd.addAll(Arrays.stream(resolvableType.getSuperType().getGenerics()).map(ResolvableType::toClass) - .collect(Collectors.toSet())); + genericsToAdd.addAll(Arrays.stream(resolvableType.getSuperType().getGenerics()) + .map(ResolvableType::toClass) + .collect(Collectors.toSet())); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java index cd5a21c0..c1906e3f 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java @@ -356,7 +356,7 @@ public class GatewayAutoConfiguration { public GrpcSslConfigurer grpcSslConfigurer(HttpClientProperties properties) throws KeyStoreException, NoSuchAlgorithmException { TrustManagerFactory trustManagerFactory = TrustManagerFactory - .getInstance(TrustManagerFactory.getDefaultAlgorithm()); + .getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(KeyStore.getInstance(KeyStore.getDefaultType())); return new GrpcSslConfigurer(properties.getSsl()); @@ -792,7 +792,7 @@ public class GatewayAutoConfiguration { HttpClient httpClient) { Supplier builderSupplier = () -> { WebsocketClientSpec.Builder builder = WebsocketClientSpec.builder() - .handlePing(properties.getWebsocket().isProxyPing()); + .handlePing(properties.getWebsocket().isProxyPing()); if (properties.getWebsocket().getMaxFramePayloadLength() != null) { builder.maxFramePayloadLength(properties.getWebsocket().getMaxFramePayloadLength()); } @@ -886,19 +886,19 @@ class GatewayHints implements RuntimeHintsRegistrar { return; } hints.reflection() - .registerType(TypeReference.of(FilterDefinition.class), - hint -> hint.withMembers(MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_DECLARED_METHODS, - MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)) - .registerType(TypeReference.of(PredicateDefinition.class), - hint -> hint.withMembers(MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_DECLARED_METHODS, - MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)) - .registerType(TypeReference.of(AbstractNameValueGatewayFilterFactory.NameValueConfig.class), - hint -> hint.withMembers(MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_DECLARED_METHODS, - MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)) - .registerType(TypeReference.of( - "org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator$DelegatingServiceInstance"), - hint -> hint.withMembers(MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_DECLARED_METHODS, - MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)); + .registerType(TypeReference.of(FilterDefinition.class), + hint -> hint.withMembers(MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_DECLARED_METHODS, + MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)) + .registerType(TypeReference.of(PredicateDefinition.class), + hint -> hint.withMembers(MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_DECLARED_METHODS, + MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)) + .registerType(TypeReference.of(AbstractNameValueGatewayFilterFactory.NameValueConfig.class), + hint -> hint.withMembers(MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_DECLARED_METHODS, + MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)) + .registerType(TypeReference + .of("org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator$DelegatingServiceInstance"), + hint -> hint.withMembers(MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_DECLARED_METHODS, + MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayEnvironmentPostProcessor.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayEnvironmentPostProcessor.java index 62ace259..1b4884af 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayEnvironmentPostProcessor.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayEnvironmentPostProcessor.java @@ -27,8 +27,9 @@ public class GatewayEnvironmentPostProcessor implements EnvironmentPostProcessor @Override public void postProcessEnvironment(ConfigurableEnvironment env, SpringApplication application) { - env.getPropertySources().addFirst(new MapPropertySource("gateway-properties", - Collections.singletonMap("spring.webflux.hiddenmethod.filter.enabled", "false"))); + env.getPropertySources() + .addFirst(new MapPropertySource("gateway-properties", + Collections.singletonMap("spring.webflux.hiddenmethod.filter.enabled", "false"))); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayMetricsProperties.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayMetricsProperties.java index 87a505a3..b0ca9d43 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayMetricsProperties.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayMetricsProperties.java @@ -79,8 +79,10 @@ public class GatewayMetricsProperties { @Override public String toString() { - return new ToStringCreator(this).append("enabled", enabled).append("prefix", prefix).append("tags", tags) - .toString(); + return new ToStringCreator(this).append("enabled", enabled) + .append("prefix", prefix) + .append("tags", tags) + .toString(); } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayProperties.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayProperties.java index 13d44243..53ea714c 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayProperties.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayProperties.java @@ -105,9 +105,11 @@ public class GatewayProperties { @Override public String toString() { - return new ToStringCreator(this).append("routes", routes).append("defaultFilters", defaultFilters) - .append("streamingMediaTypes", streamingMediaTypes) - .append("failOnRouteDefinitionError", failOnRouteDefinitionError).toString(); + return new ToStringCreator(this).append("routes", routes) + .append("defaultFilters", defaultFilters) + .append("streamingMediaTypes", streamingMediaTypes) + .append("failOnRouteDefinitionError", failOnRouteDefinitionError) + .toString(); } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayReactiveOAuth2AutoConfiguration.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayReactiveOAuth2AutoConfiguration.java index 76f454b2..5882e5b6 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayReactiveOAuth2AutoConfiguration.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayReactiveOAuth2AutoConfiguration.java @@ -50,7 +50,10 @@ public class GatewayReactiveOAuth2AutoConfiguration { ReactiveClientRegistrationRepository clientRegistrationRepository, ServerOAuth2AuthorizedClientRepository authorizedClientRepository) { ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider = ReactiveOAuth2AuthorizedClientProviderBuilder - .builder().authorizationCode().refreshToken().build(); + .builder() + .authorizationCode() + .refreshToken() + .build(); DefaultReactiveOAuth2AuthorizedClientManager authorizedClientManager = new DefaultReactiveOAuth2AuthorizedClientManager( clientRegistrationRepository, authorizedClientRepository); authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider); diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java index d4624591..7b52c0a3 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java @@ -87,7 +87,7 @@ class GatewayRedisAutoConfiguration { Jackson2JsonRedisSerializer valueSerializer = new Jackson2JsonRedisSerializer<>( RouteDefinition.class); RedisSerializationContext.RedisSerializationContextBuilder builder = RedisSerializationContext - .newSerializationContext(keySerializer); + .newSerializationContext(keySerializer); RedisSerializationContext context = builder.value(valueSerializer).build(); return new ReactiveRedisTemplate<>(factory, context); diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientFactory.java index 0aaa9f52..b4fa7ffc 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientFactory.java @@ -80,8 +80,8 @@ public class HttpClientFactory extends AbstractFactoryBean { ConnectionProvider connectionProvider = buildConnectionProvider(properties); HttpClient httpClient = HttpClient.create(connectionProvider) - // TODO: move customizations to HttpClientCustomizers - .httpResponseDecoder(this::httpResponseDecoder); + // TODO: move customizations to HttpClientCustomizers + .httpResponseDecoder(this::httpResponseDecoder); if (serverProperties.getHttp2().isEnabled()) { httpClient = httpClient.protocol(HttpProtocol.HTTP11, HttpProtocol.H2); @@ -170,13 +170,15 @@ public class HttpClientFactory extends AbstractFactoryBean { // create either Fixed or Elastic pool ConnectionProvider.Builder builder = ConnectionProvider.builder(pool.getName()); if (pool.getType() == FIXED) { - builder.maxConnections(pool.getMaxConnections()).pendingAcquireMaxCount(-1) - .pendingAcquireTimeout(Duration.ofMillis(pool.getAcquireTimeout())); + builder.maxConnections(pool.getMaxConnections()) + .pendingAcquireMaxCount(-1) + .pendingAcquireTimeout(Duration.ofMillis(pool.getAcquireTimeout())); } else { // Elastic - builder.maxConnections(Integer.MAX_VALUE).pendingAcquireTimeout(Duration.ofMillis(0)) - .pendingAcquireMaxCount(-1); + builder.maxConnections(Integer.MAX_VALUE) + .pendingAcquireTimeout(Duration.ofMillis(0)) + .pendingAcquireMaxCount(-1); } if (pool.getMaxIdleTime() != null) { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientProperties.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientProperties.java index 1071931b..85b3b027 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientProperties.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientProperties.java @@ -499,10 +499,11 @@ public class HttpClientProperties { @Override public String toString() { return new ToStringCreator(this).append("useInsecureTrustManager", useInsecureTrustManager) - .append("trustedX509Certificates", trustedX509Certificates) - .append("handshakeTimeout", handshakeTimeout) - .append("closeNotifyFlushTimeout", closeNotifyFlushTimeout) - .append("closeNotifyReadTimeout", closeNotifyReadTimeout).toString(); + .append("trustedX509Certificates", trustedX509Certificates) + .append("handshakeTimeout", handshakeTimeout) + .append("closeNotifyFlushTimeout", closeNotifyFlushTimeout) + .append("closeNotifyReadTimeout", closeNotifyReadTimeout) + .toString(); } } @@ -534,7 +535,8 @@ public class HttpClientProperties { @Override public String toString() { return new ToStringCreator(this).append("maxFramePayloadLength", maxFramePayloadLength) - .append("proxyPing", proxyPing).toString(); + .append("proxyPing", proxyPing) + .toString(); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientSslConfigurer.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientSslConfigurer.java index 0938a891..f1048217 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientSslConfigurer.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientSslConfigurer.java @@ -68,9 +68,10 @@ public class HttpClientSslConfigurer extends AbstractSslConfigurer discoveryClient.getInstances(service).collectList()); + .flatMap(service -> discoveryClient.getInstances(service).collectList()); } private DiscoveryClientRouteDefinitionLocator(String discoveryClientName, DiscoveryLocatorProperties properties) { @@ -96,36 +96,39 @@ public class DiscoveryClientRouteDefinitionLocator implements RouteDefinitionLoc }; } - return serviceInstances.filter(instances -> !instances.isEmpty()).flatMap(Flux::fromIterable) - .filter(includePredicate).collectMap(ServiceInstance::getServiceId) - // remove duplicates - .flatMapMany(map -> Flux.fromIterable(map.values())).map(instance -> { - RouteDefinition routeDefinition = buildRouteDefinition(urlExpr, instance); + return serviceInstances.filter(instances -> !instances.isEmpty()) + .flatMap(Flux::fromIterable) + .filter(includePredicate) + .collectMap(ServiceInstance::getServiceId) + // remove duplicates + .flatMapMany(map -> Flux.fromIterable(map.values())) + .map(instance -> { + RouteDefinition routeDefinition = buildRouteDefinition(urlExpr, instance); - final ServiceInstance instanceForEval = new DelegatingServiceInstance(instance, properties); + final ServiceInstance instanceForEval = new DelegatingServiceInstance(instance, properties); - for (PredicateDefinition original : this.properties.getPredicates()) { - PredicateDefinition predicate = new PredicateDefinition(); - predicate.setName(original.getName()); - for (Map.Entry entry : original.getArgs().entrySet()) { - String value = getValueFromExpr(evalCtxt, parser, instanceForEval, entry); - predicate.addArg(entry.getKey(), value); - } - routeDefinition.getPredicates().add(predicate); + for (PredicateDefinition original : this.properties.getPredicates()) { + PredicateDefinition predicate = new PredicateDefinition(); + predicate.setName(original.getName()); + for (Map.Entry entry : original.getArgs().entrySet()) { + String value = getValueFromExpr(evalCtxt, parser, instanceForEval, entry); + predicate.addArg(entry.getKey(), value); } + routeDefinition.getPredicates().add(predicate); + } - for (FilterDefinition original : this.properties.getFilters()) { - FilterDefinition filter = new FilterDefinition(); - filter.setName(original.getName()); - for (Map.Entry entry : original.getArgs().entrySet()) { - String value = getValueFromExpr(evalCtxt, parser, instanceForEval, entry); - filter.addArg(entry.getKey(), value); - } - routeDefinition.getFilters().add(filter); + for (FilterDefinition original : this.properties.getFilters()) { + FilterDefinition filter = new FilterDefinition(); + filter.setName(original.getName()); + for (Map.Entry entry : original.getArgs().entrySet()) { + String value = getValueFromExpr(evalCtxt, parser, instanceForEval, entry); + filter.addArg(entry.getKey(), value); } + routeDefinition.getFilters().add(filter); + } - return routeDefinition; - }); + return routeDefinition; + }); } protected RouteDefinition buildRouteDefinition(Expression urlExpr, ServiceInstance serviceInstance) { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryLocatorProperties.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryLocatorProperties.java index b13f71cb..9426ed37 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryLocatorProperties.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryLocatorProperties.java @@ -116,10 +116,14 @@ public class DiscoveryLocatorProperties { @Override public String toString() { - return new ToStringCreator(this).append("enabled", enabled).append("routeIdPrefix", routeIdPrefix) - .append("includeExpression", includeExpression).append("urlExpression", urlExpression) - .append("lowerCaseServiceId", lowerCaseServiceId).append("predicates", predicates) - .append("filters", filters).toString(); + return new ToStringCreator(this).append("enabled", enabled) + .append("routeIdPrefix", routeIdPrefix) + .append("includeExpression", includeExpression) + .append("urlExpression", urlExpression) + .append("lowerCaseServiceId", lowerCaseServiceId) + .append("predicates", predicates) + .append("filters", filters) + .toString(); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java index 298547b7..9eb193e7 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java @@ -72,8 +72,9 @@ public class GatewayMetricsFilter implements GlobalFilter, Ordered { public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { Sample sample = Timer.start(meterRegistry); - return chain.filter(exchange).doOnSuccess(aVoid -> endTimerRespectingCommit(exchange, sample)) - .doOnError(throwable -> endTimerRespectingCommit(exchange, sample)); + return chain.filter(exchange) + .doOnSuccess(aVoid -> endTimerRespectingCommit(exchange, sample)) + .doOnError(throwable -> endTimerRespectingCommit(exchange, sample)); } private void endTimerRespectingCommit(ServerWebExchange exchange, Sample sample) { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/LoadBalancerServiceInstanceCookieFilter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/LoadBalancerServiceInstanceCookieFilter.java index 4874a563..05b167d9 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/LoadBalancerServiceInstanceCookieFilter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/LoadBalancerServiceInstanceCookieFilter.java @@ -76,7 +76,8 @@ public class LoadBalancerServiceInstanceCookieFilter implements GlobalFilter, Or ServerWebExchange newExchange = exchange.mutate().request(exchange.getRequest().mutate().headers((headers) -> { List cookieHeaders = new ArrayList<>(headers.getOrEmpty(HttpHeaders.COOKIE)); String serviceInstanceCookie = new HttpCookie(instanceIdCookieName, - serviceInstanceResponse.getServer().getInstanceId()).toString(); + serviceInstanceResponse.getServer().getInstanceId()) + .toString(); cookieHeaders.add(serviceInstanceCookie); headers.put(HttpHeaders.COOKIE, cookieHeaders); }).build()).build(); diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/NettyRoutingFilter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/NettyRoutingFilter.java index 780c318b..4d342892 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/NettyRoutingFilter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/NettyRoutingFilter.java @@ -131,69 +131,69 @@ public class NettyRoutingFilter implements GlobalFilter, Ordered { Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR); Flux responseFlux = getHttpClientMono(route, exchange) - .flatMapMany(httpClient -> httpClient.headers(headers -> { - headers.add(httpHeaders); - // Will either be set below, or later by Netty - headers.remove(HttpHeaders.HOST); - if (preserveHost) { - String host = request.getHeaders().getFirst(HttpHeaders.HOST); - headers.add(HttpHeaders.HOST, host); - } - }).request(method).uri(url).send((req, nettyOutbound) -> { - if (log.isTraceEnabled()) { - nettyOutbound.withConnection(connection -> log.trace("outbound route: " - + connection.channel().id().asShortText() + ", inbound: " + exchange.getLogPrefix())); - } - return nettyOutbound.send(request.getBody().map(this::getByteBuf)); - }).responseConnection((res, connection) -> { + .flatMapMany(httpClient -> httpClient.headers(headers -> { + headers.add(httpHeaders); + // Will either be set below, or later by Netty + headers.remove(HttpHeaders.HOST); + if (preserveHost) { + String host = request.getHeaders().getFirst(HttpHeaders.HOST); + headers.add(HttpHeaders.HOST, host); + } + }).request(method).uri(url).send((req, nettyOutbound) -> { + if (log.isTraceEnabled()) { + nettyOutbound.withConnection(connection -> log.trace("outbound route: " + + connection.channel().id().asShortText() + ", inbound: " + exchange.getLogPrefix())); + } + return nettyOutbound.send(request.getBody().map(this::getByteBuf)); + }).responseConnection((res, connection) -> { - // Defer committing the response until all route filters have run - // Put client response as ServerWebExchange attribute and write - // response later NettyWriteResponseFilter - exchange.getAttributes().put(CLIENT_RESPONSE_ATTR, res); - exchange.getAttributes().put(CLIENT_RESPONSE_CONN_ATTR, connection); + // Defer committing the response until all route filters have run + // Put client response as ServerWebExchange attribute and write + // response later NettyWriteResponseFilter + exchange.getAttributes().put(CLIENT_RESPONSE_ATTR, res); + exchange.getAttributes().put(CLIENT_RESPONSE_CONN_ATTR, connection); - ServerHttpResponse response = exchange.getResponse(); - // put headers and status so filters can modify the response - HttpHeaders headers = new HttpHeaders(); + ServerHttpResponse response = exchange.getResponse(); + // put headers and status so filters can modify the response + HttpHeaders headers = new HttpHeaders(); - res.responseHeaders().forEach(entry -> headers.add(entry.getKey(), entry.getValue())); + res.responseHeaders().forEach(entry -> headers.add(entry.getKey(), entry.getValue())); - String contentTypeValue = headers.getFirst(HttpHeaders.CONTENT_TYPE); - if (StringUtils.hasLength(contentTypeValue)) { - exchange.getAttributes().put(ORIGINAL_RESPONSE_CONTENT_TYPE_ATTR, contentTypeValue); - } + String contentTypeValue = headers.getFirst(HttpHeaders.CONTENT_TYPE); + if (StringUtils.hasLength(contentTypeValue)) { + exchange.getAttributes().put(ORIGINAL_RESPONSE_CONTENT_TYPE_ATTR, contentTypeValue); + } - setResponseStatus(res, response); + setResponseStatus(res, response); - // make sure headers filters run after setting status so it is - // available in response - HttpHeaders filteredResponseHeaders = HttpHeadersFilter.filter(getHeadersFilters(), headers, - exchange, Type.RESPONSE); + // make sure headers filters run after setting status so it is + // available in response + HttpHeaders filteredResponseHeaders = HttpHeadersFilter.filter(getHeadersFilters(), headers, exchange, + Type.RESPONSE); - if (!filteredResponseHeaders.containsKey(HttpHeaders.TRANSFER_ENCODING) - && filteredResponseHeaders.containsKey(HttpHeaders.CONTENT_LENGTH)) { - // It is not valid to have both the transfer-encoding header and - // the content-length header. - // Remove the transfer-encoding header in the response if the - // content-length header is present. - response.getHeaders().remove(HttpHeaders.TRANSFER_ENCODING); - } + if (!filteredResponseHeaders.containsKey(HttpHeaders.TRANSFER_ENCODING) + && filteredResponseHeaders.containsKey(HttpHeaders.CONTENT_LENGTH)) { + // It is not valid to have both the transfer-encoding header and + // the content-length header. + // Remove the transfer-encoding header in the response if the + // content-length header is present. + response.getHeaders().remove(HttpHeaders.TRANSFER_ENCODING); + } - exchange.getAttributes().put(CLIENT_RESPONSE_HEADER_NAMES, filteredResponseHeaders.keySet()); + exchange.getAttributes().put(CLIENT_RESPONSE_HEADER_NAMES, filteredResponseHeaders.keySet()); - response.getHeaders().addAll(filteredResponseHeaders); + response.getHeaders().addAll(filteredResponseHeaders); - return Mono.just(res); - })); + return Mono.just(res); + })); Duration responseTimeout = getResponseTimeout(route); if (responseTimeout != null) { responseFlux = responseFlux - .timeout(responseTimeout, - Mono.error(new TimeoutException("Response took longer than timeout: " + responseTimeout))) - .onErrorMap(TimeoutException.class, - th -> new ResponseStatusException(HttpStatus.GATEWAY_TIMEOUT, th.getMessage(), th)); + .timeout(responseTimeout, + Mono.error(new TimeoutException("Response took longer than timeout: " + responseTimeout))) + .onErrorMap(TimeoutException.class, + th -> new ResponseStatusException(HttpStatus.GATEWAY_TIMEOUT, th.getMessage(), th)); } return responseFlux.then(chain.filter(exchange)); diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/ReactiveLoadBalancerClientFilter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/ReactiveLoadBalancerClientFilter.java index 1aabf6e8..de04cbe8 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/ReactiveLoadBalancerClientFilter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/ReactiveLoadBalancerClientFilter.java @@ -111,15 +111,15 @@ public class ReactiveLoadBalancerClientFilter implements GlobalFilter, Ordered { URI requestUri = exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR); String serviceId = requestUri.getHost(); Set supportedLifecycleProcessors = LoadBalancerLifecycleValidator - .getSupportedLifecycleProcessors(clientFactory.getInstances(serviceId, LoadBalancerLifecycle.class), - RequestDataContext.class, ResponseData.class, ServiceInstance.class); + .getSupportedLifecycleProcessors(clientFactory.getInstances(serviceId, LoadBalancerLifecycle.class), + RequestDataContext.class, ResponseData.class, ServiceInstance.class); DefaultRequest lbRequest = new DefaultRequest<>(new RequestDataContext( new RequestData(exchange.getRequest(), exchange.getAttributes()), getHint(serviceId))); return choose(lbRequest, serviceId, supportedLifecycleProcessors).doOnNext(response -> { if (!response.hasServer()) { supportedLifecycleProcessors.forEach(lifecycle -> lifecycle - .onComplete(new CompletionContext<>(CompletionContext.Status.DISCARD, lbRequest, response))); + .onComplete(new CompletionContext<>(CompletionContext.Status.DISCARD, lbRequest, response))); throw NotFoundException.create(properties.isUse404(), "Unable to find instance for " + url.getHost()); } @@ -145,17 +145,18 @@ public class ReactiveLoadBalancerClientFilter implements GlobalFilter, Ordered { exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, requestUrl); exchange.getAttributes().put(GATEWAY_LOADBALANCER_RESPONSE_ATTR, response); supportedLifecycleProcessors.forEach(lifecycle -> lifecycle.onStartRequest(lbRequest, response)); - }).then(chain.filter(exchange)) - .doOnError(throwable -> supportedLifecycleProcessors.forEach(lifecycle -> lifecycle - .onComplete(new CompletionContext( - CompletionContext.Status.FAILED, throwable, lbRequest, - exchange.getAttribute(GATEWAY_LOADBALANCER_RESPONSE_ATTR))))) - .doOnSuccess(aVoid -> supportedLifecycleProcessors.forEach(lifecycle -> lifecycle - .onComplete(new CompletionContext( - CompletionContext.Status.SUCCESS, lbRequest, - exchange.getAttribute(GATEWAY_LOADBALANCER_RESPONSE_ATTR), - new ResponseData(exchange.getResponse(), - new RequestData(exchange.getRequest(), exchange.getAttributes())))))); + }) + .then(chain.filter(exchange)) + .doOnError(throwable -> supportedLifecycleProcessors.forEach(lifecycle -> lifecycle + .onComplete(new CompletionContext( + CompletionContext.Status.FAILED, throwable, lbRequest, + exchange.getAttribute(GATEWAY_LOADBALANCER_RESPONSE_ATTR))))) + .doOnSuccess(aVoid -> supportedLifecycleProcessors.forEach(lifecycle -> lifecycle + .onComplete(new CompletionContext( + CompletionContext.Status.SUCCESS, lbRequest, + exchange.getAttribute(GATEWAY_LOADBALANCER_RESPONSE_ATTR), + new ResponseData(exchange.getResponse(), + new RequestData(exchange.getRequest(), exchange.getAttributes())))))); } protected URI reconstructURI(ServiceInstance serviceInstance, URI original) { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilter.java index 27026771..4d0e1b9c 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilter.java @@ -85,8 +85,12 @@ public class RouteToRequestUrlFilter implements GlobalFilter, Ordered { } URI mergedUrl = UriComponentsBuilder.fromUri(uri) - // .uri(routeUri) - .scheme(routeUri.getScheme()).host(routeUri.getHost()).port(routeUri.getPort()).build(encoded).toUri(); + // .uri(routeUri) + .scheme(routeUri.getScheme()) + .host(routeUri.getHost()) + .port(routeUri.getPort()) + .build(encoded) + .toUri(); exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, mergedUrl); return chain.filter(exchange); } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebClientHttpRoutingFilter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebClientHttpRoutingFilter.java index 24e6cd33..02dcc349 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebClientHttpRoutingFilter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebClientHttpRoutingFilter.java @@ -106,17 +106,17 @@ public class WebClientHttpRoutingFilter implements GlobalFilter, Ordered { } return headersSpec.exchangeToMono(Mono::just) - // .log("webClient route") - .flatMap(res -> { - ServerHttpResponse response = exchange.getResponse(); - response.getHeaders().putAll(res.headers().asHttpHeaders()); - response.setStatusCode(res.statusCode()); - // Defer committing the response until all route filters have run - // Put client response as ServerWebExchange attribute and write - // response later NettyWriteResponseFilter - exchange.getAttributes().put(CLIENT_RESPONSE_ATTR, res); - return chain.filter(exchange); - }); + // .log("webClient route") + .flatMap(res -> { + ServerHttpResponse response = exchange.getResponse(); + response.getHeaders().putAll(res.headers().asHttpHeaders()); + response.setStatusCode(res.statusCode()); + // Defer committing the response until all route filters have run + // Put client response as ServerWebExchange attribute and write + // response later NettyWriteResponseFilter + exchange.getAttributes().put(CLIENT_RESPONSE_ATTR, res); + return chain.filter(exchange); + }); } private boolean requiresBody(HttpMethod method) { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebClientWriteResponseFilter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebClientWriteResponseFilter.java index 28b44db8..8dab68e4 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebClientWriteResponseFilter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebClientWriteResponseFilter.java @@ -58,8 +58,8 @@ public class WebClientWriteResponseFilter implements GlobalFilter, Ordered { ServerHttpResponse response = exchange.getResponse(); return response.writeWith(clientResponse.body(BodyExtractors.toDataBuffers())) - // .log("webClient response") - .doOnCancel(() -> cleanup(exchange)); + // .log("webClient response") + .doOnCancel(() -> cleanup(exchange)); })); } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java index 6a4fe3b8..04136bf7 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java @@ -244,28 +244,32 @@ public class WebsocketRoutingFilter implements GlobalFilter, Ordered { @Override public Mono handle(WebSocketSession proxySession) { - Mono serverClose = proxySession.closeStatus().filter(__ -> session.isOpen()) - .map(this::adaptCloseStatus).flatMap(session::close); - Mono proxyClose = session.closeStatus().filter(__ -> proxySession.isOpen()) - .map(this::adaptCloseStatus).flatMap(proxySession::close); + Mono serverClose = proxySession.closeStatus() + .filter(__ -> session.isOpen()) + .map(this::adaptCloseStatus) + .flatMap(session::close); + Mono proxyClose = session.closeStatus() + .filter(__ -> proxySession.isOpen()) + .map(this::adaptCloseStatus) + .flatMap(proxySession::close); // Use retain() for Reactor Netty Mono proxySessionSend = proxySession - .send(session.receive().doOnNext(WebSocketMessage::retain).doOnNext(webSocketMessage -> { - if (log.isTraceEnabled()) { - log.trace("proxySession(send from client): " + proxySession.getId() - + ", corresponding session:" + session.getId() + ", packet: " - + webSocketMessage.getPayloadAsText()); - } - })); + .send(session.receive().doOnNext(WebSocketMessage::retain).doOnNext(webSocketMessage -> { + if (log.isTraceEnabled()) { + log.trace("proxySession(send from client): " + proxySession.getId() + + ", corresponding session:" + session.getId() + ", packet: " + + webSocketMessage.getPayloadAsText()); + } + })); // .log("proxySessionSend", Level.FINE); - Mono serverSessionSend = session.send( - proxySession.receive().doOnNext(WebSocketMessage::retain).doOnNext(webSocketMessage -> { - if (log.isTraceEnabled()) { - log.trace("session(send from backend): " + session.getId() - + ", corresponding proxySession:" + proxySession.getId() + " packet: " - + webSocketMessage.getPayloadAsText()); - } - })); + Mono serverSessionSend = session + .send(proxySession.receive().doOnNext(WebSocketMessage::retain).doOnNext(webSocketMessage -> { + if (log.isTraceEnabled()) { + log.trace("session(send from backend): " + session.getId() + + ", corresponding proxySession:" + proxySession.getId() + " packet: " + + webSocketMessage.getPayloadAsText()); + } + })); // .log("sessionSend", Level.FINE); // Ensure closeStatus from one propagates to the other Mono.when(serverClose, proxyClose).subscribe(); diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WeightCalculatorWebFilter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WeightCalculatorWebFilter.java index d3810a08..61a79ff8 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WeightCalculatorWebFilter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WeightCalculatorWebFilter.java @@ -315,8 +315,11 @@ public class WeightCalculatorWebFilter implements WebFilter, Ordered, SmartAppli @Override public String toString() { - return new ToStringCreator(this).append("group", group).append("weights", weights) - .append("normalizedWeights", normalizedWeights).append("rangeIndexes", rangeIndexes).toString(); + return new ToStringCreator(this).append("group", group) + .append("weights", weights) + .append("normalizedWeights", normalizedWeights) + .append("rangeIndexes", rangeIndexes) + .toString(); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/cors/CorsGatewayFilterApplicationListener.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/cors/CorsGatewayFilterApplicationListener.java index 54fa2e60..337588b8 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/cors/CorsGatewayFilterApplicationListener.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/cors/CorsGatewayFilterApplicationListener.java @@ -106,17 +106,17 @@ public class CorsGatewayFilterApplicationListener implements ApplicationListener final CorsConfiguration corsConfiguration = new CorsConfiguration(); findValue(corsMetadata, "allowCredentials") - .ifPresent(value -> corsConfiguration.setAllowCredentials((Boolean) value)); + .ifPresent(value -> corsConfiguration.setAllowCredentials((Boolean) value)); findValue(corsMetadata, "allowedHeaders") - .ifPresent(value -> corsConfiguration.setAllowedHeaders(asList(value))); + .ifPresent(value -> corsConfiguration.setAllowedHeaders(asList(value))); findValue(corsMetadata, "allowedMethods") - .ifPresent(value -> corsConfiguration.setAllowedMethods(asList(value))); + .ifPresent(value -> corsConfiguration.setAllowedMethods(asList(value))); findValue(corsMetadata, "allowedOriginPatterns") - .ifPresent(value -> corsConfiguration.setAllowedOriginPatterns(asList(value))); + .ifPresent(value -> corsConfiguration.setAllowedOriginPatterns(asList(value))); findValue(corsMetadata, "allowedOrigins") - .ifPresent(value -> corsConfiguration.setAllowedOrigins(asList(value))); + .ifPresent(value -> corsConfiguration.setAllowedOrigins(asList(value))); findValue(corsMetadata, "exposedHeaders") - .ifPresent(value -> corsConfiguration.setExposedHeaders(asList(value))); + .ifPresent(value -> corsConfiguration.setExposedHeaders(asList(value))); findValue(corsMetadata, "maxAge").ifPresent(value -> corsConfiguration.setMaxAge(asLong(value))); return Optional.of(corsConfiguration); diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactory.java index 1e2a32e4..8c522171 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactory.java @@ -37,8 +37,10 @@ public class AddRequestHeaderGatewayFilterFactory extends AbstractNameValueGatew @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { String value = ServerWebExchangeUtils.expand(exchange, config.getValue()); - ServerHttpRequest request = exchange.getRequest().mutate() - .headers(httpHeaders -> httpHeaders.add(config.getName(), value)).build(); + ServerHttpRequest request = exchange.getRequest() + .mutate() + .headers(httpHeaders -> httpHeaders.add(config.getName(), value)) + .build(); return chain.filter(exchange.mutate().request(request).build()); } @@ -46,7 +48,8 @@ public class AddRequestHeaderGatewayFilterFactory extends AbstractNameValueGatew @Override public String toString() { return filterToStringCreator(AddRequestHeaderGatewayFilterFactory.this) - .append(config.getName(), config.getValue()).toString(); + .append(config.getName(), config.getValue()) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactory.java index 67ea90bd..d206b10b 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactory.java @@ -69,8 +69,11 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactory for (Map.Entry> kv : aggregatedHeaders.entrySet()) { String headerName = kv.getKey(); - boolean headerIsMissingOrBlank = exchange.getRequest().getHeaders().getOrEmpty(headerName).stream() - .allMatch(h -> !StringUtils.hasText(h)); + boolean headerIsMissingOrBlank = exchange.getRequest() + .getHeaders() + .getOrEmpty(headerName) + .stream() + .allMatch(h -> !StringUtils.hasText(h)); if (headerIsMissingOrBlank) { if (requestBuilder == null) { @@ -78,9 +81,10 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactory } ServerWebExchange finalExchange = exchange; requestBuilder.headers(httpHeaders -> { - List replacedValues = kv.getValue().stream() - .map(value -> ServerWebExchangeUtils.expand(finalExchange, value)) - .collect(Collectors.toList()); + List replacedValues = kv.getValue() + .stream() + .map(value -> ServerWebExchangeUtils.expand(finalExchange, value)) + .collect(Collectors.toList()); httpHeaders.addAll(headerName, replacedValues); }); } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestParameterGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestParameterGatewayFilterFactory.java index a9c01416..2e053a69 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestParameterGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestParameterGatewayFilterFactory.java @@ -60,8 +60,10 @@ public class AddRequestParameterGatewayFilterFactory extends AbstractNameValueGa boolean encoded = containsEncodedParts(uri); try { - URI newUri = UriComponentsBuilder.fromUri(uri).replaceQuery(query.toString()).build(encoded) - .toUri(); + URI newUri = UriComponentsBuilder.fromUri(uri) + .replaceQuery(query.toString()) + .build(encoded) + .toUri(); ServerHttpRequest request = exchange.getRequest().mutate().uri(newUri).build(); @@ -75,7 +77,8 @@ public class AddRequestParameterGatewayFilterFactory extends AbstractNameValueGa @Override public String toString() { return filterToStringCreator(AddRequestParameterGatewayFilterFactory.this) - .append(config.getName(), config.getValue()).toString(); + .append(config.getName(), config.getValue()) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddResponseHeaderGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddResponseHeaderGatewayFilterFactory.java index 699a6f7f..937aa196 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddResponseHeaderGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddResponseHeaderGatewayFilterFactory.java @@ -42,7 +42,8 @@ public class AddResponseHeaderGatewayFilterFactory extends AbstractNameValueGate @Override public String toString() { return filterToStringCreator(AddResponseHeaderGatewayFilterFactory.this) - .append(config.getName(), config.getValue()).toString(); + .append(config.getName(), config.getValue()) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/CacheRequestBodyGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/CacheRequestBodyGatewayFilterFactory.java index 60ac5b53..7943494e 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/CacheRequestBodyGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/CacheRequestBodyGatewayFilterFactory.java @@ -77,23 +77,23 @@ public class CacheRequestBodyGatewayFilterFactory return ServerWebExchangeUtils.cacheRequestBodyAndRequest(exchange, (serverHttpRequest) -> { final ServerRequest serverRequest = ServerRequest - .create(exchange.mutate().request(serverHttpRequest).build(), messageReaders); + .create(exchange.mutate().request(serverHttpRequest).build(), messageReaders); return serverRequest.bodyToMono((config.getBodyClass())).doOnNext(objectValue -> { Object previousCachedBody = exchange.getAttributes() - .put(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR, objectValue); + .put(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR, objectValue); if (previousCachedBody != null) { // store previous cached body exchange.getAttributes().put(CACHED_ORIGINAL_REQUEST_BODY_BACKUP_ATTR, previousCachedBody); } }).then(Mono.defer(() -> { ServerHttpRequest cachedRequest = exchange - .getAttribute(CACHED_SERVER_HTTP_REQUEST_DECORATOR_ATTR); + .getAttribute(CACHED_SERVER_HTTP_REQUEST_DECORATOR_ATTR); Assert.notNull(cachedRequest, "cache request shouldn't be null"); exchange.getAttributes().remove(CACHED_SERVER_HTTP_REQUEST_DECORATOR_ATTR); return chain.filter(exchange.mutate().request(cachedRequest).build()).doFinally(s -> { // Object backupCachedBody = exchange.getAttributes() - .get(CACHED_ORIGINAL_REQUEST_BODY_BACKUP_ATTR); + .get(CACHED_ORIGINAL_REQUEST_BODY_BACKUP_ATTR); if (backupCachedBody instanceof DataBuffer dataBuffer) { DataBufferUtils.release(dataBuffer); } @@ -105,7 +105,8 @@ public class CacheRequestBodyGatewayFilterFactory @Override public String toString() { return filterToStringCreator(CacheRequestBodyGatewayFilterFactory.this) - .append("Body class", config.getBodyClass()).toString(); + .append("Body class", config.getBodyClass()) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/DedupeResponseHeaderGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/DedupeResponseHeaderGatewayFilterFactory.java index 7ee42fa8..cd6801c2 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/DedupeResponseHeaderGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/DedupeResponseHeaderGatewayFilterFactory.java @@ -93,13 +93,14 @@ public class DedupeResponseHeaderGatewayFilterFactory @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { return chain.filter(exchange) - .then(Mono.fromRunnable(() -> dedupe(exchange.getResponse().getHeaders(), config))); + .then(Mono.fromRunnable(() -> dedupe(exchange.getResponse().getHeaders(), config))); } @Override public String toString() { return filterToStringCreator(DedupeResponseHeaderGatewayFilterFactory.this) - .append(config.getName(), config.getStrategy()).toString(); + .append(config.getName(), config.getStrategy()) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/JsonToGrpcGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/JsonToGrpcGatewayFilterFactory.java index 2b0286e0..e806551f 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/JsonToGrpcGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/JsonToGrpcGatewayFilterFactory.java @@ -107,7 +107,7 @@ public class JsonToGrpcGatewayFilterFactory ServerWebExchangeUtils.setAlreadyRouted(exchange); return modifiedResponse.writeWith(exchange.getRequest().getBody()) - .then(chain.filter(exchange.mutate().response(modifiedResponse).build())); + .then(chain.filter(exchange.mutate().response(modifiedResponse).build())); } @Override @@ -190,7 +190,7 @@ public class JsonToGrpcGatewayFilterFactory Resource protoFile = resourceLoader.getResource(config.getProtoFile()); descriptor = DescriptorProtos.FileDescriptorProto.parseFrom(descriptorFile.getInputStream()) - .getDescriptorForType(); + .getDescriptorForType(); Descriptors.MethodDescriptor methodDescriptor = getMethodDescriptor(config, descriptorFile.getInputStream()); @@ -218,19 +218,25 @@ public class JsonToGrpcGatewayFilterFactory public Mono writeWith(Publisher body) { exchange.getResponse().getHeaders().set("Content-Type", "application/json"); - return getDelegate().writeWith(deserializeJSONRequest().map(callGRPCServer()).map(serialiseGRPCResponse()) - .map(wrapGRPCResponse()).cast(DataBuffer.class).last()); + return getDelegate().writeWith(deserializeJSONRequest().map(callGRPCServer()) + .map(serialiseGRPCResponse()) + .map(wrapGRPCResponse()) + .cast(DataBuffer.class) + .last()); } private ClientCall createClientCallForType(Config config, Descriptors.ServiceDescriptor serviceDescriptor, Descriptors.Descriptor outputType) { MethodDescriptor.Marshaller marshaller = ProtoUtils - .marshaller(DynamicMessage.newBuilder(outputType).build()); + .marshaller(DynamicMessage.newBuilder(outputType).build()); MethodDescriptor methodDescriptor = MethodDescriptor - .newBuilder().setType(MethodDescriptor.MethodType.UNKNOWN) - .setFullMethodName(MethodDescriptor.generateFullMethodName(serviceDescriptor.getFullName(), - config.getMethod())) - .setRequestMarshaller(marshaller).setResponseMarshaller(marshaller).build(); + .newBuilder() + .setType(MethodDescriptor.MethodType.UNKNOWN) + .setFullMethodName( + MethodDescriptor.generateFullMethodName(serviceDescriptor.getFullName(), config.getMethod())) + .setRequestMarshaller(marshaller) + .setResponseMarshaller(marshaller) + .build(); Channel channel = createChannel(); return channel.newCall(methodDescriptor, CallOptions.DEFAULT); } @@ -238,7 +244,7 @@ public class JsonToGrpcGatewayFilterFactory private Descriptors.MethodDescriptor getMethodDescriptor(Config config, InputStream descriptorFile) throws IOException, Descriptors.DescriptorValidationException { DescriptorProtos.FileDescriptorSet fileDescriptorSet = DescriptorProtos.FileDescriptorSet - .parseFrom(descriptorFile); + .parseFrom(descriptorFile); DescriptorProtos.FileDescriptorProto fileProto = fileDescriptorSet.getFile(0); Descriptors.FileDescriptor fileDescriptor = Descriptors.FileDescriptor.buildFrom(fileProto, new Descriptors.FileDescriptor[0]); @@ -250,8 +256,10 @@ public class JsonToGrpcGatewayFilterFactory List methods = serviceDescriptor.getMethods(); - return methods.stream().filter(method -> method.getName().equals(config.getMethod())).findFirst() - .orElseThrow(() -> new NoSuchElementException("No Method found")); + return methods.stream() + .filter(method -> method.getName().equals(config.getMethod())) + .findFirst() + .orElseThrow(() -> new NoSuchElementException("No Method found")); } private ManagedChannel createChannel() { @@ -296,7 +304,7 @@ public class JsonToGrpcGatewayFilterFactory return jsonResponse -> { try { return new NettyDataBufferFactory(new PooledByteBufAllocator()) - .wrap(Objects.requireNonNull(new ObjectMapper().writeValueAsBytes(jsonResponse))); + .wrap(Objects.requireNonNull(new ObjectMapper().writeValueAsBytes(jsonResponse))); } catch (JsonProcessingException e) { return new NettyDataBufferFactory(new PooledByteBufAllocator()).allocateBuffer(); diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/MapRequestHeaderGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/MapRequestHeaderGatewayFilterFactory.java index cedc14cf..05840164 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/MapRequestHeaderGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/MapRequestHeaderGatewayFilterFactory.java @@ -64,8 +64,10 @@ public class MapRequestHeaderGatewayFilterFactory } List headerValues = exchange.getRequest().getHeaders().get(config.getFromHeader()); - ServerHttpRequest request = exchange.getRequest().mutate() - .headers(i -> i.addAll(config.getToHeader(), headerValues)).build(); + ServerHttpRequest request = exchange.getRequest() + .mutate() + .headers(i -> i.addAll(config.getToHeader(), headerValues)) + .build(); return chain.filter(exchange.mutate().request(request).build()); } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/PrefixPathGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/PrefixPathGatewayFilterFactory.java index a71829c0..907a0cf3 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/PrefixPathGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/PrefixPathGatewayFilterFactory.java @@ -92,7 +92,7 @@ public class PrefixPathGatewayFilterFactory @Override public String toString() { return filterToStringCreator(PrefixPathGatewayFilterFactory.this).append("prefix", config.getPrefix()) - .toString(); + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RedirectToGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RedirectToGatewayFilterFactory.java index cf9845e0..eb9fdc08 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RedirectToGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RedirectToGatewayFilterFactory.java @@ -102,8 +102,11 @@ public class RedirectToGatewayFilterFactory String location; if (includeRequestParams) { - location = UriComponentsBuilder.fromUri(uri).queryParams(exchange.getRequest().getQueryParams()) - .build().toUri().toString(); + location = UriComponentsBuilder.fromUri(uri) + .queryParams(exchange.getRequest().getQueryParams()) + .build() + .toUri() + .toString(); } else { location = uri.toString(); @@ -126,7 +129,8 @@ public class RedirectToGatewayFilterFactory status = httpStatus.getStatus().toString(); } return filterToStringCreator(RedirectToGatewayFilterFactory.this).append(status, uri) - .append(INCLUDE_REQUEST_PARAMS_KEY, includeRequestParams).toString(); + .append(INCLUDE_REQUEST_PARAMS_KEY, includeRequestParams) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveJsonAttributesResponseBodyGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveJsonAttributesResponseBodyGatewayFilterFactory.java index 09558702..cb5b7d49 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveJsonAttributesResponseBodyGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveJsonAttributesResponseBodyGatewayFilterFactory.java @@ -139,7 +139,8 @@ public class RemoveJsonAttributesResponseBodyGatewayFilterFactory extends @Override public String toString() { return new ToStringCreator(this).append("fieldList", fieldList) - .append("deleteRecursively", deleteRecursively).toString(); + .append("deleteRecursively", deleteRecursively) + .toString(); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestHeaderGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestHeaderGatewayFilterFactory.java index 9a772491..911a09c0 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestHeaderGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestHeaderGatewayFilterFactory.java @@ -48,8 +48,10 @@ public class RemoveRequestHeaderGatewayFilterFactory return new GatewayFilter() { @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { - ServerHttpRequest request = exchange.getRequest().mutate() - .headers(httpHeaders -> httpHeaders.remove(config.getName())).build(); + ServerHttpRequest request = exchange.getRequest() + .mutate() + .headers(httpHeaders -> httpHeaders.remove(config.getName())) + .build(); return chain.filter(exchange.mutate().request(request).build()); } @@ -57,7 +59,8 @@ public class RemoveRequestHeaderGatewayFilterFactory @Override public String toString() { return filterToStringCreator(RemoveRequestHeaderGatewayFilterFactory.this) - .append("name", config.getName()).toString(); + .append("name", config.getName()) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactory.java index 8d09d331..a2e2c92a 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactory.java @@ -58,7 +58,9 @@ public class RemoveRequestParameterGatewayFilterFactory queryParams.remove(config.getName()); URI newUri = UriComponentsBuilder.fromUri(request.getURI()) - .replaceQueryParams(unmodifiableMultiValueMap(queryParams)).build().toUri(); + .replaceQueryParams(unmodifiableMultiValueMap(queryParams)) + .build() + .toUri(); ServerHttpRequest updatedRequest = exchange.getRequest().mutate().uri(newUri).build(); @@ -68,7 +70,8 @@ public class RemoveRequestParameterGatewayFilterFactory @Override public String toString() { return filterToStringCreator(RemoveRequestParameterGatewayFilterFactory.this) - .append("name", config.getName()).toString(); + .append("name", config.getName()) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveResponseHeaderGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveResponseHeaderGatewayFilterFactory.java index 92efcdf4..bf563fe0 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveResponseHeaderGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveResponseHeaderGatewayFilterFactory.java @@ -48,13 +48,14 @@ public class RemoveResponseHeaderGatewayFilterFactory @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { return chain.filter(exchange) - .then(Mono.fromRunnable(() -> exchange.getResponse().getHeaders().remove(config.getName()))); + .then(Mono.fromRunnable(() -> exchange.getResponse().getHeaders().remove(config.getName()))); } @Override public String toString() { return filterToStringCreator(RemoveResponseHeaderGatewayFilterFactory.this) - .append("name", config.getName()).toString(); + .append("name", config.getName()) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderSizeGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderSizeGatewayFilterFactory.java index 3817dca7..8dcd9413 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderSizeGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderSizeGatewayFilterFactory.java @@ -83,8 +83,9 @@ public class RequestHeaderSizeGatewayFilterFactory if (!longHeaders.isEmpty()) { exchange.getResponse().setStatusCode(HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE); - exchange.getResponse().getHeaders().add(errorHeaderName, - getErrorMessage(longHeaders, config.getMaxSize())); + exchange.getResponse() + .getHeaders() + .add(errorHeaderName, getErrorMessage(longHeaders, config.getMaxSize())); return exchange.getResponse().setComplete(); } @@ -95,7 +96,8 @@ public class RequestHeaderSizeGatewayFilterFactory @Override public String toString() { return filterToStringCreator(RequestHeaderSizeGatewayFilterFactory.this) - .append("maxSize", config.getMaxSize()).toString(); + .append("maxSize", config.getMaxSize()) + .toString(); } }; } @@ -103,7 +105,7 @@ public class RequestHeaderSizeGatewayFilterFactory private static String getErrorMessage(HashMap longHeaders, DataSize maxSize) { StringBuilder msg = new StringBuilder(String.format(ERROR_PREFIX, maxSize)); longHeaders - .forEach((header, size) -> msg.append(String.format(ERROR, header, DataSize.of(size, DataUnit.BYTES)))); + .forEach((header, size) -> msg.append(String.format(ERROR, header, DataSize.of(size, DataUnit.BYTES)))); return msg.toString(); } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderToRequestUriGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderToRequestUriGatewayFilterFactory.java index 371b01a6..b57ca9ed 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderToRequestUriGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderToRequestUriGatewayFilterFactory.java @@ -59,7 +59,8 @@ public class RequestHeaderToRequestUriGatewayFilterFactory @Override public String toString() { return filterToStringCreator(RequestHeaderToRequestUriGatewayFilterFactory.this) - .append("name", config.getName()).toString(); + .append("name", config.getName()) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactory.java index b524b572..e0eb2102 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactory.java @@ -94,7 +94,7 @@ public class RequestRateLimiterGatewayFilterFactory RateLimiter limiter = getOrDefault(config.rateLimiter, defaultRateLimiter); boolean denyEmpty = getOrDefault(config.denyEmptyKey, this.denyEmptyKey); HttpStatusHolder emptyKeyStatus = HttpStatusHolder - .parse(getOrDefault(config.emptyKeyStatus, this.emptyKeyStatusCode)); + .parse(getOrDefault(config.emptyKeyStatus, this.emptyKeyStatusCode)); return (exchange, chain) -> resolver.resolve(exchange).defaultIfEmpty(EMPTY_KEY).flatMap(key -> { if (EMPTY_KEY.equals(key)) { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestSizeGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestSizeGatewayFilterFactory.java index d389ae74..680ce38b 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestSizeGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestSizeGatewayFilterFactory.java @@ -75,8 +75,10 @@ public class RequestSizeGatewayFilterFactory if (currentRequestSize > requestSizeConfig.getMaxSize().toBytes()) { exchange.getResponse().setStatusCode(HttpStatus.PAYLOAD_TOO_LARGE); if (!exchange.getResponse().isCommitted()) { - exchange.getResponse().getHeaders().add("errorMessage", - getErrorMessage(currentRequestSize, requestSizeConfig.getMaxSize().toBytes())); + exchange.getResponse() + .getHeaders() + .add("errorMessage", + getErrorMessage(currentRequestSize, requestSizeConfig.getMaxSize().toBytes())); } return exchange.getResponse().setComplete(); } @@ -87,7 +89,8 @@ public class RequestSizeGatewayFilterFactory @Override public String toString() { return filterToStringCreator(RequestSizeGatewayFilterFactory.this) - .append("max", requestSizeConfig.getMaxSize()).toString(); + .append("max", requestSizeConfig.getMaxSize()) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RetryGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RetryGatewayFilterFactory.java index 55896fc7..d8046e27 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RetryGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RetryGatewayFilterFactory.java @@ -118,7 +118,7 @@ public class RetryGatewayFilterFactory extends AbstractGatewayFilterFactory reset(context.applicationContext())); + .doOnRepeat(context -> reset(context.applicationContext())); BackoffConfig backoff = retryConfig.getBackoff(); if (backoff != null) { @@ -157,7 +157,8 @@ public class RetryGatewayFilterFactory extends AbstractGatewayFilterFactory reset(context.applicationContext())).retryMax(retryConfig.getRetries()); + .doOnRetry(context -> reset(context.applicationContext())) + .retryMax(retryConfig.getRetries()); BackoffConfig backoff = retryConfig.getBackoff(); if (backoff != null) { exceptionRetry = exceptionRetry.backoff(getBackoff(backoff)); @@ -174,9 +175,12 @@ public class RetryGatewayFilterFactory extends AbstractGatewayFilterFactory Publisher publisher = chain.filter(exchange) - // .log("retry-filter", Level.INFO) - .doOnSuccess(aVoid -> updateIteration(exchange)).doOnError(throwable -> updateIteration(exchange)); + // .log("retry-filter", Level.INFO) + .doOnSuccess(aVoid -> updateIteration(exchange)) + .doOnError(throwable -> updateIteration(exchange)); if (retry != null) { // retryWhen returns a Mono // retry needs to go before repeat publisher = ((Mono) publisher) - .retryWhen(reactor.util.retry.Retry.withThrowable(retry.withApplicationContext(exchange))); + .retryWhen(reactor.util.retry.Retry.withThrowable(retry.withApplicationContext(exchange))); } if (repeat != null) { // repeatWhen returns a Flux diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RewritePathGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RewritePathGatewayFilterFactory.java index 2f684ddc..ff6db549 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RewritePathGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RewritePathGatewayFilterFactory.java @@ -79,7 +79,8 @@ public class RewritePathGatewayFilterFactory @Override public String toString() { return filterToStringCreator(RewritePathGatewayFilterFactory.this) - .append(config.getRegexp(), replacement).toString(); + .append(config.getRegexp(), replacement) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RewriteRequestParameterGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RewriteRequestParameterGatewayFilterFactory.java index 9a5a3d6b..ecffdf15 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RewriteRequestParameterGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RewriteRequestParameterGatewayFilterFactory.java @@ -72,7 +72,8 @@ public class RewriteRequestParameterGatewayFilterFactory @Override public String toString() { return filterToStringCreator(RewriteRequestParameterGatewayFilterFactory.this) - .append(config.getName(), config.replacement).toString(); + .append(config.getName(), config.replacement) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RewriteResponseHeaderGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RewriteResponseHeaderGatewayFilterFactory.java index 92cedef1..98c3fd17 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RewriteResponseHeaderGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RewriteResponseHeaderGatewayFilterFactory.java @@ -65,8 +65,10 @@ public class RewriteResponseHeaderGatewayFilterFactory @Override public String toString() { return filterToStringCreator(RewriteResponseHeaderGatewayFilterFactory.this) - .append("name", config.getName()).append("regexp", config.getRegexp()) - .append("replacement", config.getReplacement()).toString(); + .append("name", config.getName()) + .append("regexp", config.getRegexp()) + .append("replacement", config.getReplacement()) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetPathGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetPathGatewayFilterFactory.java index 105d28d9..04ce5859 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetPathGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetPathGatewayFilterFactory.java @@ -78,7 +78,7 @@ public class SetPathGatewayFilterFactory extends AbstractGatewayFilterFactory filter(ServerWebExchange exchange, GatewayFilterChain chain) { String value = ServerWebExchangeUtils.expand(exchange, config.getValue()); - ServerHttpRequest request = exchange.getRequest().mutate() - .headers(httpHeaders -> httpHeaders.set(config.name, value)).build(); + ServerHttpRequest request = exchange.getRequest() + .mutate() + .headers(httpHeaders -> httpHeaders.set(config.name, value)) + .build(); return chain.filter(exchange.mutate().request(request).build()); } @@ -46,7 +48,8 @@ public class SetRequestHeaderGatewayFilterFactory extends AbstractNameValueGatew @Override public String toString() { return filterToStringCreator(SetRequestHeaderGatewayFilterFactory.this) - .append(config.getName(), config.getValue()).toString(); + .append(config.getName(), config.getValue()) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetRequestHostHeaderGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetRequestHostHeaderGatewayFilterFactory.java index 463553c8..10762fb1 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetRequestHostHeaderGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetRequestHostHeaderGatewayFilterFactory.java @@ -66,7 +66,7 @@ public class SetRequestHostHeaderGatewayFilterFactory @Override public String toString() { return filterToStringCreator(SetRequestHostHeaderGatewayFilterFactory.this).append(config.getHost()) - .toString(); + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetResponseHeaderGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetResponseHeaderGatewayFilterFactory.java index a5a29018..13dfa9a4 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetResponseHeaderGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetResponseHeaderGatewayFilterFactory.java @@ -37,13 +37,14 @@ public class SetResponseHeaderGatewayFilterFactory extends AbstractNameValueGate public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { String value = ServerWebExchangeUtils.expand(exchange, config.getValue()); return chain.filter(exchange) - .then(Mono.fromRunnable(() -> exchange.getResponse().getHeaders().set(config.name, value))); + .then(Mono.fromRunnable(() -> exchange.getResponse().getHeaders().set(config.name, value))); } @Override public String toString() { return filterToStringCreator(SetResponseHeaderGatewayFilterFactory.this) - .append(config.getName(), config.getValue()).toString(); + .append(config.getName(), config.getValue()) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetStatusGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetStatusGatewayFilterFactory.java index bf99b71d..4ca59ec8 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetStatusGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SetStatusGatewayFilterFactory.java @@ -78,8 +78,9 @@ public class SetStatusGatewayFilterFactory extends AbstractGatewayFilterFactory< HttpStatusCode statusCode = exchange.getResponse().getStatusCode(); boolean isStatusCodeUpdated = setResponseStatus(exchange, statusHolder); if (isStatusCodeUpdated && originalStatusHeaderName != null) { - exchange.getResponse().getHeaders().set(originalStatusHeaderName, - singletonList(statusCode.value()).toString()); + exchange.getResponse() + .getHeaders() + .set(originalStatusHeaderName, singletonList(statusCode.value()).toString()); } })); } @@ -87,7 +88,7 @@ public class SetStatusGatewayFilterFactory extends AbstractGatewayFilterFactory< @Override public String toString() { return filterToStringCreator(SetStatusGatewayFilterFactory.this).append("status", config.getStatus()) - .toString(); + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerFilterFactory.java index 58b0fd46..0cbc3eca 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerFilterFactory.java @@ -90,9 +90,12 @@ public abstract class SpringCloudCircuitBreakerFilterFactory @Override public GatewayFilter apply(Config config) { ReactiveCircuitBreaker cb = reactiveCircuitBreakerFactory.create(config.getId()); - Set statuses = config.getStatusCodes().stream().map(HttpStatusHolder::parse) - .filter(statusHolder -> statusHolder.getHttpStatus() != null).map(HttpStatusHolder::getHttpStatus) - .collect(Collectors.toSet()); + Set statuses = config.getStatusCodes() + .stream() + .map(HttpStatusHolder::parse) + .filter(statusHolder -> statusHolder.getHttpStatus() != null) + .map(HttpStatusHolder::getHttpStatus) + .collect(Collectors.toSet()); return new GatewayFilter() { @Override @@ -118,8 +121,13 @@ public abstract class SpringCloudCircuitBreakerFilterFactory config.getFallbackUri().getPath()); String fullFallbackUri = String.format("%s:%s", config.getFallbackUri().getScheme(), expandedFallbackUri); - URI requestUrl = UriComponentsBuilder.fromUri(uri).host(null).port(null) - .uri(URI.create(fullFallbackUri)).scheme(null).build(encoded).toUri(); + URI requestUrl = UriComponentsBuilder.fromUri(uri) + .host(null) + .port(null) + .uri(URI.create(fullFallbackUri)) + .scheme(null) + .build(encoded) + .toUri(); exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, requestUrl); addExceptionDetails(t, exchange); @@ -135,7 +143,9 @@ public abstract class SpringCloudCircuitBreakerFilterFactory @Override public String toString() { return filterToStringCreator(SpringCloudCircuitBreakerFilterFactory.this) - .append("name", config.getName()).append("fallback", config.fallbackUri).toString(); + .append("name", config.getName()) + .append("fallback", config.fallbackUri) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/StripPrefixGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/StripPrefixGatewayFilterFactory.java index 541568ae..5551687d 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/StripPrefixGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/StripPrefixGatewayFilterFactory.java @@ -89,7 +89,7 @@ public class StripPrefixGatewayFilterFactory @Override public String toString() { return filterToStringCreator(StripPrefixGatewayFilterFactory.this).append("parts", config.getParts()) - .toString(); + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/TokenRelayGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/TokenRelayGatewayFilterFactory.java index 19ae95d6..8d4bbc1a 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/TokenRelayGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/TokenRelayGatewayFilterFactory.java @@ -58,13 +58,16 @@ public class TokenRelayGatewayFilterFactory public GatewayFilter apply(NameConfig config) { String defaultClientRegistrationId = (config == null) ? null : config.getName(); return (exchange, chain) -> exchange.getPrincipal() - // .log("token-relay-filter") - .filter(principal -> principal instanceof Authentication).cast(Authentication.class) - .flatMap(principal -> authorizationRequest(defaultClientRegistrationId, principal)) - .flatMap(this::authorizedClient).map(OAuth2AuthorizedClient::getAccessToken) - .map(token -> withBearerAuth(exchange, token)) - // TODO: adjustable behavior if empty - .defaultIfEmpty(exchange).flatMap(chain::filter); + // .log("token-relay-filter") + .filter(principal -> principal instanceof Authentication) + .cast(Authentication.class) + .flatMap(principal -> authorizationRequest(defaultClientRegistrationId, principal)) + .flatMap(this::authorizedClient) + .map(OAuth2AuthorizedClient::getAccessToken) + .map(token -> withBearerAuth(exchange, token)) + // TODO: adjustable behavior if empty + .defaultIfEmpty(exchange) + .flatMap(chain::filter); } private Mono authorizationRequest(String defaultClientRegistrationId, @@ -73,8 +76,9 @@ public class TokenRelayGatewayFilterFactory if (clientRegistrationId == null && principal instanceof OAuth2AuthenticationToken) { clientRegistrationId = ((OAuth2AuthenticationToken) principal).getAuthorizedClientRegistrationId(); } - return Mono.justOrEmpty(clientRegistrationId).map(OAuth2AuthorizeRequest::withClientRegistrationId) - .map(builder -> builder.principal(principal).build()); + return Mono.justOrEmpty(clientRegistrationId) + .map(OAuth2AuthorizeRequest::withClientRegistrationId) + .map(builder -> builder.principal(principal).build()); } private Mono authorizedClient(OAuth2AuthorizeRequest request) { @@ -89,8 +93,9 @@ public class TokenRelayGatewayFilterFactory } private ServerWebExchange withBearerAuth(ServerWebExchange exchange, OAuth2AccessToken accessToken) { - return exchange.mutate().request(r -> r.headers(headers -> headers.setBearerAuth(accessToken.getTokenValue()))) - .build(); + return exchange.mutate() + .request(r -> r.headers(headers -> headers.setBearerAuth(accessToken.getTokenValue()))) + .build(); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/ResponseCacheGatewayFilter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/ResponseCacheGatewayFilter.java index 5fec016d..7b341253 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/ResponseCacheGatewayFilter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/ResponseCacheGatewayFilter.java @@ -73,7 +73,7 @@ public class ResponseCacheGatewayFilter implements GatewayFilter, Ordered { } else { return chain - .filter(exchange.mutate().response(new CachingResponseDecorator(metadataKey, exchange)).build()); + .filter(exchange.mutate().response(new CachingResponseDecorator(metadataKey, exchange)).build()); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/ResponseCacheManager.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/ResponseCacheManager.java index 90d8a42d..7bbc4b12 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/ResponseCacheManager.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/ResponseCacheManager.java @@ -106,7 +106,7 @@ public class ResponseCacheManager { final CachedResponseMetadata metadata = new CachedResponseMetadata(response.getHeaders().getVary()); final String key = resolveKey(exchange, metadata.varyOnHeaders()); CachedResponse.Builder cachedResponseBuilder = CachedResponse.create(response.getStatusCode()) - .headers(response.getHeaders()); + .headers(response.getHeaders()); CachedResponse toProcess = cachedResponseBuilder.build(); afterCacheExchangeMutators.forEach(processor -> processor.accept(exchange, toProcess)); @@ -152,7 +152,7 @@ public class ResponseCacheManager { saveMetadataInCache(metadataKey, new CachedResponseMetadata(cachedResponse.headers().getVary())); return response - .writeWith(Flux.fromIterable(cachedResponse.body()).map(data -> response.bufferFactory().wrap(data))); + .writeWith(Flux.fromIterable(cachedResponse.body()).map(data -> response.bufferFactory().wrap(data))); } private CachedResponseMetadata retrieveMetadata(String metadataKey) { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/CookiesKeyValueGenerator.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/CookiesKeyValueGenerator.java index 14d86541..af56a2da 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/CookiesKeyValueGenerator.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/CookiesKeyValueGenerator.java @@ -41,9 +41,12 @@ class CookiesKeyValueGenerator implements KeyValueGenerator { String cookiesData = null; MultiValueMap cookies = request.getCookies(); if (!CollectionUtils.isEmpty(cookies)) { - cookiesData = cookies.values().stream().flatMap(Collection::stream) - .map(c -> String.format("%s=%s", c.getName(), c.getValue())).sorted() - .collect(Collectors.joining(valueSeparator)); + cookiesData = cookies.values() + .stream() + .flatMap(Collection::stream) + .map(c -> String.format("%s=%s", c.getName(), c.getValue())) + .sorted() + .collect(Collectors.joining(valueSeparator)); } return cookiesData; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/HeaderKeyValueGenerator.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/HeaderKeyValueGenerator.java index d5ea55ca..fa279b2b 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/HeaderKeyValueGenerator.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/HeaderKeyValueGenerator.java @@ -47,8 +47,9 @@ class HeaderKeyValueGenerator implements KeyValueGenerator { HttpHeaders headers = request.getHeaders(); if (headers.get(header) != null) { StringBuilder keyVaryHeaders = new StringBuilder(); - keyVaryHeaders.append(header).append("=") - .append(getHeaderValues(headers).sorted().collect(Collectors.joining(valueSeparator))); + keyVaryHeaders.append(header) + .append("=") + .append(getHeaderValues(headers).sorted().collect(Collectors.joining(valueSeparator))); return keyVaryHeaders.toString(); } return null; diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetCacheDirectivesByMaxAgeAfterCacheExchangeMutator.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetCacheDirectivesByMaxAgeAfterCacheExchangeMutator.java index cd72b13a..c6ae8f51 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetCacheDirectivesByMaxAgeAfterCacheExchangeMutator.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetCacheDirectivesByMaxAgeAfterCacheExchangeMutator.java @@ -33,8 +33,10 @@ public class SetCacheDirectivesByMaxAgeAfterCacheExchangeMutator implements Afte @Override public void accept(ServerWebExchange exchange, CachedResponse cachedResponse) { Optional maxAge = Optional.ofNullable(exchange.getResponse().getHeaders().getCacheControl()) - .map(MAX_AGE_PATTERN::matcher).filter(Matcher::find).map(matcher -> matcher.group(1)) - .map(Integer::parseInt); + .map(MAX_AGE_PATTERN::matcher) + .filter(Matcher::find) + .map(matcher -> matcher.group(1)) + .map(Integer::parseInt); if (maxAge.isPresent()) { if (maxAge.get() > 0) { @@ -66,7 +68,8 @@ public class SetCacheDirectivesByMaxAgeAfterCacheExchangeMutator implements Afte List cacheControlValues = Arrays.asList(cacheControl.split("\\s*,\\s*")); String newCacheControl = cacheControlValues.stream() - .filter(s -> !s.matches("must-revalidate|no-cache|no-store")).collect(Collectors.joining(",")); + .filter(s -> !s.matches("must-revalidate|no-cache|no-store")) + .collect(Collectors.joining(",")); exchange.getResponse().getHeaders().setCacheControl(newCacheControl); } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetMaxAgeHeaderAfterCacheExchangeMutator.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetMaxAgeHeaderAfterCacheExchangeMutator.java index 2bb55319..a2fe54ce 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetMaxAgeHeaderAfterCacheExchangeMutator.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetMaxAgeHeaderAfterCacheExchangeMutator.java @@ -95,7 +95,8 @@ public class SetMaxAgeHeaderAfterCacheExchangeMutator implements AfterCacheExcha if (value.contains(MAX_AGE_PREFIX)) { if (seconds == -1) { List removedMaxAgeList = Arrays.stream(value.split(",")) - .filter(i -> !i.trim().startsWith(MAX_AGE_PREFIX)).collect(Collectors.toList()); + .filter(i -> !i.trim().startsWith(MAX_AGE_PREFIX)) + .collect(Collectors.toList()); value = String.join(",", removedMaxAgeList); } else { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/CachedBodyOutputMessage.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/CachedBodyOutputMessage.java index e23e86c2..5ba5f314 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/CachedBodyOutputMessage.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/CachedBodyOutputMessage.java @@ -78,7 +78,7 @@ public class CachedBodyOutputMessage implements ReactiveHttpOutputMessage { public Flux getBody() { if (body == null) { return Flux - .error(new IllegalStateException("The body is not set. " + "Did handling complete with success?")); + .error(new IllegalStateException("The body is not set. " + "Did handling complete with success?")); } return this.body; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactory.java index cf5cd030..22b68c67 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactory.java @@ -70,8 +70,8 @@ public class ModifyRequestBodyGatewayFilterFactory // TODO: flux or mono Mono modifiedBody = serverRequest.bodyToMono(inClass) - .flatMap(originalBody -> config.getRewriteFunction().apply(exchange, originalBody)) - .switchIfEmpty(Mono.defer(() -> (Mono) config.getRewriteFunction().apply(exchange, null))); + .flatMap(originalBody -> config.getRewriteFunction().apply(exchange, originalBody)) + .switchIfEmpty(Mono.defer(() -> (Mono) config.getRewriteFunction().apply(exchange, null))); BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, config.getOutClass()); HttpHeaders headers = new HttpHeaders(); @@ -88,19 +88,22 @@ public class ModifyRequestBodyGatewayFilterFactory } CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers); return bodyInserter.insert(outputMessage, new BodyInserterContext()) - // .log("modify_request", Level.INFO) - .then(Mono.defer(() -> { - ServerHttpRequest decorator = decorate(exchange, headers, outputMessage); - return chain.filter(exchange.mutate().request(decorator).build()); - })).onErrorResume((Function>) throwable -> release(exchange, - outputMessage, throwable)); + // .log("modify_request", Level.INFO) + .then(Mono.defer(() -> { + ServerHttpRequest decorator = decorate(exchange, headers, outputMessage); + return chain.filter(exchange.mutate().request(decorator).build()); + })) + .onErrorResume( + (Function>) throwable -> release(exchange, outputMessage, throwable)); } @Override public String toString() { return filterToStringCreator(ModifyRequestBodyGatewayFilterFactory.this) - .append("Content type", config.getContentType()).append("In class", config.getInClass()) - .append("Out class", config.getOutClass()).toString(); + .append("Content type", config.getContentType()) + .append("In class", config.getInClass()) + .append("Out class", config.getOutClass()) + .toString(); } }; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactory.java index 5d274e1d..4e376ca2 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactory.java @@ -67,9 +67,9 @@ public class ModifyResponseBodyGatewayFilterFactory super(Config.class); this.messageReaders = messageReaders; this.messageBodyDecoders = messageBodyDecoders.stream() - .collect(Collectors.toMap(MessageBodyDecoder::encodingType, identity())); + .collect(Collectors.toMap(MessageBodyDecoder::encodingType, identity())); this.messageBodyEncoders = messageBodyEncoders.stream() - .collect(Collectors.toMap(MessageBodyEncoder::encodingType, identity())); + .collect(Collectors.toMap(MessageBodyEncoder::encodingType, identity())); } @Override @@ -181,7 +181,9 @@ public class ModifyResponseBodyGatewayFilterFactory public String toString() { Object obj = (this.gatewayFilterFactory != null) ? this.gatewayFilterFactory : this; return filterToStringCreator(obj).append("New content type", config.getNewContentType()) - .append("In class", config.getInClass()).append("Out class", config.getOutClass()).toString(); + .append("In class", config.getInClass()) + .append("Out class", config.getOutClass()) + .toString(); } public void setFactory(GatewayFilterFactory gatewayFilterFactory) { @@ -221,8 +223,8 @@ public class ModifyResponseBodyGatewayFilterFactory // TODO: flux or mono Mono modifiedBody = extractBody(exchange, clientResponse, inClass) - .flatMap(originalBody -> config.getRewriteFunction().apply(exchange, originalBody)) - .switchIfEmpty(Mono.defer(() -> (Mono) config.getRewriteFunction().apply(exchange, null))); + .flatMap(originalBody -> config.getRewriteFunction().apply(exchange, originalBody)) + .switchIfEmpty(Mono.defer(() -> (Mono) config.getRewriteFunction().apply(exchange, null))); BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, outClass); CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, @@ -266,11 +268,12 @@ public class ModifyResponseBodyGatewayFilterFactory for (String encoding : encodingHeaders) { MessageBodyDecoder decoder = messageBodyDecoders.get(encoding); if (decoder != null) { - return clientResponse.bodyToMono(byte[].class).publishOn(Schedulers.parallel()).map(decoder::decode) - .map(bytes -> exchange.getResponse().bufferFactory().wrap(bytes)) - .map(buffer -> prepareClientResponse(Mono.just(buffer), - exchange.getResponse().getHeaders())) - .flatMap(response -> response.bodyToMono(inClass)); + return clientResponse.bodyToMono(byte[].class) + .publishOn(Schedulers.parallel()) + .map(decoder::decode) + .map(bytes -> exchange.getResponse().bufferFactory().wrap(bytes)) + .map(buffer -> prepareClientResponse(Mono.just(buffer), exchange.getResponse().getHeaders())) + .flatMap(response -> response.bodyToMono(inClass)); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/observation/DefaultGatewayObservationConvention.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/observation/DefaultGatewayObservationConvention.java index 1bc4e15f..4564d696 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/observation/DefaultGatewayObservationConvention.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/observation/DefaultGatewayObservationConvention.java @@ -51,9 +51,9 @@ public class DefaultGatewayObservationConvention implements GatewayObservationCo } Route route = context.getServerWebExchange().getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR); keyValues = keyValues - .and(ROUTE_URI.withValue(route.getUri().toString()), - METHOD.withValue(context.getRequest().getMethod().name())) - .and(ROUTE_ID.withValue(route.getId())); + .and(ROUTE_URI.withValue(route.getUri().toString()), + METHOD.withValue(context.getRequest().getMethod().name())) + .and(ROUTE_ID.withValue(route.getId())); ServerHttpResponse response = context.getResponse(); if (response != null && response.getStatusCode() != null) { keyValues = keyValues.and(STATUS.withValue(String.valueOf(response.getStatusCode().value()))); diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/observation/GatewayPropagatingSenderTracingObservationHandler.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/observation/GatewayPropagatingSenderTracingObservationHandler.java index 0c267dd8..5fd7cf96 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/observation/GatewayPropagatingSenderTracingObservationHandler.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/observation/GatewayPropagatingSenderTracingObservationHandler.java @@ -53,9 +53,10 @@ public class GatewayPropagatingSenderTracingObservationHandler @Override public void onStart(GatewayContext context) { - this.propagator.fields().stream() - .filter(field -> !remoteFieldsLowerCase.contains(field.toLowerCase(Locale.ROOT))) - .forEach(s -> Objects.requireNonNull(context.getCarrier()).remove(s)); + this.propagator.fields() + .stream() + .filter(field -> !remoteFieldsLowerCase.contains(field.toLowerCase(Locale.ROOT))) + .forEach(s -> Objects.requireNonNull(context.getCarrier()).remove(s)); super.onStart(context); } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/ratelimit/AbstractRateLimiter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/ratelimit/AbstractRateLimiter.java index 4b0e0c18..d3b076a0 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/ratelimit/AbstractRateLimiter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/ratelimit/AbstractRateLimiter.java @@ -58,8 +58,10 @@ public abstract class AbstractRateLimiter extends AbstractStatefulConfigurabl C routeConfig = newConfig(); if (this.configurationService != null) { - this.configurationService.with(routeConfig).name(this.configurationPropertyName).normalizedProperties(args) - .bind(); + this.configurationService.with(routeConfig) + .name(this.configurationPropertyName) + .normalizedProperties(args) + .bind(); } getConfig().put(routeId, routeConfig); } @@ -71,7 +73,9 @@ public abstract class AbstractRateLimiter extends AbstractStatefulConfigurabl @Override public String toString() { return new ToStringCreator(this).append("configurationPropertyName", configurationPropertyName) - .append("config", getConfig()).append("configClass", getConfigClass()).toString(); + .append("config", getConfig()) + .append("configClass", getConfigClass()) + .toString(); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiter.java index ab34615f..ff94e61e 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiter.java @@ -351,7 +351,9 @@ public class RedisRateLimiter extends AbstractRateLimiter { exchange.getAttributes().put(GATEWAY_REACTOR_CONTEXT_ATTR, contextView); return lookupRoute(exchange) - // .log("route-predicate-handler-mapping", Level.FINER) //name this - .map((Function) r -> { - exchange.getAttributes().remove(GATEWAY_PREDICATE_ROUTE_ATTR); - if (logger.isDebugEnabled()) { - logger.debug("Mapping [" + getExchangeDesc(exchange) + "] to " + r); - } + // .log("route-predicate-handler-mapping", Level.FINER) //name this + .map((Function) r -> { + exchange.getAttributes().remove(GATEWAY_PREDICATE_ROUTE_ATTR); + if (logger.isDebugEnabled()) { + logger.debug("Mapping [" + getExchangeDesc(exchange) + "] to " + r); + } - exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, r); - return webHandler; - }).switchIfEmpty(Mono.empty().then(Mono.fromRunnable(() -> { - exchange.getAttributes().remove(GATEWAY_PREDICATE_ROUTE_ATTR); - if (logger.isTraceEnabled()) { - logger.trace("No RouteDefinition found for [" + getExchangeDesc(exchange) + "]"); - } - }))); + exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, r); + return webHandler; + }) + .switchIfEmpty(Mono.empty().then(Mono.fromRunnable(() -> { + exchange.getAttributes().remove(GATEWAY_PREDICATE_ROUTE_ATTR); + if (logger.isTraceEnabled()) { + logger.trace("No RouteDefinition found for [" + getExchangeDesc(exchange) + "]"); + } + }))); }); } @@ -126,29 +127,29 @@ public class RoutePredicateHandlerMapping extends AbstractHandlerMapping { protected Mono lookupRoute(ServerWebExchange exchange) { return this.routeLocator.getRoutes() - // individually filter routes so that filterWhen error delaying is not a - // problem - .concatMap(route -> Mono.just(route).filterWhen(r -> { - // add the current route we are testing - exchange.getAttributes().put(GATEWAY_PREDICATE_ROUTE_ATTR, r.getId()); - return r.getPredicate().apply(exchange); - }) - // instead of immediately stopping main flux due to error, log and - // swallow it - .doOnError(e -> logger.error("Error applying predicate for route: " + route.getId(), e)) - .onErrorResume(e -> Mono.empty())) - // .defaultIfEmpty() put a static Route not found - // or .switchIfEmpty() - // .switchIfEmpty(Mono.empty().log("noroute")) - .next() - // TODO: error handling - .map(route -> { - if (logger.isDebugEnabled()) { - logger.debug("Route matched: " + route.getId()); - } - validateRoute(route, exchange); - return route; - }); + // individually filter routes so that filterWhen error delaying is not a + // problem + .concatMap(route -> Mono.just(route).filterWhen(r -> { + // add the current route we are testing + exchange.getAttributes().put(GATEWAY_PREDICATE_ROUTE_ATTR, r.getId()); + return r.getPredicate().apply(exchange); + }) + // instead of immediately stopping main flux due to error, log and + // swallow it + .doOnError(e -> logger.error("Error applying predicate for route: " + route.getId(), e)) + .onErrorResume(e -> Mono.empty())) + // .defaultIfEmpty() put a static Route not found + // or .switchIfEmpty() + // .switchIfEmpty(Mono.empty().log("noroute")) + .next() + // TODO: error handling + .map(route -> { + if (logger.isDebugEnabled()) { + logger.debug("Route matched: " + route.getId()); + } + validateRoute(route, exchange); + return route; + }); /* * TODO: trace logging if (logger.isTraceEnabled()) { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServiceRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServiceRoutePredicateFactory.java index 45c06c2a..d12af56e 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServiceRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServiceRoutePredicateFactory.java @@ -54,7 +54,7 @@ public class CloudFoundryRouteServiceRoutePredicateFactory extends AbstractRoute @Override public Predicate apply(Object unused) { return headerPredicate(X_CF_FORWARDED_URL).and(headerPredicate(X_CF_PROXY_SIGNATURE)) - .and(headerPredicate(X_CF_PROXY_METADATA)); + .and(headerPredicate(X_CF_PROXY_METADATA)); } private Predicate headerPredicate(String header) { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactory.java index d5382866..e96e9bc6 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactory.java @@ -59,8 +59,9 @@ public class HeaderRoutePredicateFactory extends AbstractRoutePredicateFactory values = exchange.getRequest().getHeaders().getOrDefault(config.header, - Collections.emptyList()); + List values = exchange.getRequest() + .getHeaders() + .getOrDefault(config.header, Collections.emptyList()); if (values.isEmpty()) { return false; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java index f4a1d7c7..4d4ea6a1 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java @@ -90,9 +90,9 @@ public class PathRoutePredicateFactory extends AbstractRoutePredicateFactory parsePath(exchange.getRequest().getURI().getRawPath())); + PathContainer path = (PathContainer) exchange.getAttributes() + .computeIfAbsent(GATEWAY_PREDICATE_PATH_CONTAINER_ATTR, + s -> parsePath(exchange.getRequest().getURI().getRawPath())); PathPattern match = null; for (int i = 0; i < pathPatterns.size(); i++) { @@ -179,7 +179,8 @@ public class PathRoutePredicateFactory extends AbstractRoutePredicateFactory ServerRequest - .create(exchange.mutate().request(serverHttpRequest).build(), messageReaders) - .bodyToMono(inClass).doOnNext(objectValue -> exchange.getAttributes() - .put(CACHE_REQUEST_BODY_OBJECT_KEY, objectValue)) - .map(objectValue -> config.getPredicate().test(objectValue))); + .create(exchange.mutate().request(serverHttpRequest).build(), messageReaders) + .bodyToMono(inClass) + .doOnNext(objectValue -> exchange.getAttributes() + .put(CACHE_REQUEST_BODY_OBJECT_KEY, objectValue)) + .map(objectValue -> config.getPredicate().test(objectValue))); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/XForwardedRemoteAddrRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/XForwardedRemoteAddrRoutePredicateFactory.java index ccfdecf9..5ddf9d6e 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/XForwardedRemoteAddrRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/XForwardedRemoteAddrRoutePredicateFactory.java @@ -92,7 +92,7 @@ public class XForwardedRemoteAddrRoutePredicateFactory RemoteAddrRoutePredicateFactory.Config wrappedConfig = new RemoteAddrRoutePredicateFactory.Config(); wrappedConfig.setSources(config.getSources()); wrappedConfig - .setRemoteAddressResolver(XForwardedRemoteAddressResolver.maxTrustedIndex(config.getMaxTrustedIndex())); + .setRemoteAddressResolver(XForwardedRemoteAddressResolver.maxTrustedIndex(config.getMaxTrustedIndex())); RemoteAddrRoutePredicateFactory remoteAddrRoutePredicateFactory = new RemoteAddrRoutePredicateFactory(); Predicate wrappedPredicate = remoteAddrRoutePredicateFactory.apply(wrappedConfig); diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/CachingRouteLocator.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/CachingRouteLocator.java index 52b23cd3..5cf8cdae 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/CachingRouteLocator.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/CachingRouteLocator.java @@ -86,11 +86,11 @@ public class CachingRouteLocator try { if (this.cache.containsKey(CACHE_KEY) && event.isScoped()) { final Mono> scopedRoutes = fetch(event.getMetadata()).collect(Collectors.toList()) - .onErrorResume(s -> Mono.just(List.of())); + .onErrorResume(s -> Mono.just(List.of())); scopedRoutes.subscribe(scopedRoutesList -> { updateCache(Flux.concat(Flux.fromIterable(scopedRoutesList), getNonScopedRoutes(event)) - .sort(AnnotationAwareOrderComparator.INSTANCE)); + .sort(AnnotationAwareOrderComparator.INSTANCE)); }, this::handleRefreshError); } else { @@ -104,8 +104,9 @@ public class CachingRouteLocator } private synchronized void updateCache(Flux routes) { - routes.materialize().collect(Collectors.toList()).subscribe(this::publishRefreshEvent, - this::handleRefreshError); + routes.materialize() + .collect(Collectors.toList()) + .subscribe(this::publishRefreshEvent, this::handleRefreshError); } private void publishRefreshEvent(List> signals) { @@ -115,7 +116,7 @@ public class CachingRouteLocator private Flux getNonScopedRoutes(RefreshRoutesEvent scopedEvent) { return this.getRoutes() - .filter(route -> !RouteLocator.matchMetadata(route.getMetadata(), scopedEvent.getMetadata())); + .filter(route -> !RouteLocator.matchMetadata(route.getMetadata(), scopedEvent.getMetadata())); } private void handleRefreshError(Throwable throwable) { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/CompositeRouteDefinitionLocator.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/CompositeRouteDefinitionLocator.java index 217cda6c..8e54feb1 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/CompositeRouteDefinitionLocator.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/CompositeRouteDefinitionLocator.java @@ -50,18 +50,18 @@ public class CompositeRouteDefinitionLocator implements RouteDefinitionLocator { @Override public Flux getRouteDefinitions() { return this.delegates.flatMapSequential(RouteDefinitionLocator::getRouteDefinitions) - .flatMap(routeDefinition -> { - if (routeDefinition.getId() == null) { - return randomId().map(id -> { - routeDefinition.setId(id); - if (log.isDebugEnabled()) { - log.debug("Id set on route definition: " + routeDefinition); - } - return routeDefinition; - }); - } - return Mono.just(routeDefinition); - }); + .flatMap(routeDefinition -> { + if (routeDefinition.getId() == null) { + return randomId().map(id -> { + routeDefinition.setId(id); + if (log.isDebugEnabled()) { + log.debug("Id set on route definition: " + routeDefinition); + } + return routeDefinition; + }); + } + return Mono.just(routeDefinition); + }); } protected Mono randomId() { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepository.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepository.java index 0beef09f..77aa51e6 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepository.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepository.java @@ -53,24 +53,25 @@ public class RedisRouteDefinitionRepository implements RouteDefinitionRepository @Override public Flux getRouteDefinitions() { return reactiveRedisTemplate.scan(ScanOptions.scanOptions().match(createKey("*")).build()) - .flatMap(key -> reactiveRedisTemplate.opsForValue().get(key)) - .onErrorContinue((throwable, routeDefinition) -> { - if (log.isErrorEnabled()) { - log.error("get routes from redis error cause : {}", throwable.toString(), throwable); - } - }); + .flatMap(key -> reactiveRedisTemplate.opsForValue().get(key)) + .onErrorContinue((throwable, routeDefinition) -> { + if (log.isErrorEnabled()) { + log.error("get routes from redis error cause : {}", throwable.toString(), throwable); + } + }); } @Override public Mono save(Mono route) { return route.flatMap(routeDefinition -> routeDefinitionReactiveValueOperations - .set(createKey(routeDefinition.getId()), routeDefinition).flatMap(success -> { - if (success) { - return Mono.empty(); - } - return Mono.defer(() -> Mono.error(new RuntimeException( - String.format("Could not add route to redis repository: %s", routeDefinition)))); - })); + .set(createKey(routeDefinition.getId()), routeDefinition) + .flatMap(success -> { + if (success) { + return Mono.empty(); + } + return Mono.defer(() -> Mono.error(new RuntimeException( + String.format("Could not add route to redis repository: %s", routeDefinition)))); + })); } @Override diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocator.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocator.java index f9d3aead..a4da3e6d 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocator.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocator.java @@ -98,7 +98,7 @@ public class RouteDefinitionRouteLocator implements RouteLocator { @Override public Flux getRoutesByMetadata(Map metadata) { return getRoutes(this.routeDefinitionLocator.getRouteDefinitions() - .filter(routeDef -> RouteLocator.matchMetadata(routeDef.getMetadata(), metadata))); + .filter(routeDef -> RouteLocator.matchMetadata(routeDef.getMetadata(), metadata))); } @Override diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RouteLocator.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RouteLocator.java index 3b1812ce..2ca84f75 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RouteLocator.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RouteLocator.java @@ -43,9 +43,10 @@ public interface RouteLocator { return true; } else { - return toCheck != null - && expectedMetadata.entrySet().stream().allMatch(keyValue -> toCheck.containsKey(keyValue.getKey()) - && toCheck.get(keyValue.getKey()).equals(keyValue.getValue())); + return toCheck != null && expectedMetadata.entrySet() + .stream() + .allMatch(keyValue -> toCheck.containsKey(keyValue.getKey()) + && toCheck.get(keyValue.getKey()).equals(keyValue.getValue())); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpec.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpec.java index 3b764330..0e1a2df7 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpec.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpec.java @@ -184,7 +184,7 @@ public class GatewayFilterSpec extends UriSpec { */ public GatewayFilterSpec addRequestHeader(String headerName, String headerValue) { return filter(getBean(AddRequestHeaderGatewayFilterFactory.class) - .apply(c -> c.setName(headerName).setValue(headerValue))); + .apply(c -> c.setName(headerName).setValue(headerValue))); } /** @@ -195,8 +195,10 @@ public class GatewayFilterSpec extends UriSpec { */ public GatewayFilterSpec addRequestHeadersIfNotPresent(String... headers) { return filter(getBean(AddRequestHeadersIfNotPresentGatewayFilterFactory.class).apply(c -> { - KeyValue[] values = Arrays.stream(headers).map(header -> header.split(":")) - .map(parts -> new KeyValue(parts[0], parts[1])).toArray(size -> new KeyValue[size]); + KeyValue[] values = Arrays.stream(headers) + .map(header -> header.split(":")) + .map(parts -> new KeyValue(parts[0], parts[1])) + .toArray(size -> new KeyValue[size]); c.setKeyValues(values); })); } @@ -220,7 +222,7 @@ public class GatewayFilterSpec extends UriSpec { */ public GatewayFilterSpec addResponseHeader(String headerName, String headerValue) { return filter(getBean(AddResponseHeaderGatewayFilterFactory.class) - .apply(c -> c.setName(headerName).setValue(headerValue))); + .apply(c -> c.setName(headerName).setValue(headerValue))); } /** @@ -236,7 +238,7 @@ public class GatewayFilterSpec extends UriSpec { */ public GatewayFilterSpec localResponseCache(Duration timeToLive, DataSize size) { return filter(getBean(LocalResponseCacheGatewayFilterFactory.class) - .apply(c -> c.setTimeToLive(timeToLive).setSize(size))); + .apply(c -> c.setTimeToLive(timeToLive).setSize(size))); } /** @@ -248,7 +250,7 @@ public class GatewayFilterSpec extends UriSpec { */ public GatewayFilterSpec dedupeResponseHeader(String headerName, String strategy) { return filter(getBean(DedupeResponseHeaderGatewayFilterFactory.class) - .apply(c -> c.setStrategy(Strategy.valueOf(strategy)).setName(headerName))); + .apply(c -> c.setStrategy(Strategy.valueOf(strategy)).setName(headerName))); } public GatewayFilterSpec circuitBreaker(Consumer configConsumer) { @@ -272,7 +274,9 @@ public class GatewayFilterSpec extends UriSpec { */ public GatewayFilterSpec jsonToGRPC(String protoDescriptor, String protoFile, String service, String method) { return filter(getBean(JsonToGrpcGatewayFilterFactory.class).apply(c -> c.setMethod(method) - .setProtoDescriptor(protoDescriptor).setProtoFile(protoFile).setService(service))); + .setProtoDescriptor(protoDescriptor) + .setProtoFile(protoFile) + .setService(service))); } /** @@ -283,7 +287,7 @@ public class GatewayFilterSpec extends UriSpec { */ public GatewayFilterSpec mapRequestHeader(String fromHeader, String toHeader) { return filter(getBean(MapRequestHeaderGatewayFilterFactory.class) - .apply(c -> c.setFromHeader(fromHeader).setToHeader(toHeader))); + .apply(c -> c.setFromHeader(fromHeader).setToHeader(toHeader))); } /** @@ -299,7 +303,7 @@ public class GatewayFilterSpec extends UriSpec { public GatewayFilterSpec modifyRequestBody(Class inClass, Class outClass, RewriteFunction rewriteFunction) { return filter(getBean(ModifyRequestBodyGatewayFilterFactory.class) - .apply(c -> c.setRewriteFunction(inClass, outClass, rewriteFunction))); + .apply(c -> c.setRewriteFunction(inClass, outClass, rewriteFunction))); } /** @@ -316,7 +320,7 @@ public class GatewayFilterSpec extends UriSpec { public GatewayFilterSpec modifyRequestBody(ParameterizedTypeReference inClass, ParameterizedTypeReference outClass, RewriteFunction rewriteFunction) { return filter(getBean(ModifyRequestBodyGatewayFilterFactory.class) - .apply(c -> c.setRewriteFunction(inClass, outClass, rewriteFunction))); + .apply(c -> c.setRewriteFunction(inClass, outClass, rewriteFunction))); } /** @@ -332,7 +336,7 @@ public class GatewayFilterSpec extends UriSpec { public GatewayFilterSpec modifyRequestBody(Class inClass, Class outClass, String newContentType, RewriteFunction rewriteFunction) { return filter(getBean(ModifyRequestBodyGatewayFilterFactory.class) - .apply(c -> c.setRewriteFunction(inClass, outClass, rewriteFunction).setContentType(newContentType))); + .apply(c -> c.setRewriteFunction(inClass, outClass, rewriteFunction).setContentType(newContentType))); } /** @@ -350,7 +354,7 @@ public class GatewayFilterSpec extends UriSpec { public GatewayFilterSpec modifyRequestBody(ParameterizedTypeReference inClass, ParameterizedTypeReference outClass, String newContentType, RewriteFunction rewriteFunction) { return filter(getBean(ModifyRequestBodyGatewayFilterFactory.class) - .apply(c -> c.setRewriteFunction(inClass, outClass, rewriteFunction).setContentType(newContentType))); + .apply(c -> c.setRewriteFunction(inClass, outClass, rewriteFunction).setContentType(newContentType))); } /** @@ -400,7 +404,7 @@ public class GatewayFilterSpec extends UriSpec { public GatewayFilterSpec modifyResponseBody(Class inClass, Class outClass, RewriteFunction rewriteFunction) { return filter(getBean(ModifyResponseBodyGatewayFilterFactory.class) - .apply(c -> c.setRewriteFunction(inClass, outClass, rewriteFunction))); + .apply(c -> c.setRewriteFunction(inClass, outClass, rewriteFunction))); } /** @@ -418,8 +422,8 @@ public class GatewayFilterSpec extends UriSpec { // TODO: setup custom spec public GatewayFilterSpec modifyResponseBody(Class inClass, Class outClass, String newContentType, RewriteFunction rewriteFunction) { - return filter(getBean(ModifyResponseBodyGatewayFilterFactory.class).apply( - c -> c.setRewriteFunction(inClass, outClass, rewriteFunction).setNewContentType(newContentType))); + return filter(getBean(ModifyResponseBodyGatewayFilterFactory.class) + .apply(c -> c.setRewriteFunction(inClass, outClass, rewriteFunction).setNewContentType(newContentType))); } /** @@ -603,7 +607,7 @@ public class GatewayFilterSpec extends UriSpec { */ public GatewayFilterSpec removeJsonAttributes(boolean deleteRecursively, String... attributes) { return filter(getBean(RemoveJsonAttributesResponseBodyGatewayFilterFactory.class) - .apply(c -> c.setFieldList(Arrays.asList(attributes)).setDeleteRecursively(deleteRecursively))); + .apply(c -> c.setFieldList(Arrays.asList(attributes)).setDeleteRecursively(deleteRecursively))); } @@ -665,7 +669,7 @@ public class GatewayFilterSpec extends UriSpec { */ public GatewayFilterSpec rewritePath(String regex, String replacement) { return filter(getBean(RewritePathGatewayFilterFactory.class) - .apply(c -> c.setRegexp(regex).setReplacement(replacement))); + .apply(c -> c.setRegexp(regex).setReplacement(replacement))); } /** @@ -741,7 +745,7 @@ public class GatewayFilterSpec extends UriSpec { */ public GatewayFilterSpec setRequestHeader(String headerName, String headerValue) { return filter(getBean(SetRequestHeaderGatewayFilterFactory.class) - .apply(c -> c.setName(headerName).setValue(headerValue))); + .apply(c -> c.setName(headerName).setValue(headerValue))); } /** @@ -753,7 +757,7 @@ public class GatewayFilterSpec extends UriSpec { */ public GatewayFilterSpec setResponseHeader(String headerName, String headerValue) { return filter(getBean(SetResponseHeaderGatewayFilterFactory.class) - .apply(c -> c.setName(headerName).setValue(headerValue))); + .apply(c -> c.setName(headerName).setValue(headerValue))); } /** @@ -766,7 +770,7 @@ public class GatewayFilterSpec extends UriSpec { */ public GatewayFilterSpec rewriteResponseHeader(String headerName, String regex, String replacement) { return filter(getBean(RewriteResponseHeaderGatewayFilterFactory.class) - .apply(c -> c.setReplacement(replacement).setRegexp(regex).setName(headerName))); + .apply(c -> c.setReplacement(replacement).setRegexp(regex).setName(headerName))); } /** @@ -781,9 +785,11 @@ public class GatewayFilterSpec extends UriSpec { */ public GatewayFilterSpec rewriteLocationResponseHeader(String stripVersionMode, String locationHeaderName, String hostValue, String protocolsRegex) { - return filter(getBean(RewriteLocationResponseHeaderGatewayFilterFactory.class).apply( - c -> c.setStripVersion(StripVersion.valueOf(stripVersionMode)).setLocationHeaderName(locationHeaderName) - .setHostValue(hostValue).setProtocols(protocolsRegex))); + return filter(getBean(RewriteLocationResponseHeaderGatewayFilterFactory.class) + .apply(c -> c.setStripVersion(StripVersion.valueOf(stripVersionMode)) + .setLocationHeaderName(locationHeaderName) + .setHostValue(hostValue) + .setProtocols(protocolsRegex))); } /** @@ -794,7 +800,7 @@ public class GatewayFilterSpec extends UriSpec { */ public GatewayFilterSpec rewriteRequestParameter(String name, String replacement) { return filter(getBean(RewriteRequestParameterGatewayFilterFactory.class) - .apply(c -> c.setReplacement(replacement).setName(name))); + .apply(c -> c.setReplacement(replacement).setName(name))); } /** diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/builder/PredicateSpec.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/builder/PredicateSpec.java index d88a7cc1..7068c68a 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/builder/PredicateSpec.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/builder/PredicateSpec.java @@ -97,7 +97,7 @@ public class PredicateSpec extends UriSpec { */ public BooleanSpec between(ZonedDateTime datetime1, ZonedDateTime datetime2) { return asyncPredicate(getBean(BetweenRoutePredicateFactory.class) - .applyAsync(c -> c.setDatetime1(datetime1).setDatetime2(datetime2))); + .applyAsync(c -> c.setDatetime1(datetime1).setDatetime2(datetime2))); } /** @@ -188,7 +188,7 @@ public class PredicateSpec extends UriSpec { */ public BooleanSpec path(boolean matchTrailingSlash, String... patterns) { return asyncPredicate(getBean(PathRoutePredicateFactory.class) - .applyAsync(c -> c.setPatterns(Arrays.asList(patterns)).setMatchTrailingSlash(matchTrailingSlash))); + .applyAsync(c -> c.setPatterns(Arrays.asList(patterns)).setMatchTrailingSlash(matchTrailingSlash))); } /** @@ -287,7 +287,7 @@ public class PredicateSpec extends UriSpec { */ public BooleanSpec weight(String group, int weight) { return asyncPredicate(getBean(WeightRoutePredicateFactory.class) - .applyAsync(c -> c.setGroup(group).setRouteId(routeBuilder.getId()).setWeight(weight))); + .applyAsync(c -> c.setGroup(group).setRouteId(routeBuilder.getId()).setWeight(weight))); } public BooleanSpec cloudFoundryRouteService() { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ConfigurationService.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ConfigurationService.java index d1978755..a53d73a9 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ConfigurationService.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ConfigurationService.java @@ -95,7 +95,7 @@ public class ConfigurationService implements ApplicationEventPublisherAware { } List propertySources = Collections - .singletonList(new MapConfigurationPropertySource(properties)); + .singletonList(new MapConfigurationPropertySource(properties)); return new Binder(propertySources, null, conversionService).bindOrCreate(configurationPropertyName, bindable, handler); @@ -137,8 +137,8 @@ public class ConfigurationService implements ApplicationEventPublisherAware { @Override protected Map normalizeProperties() { if (this.service.beanFactory != null) { - return this.configurable.shortcutType().normalize(this.properties, this.configurable, - this.service.parser, this.service.beanFactory); + return this.configurable.shortcutType() + .normalize(this.properties, this.configurable, this.service.parser, this.service.beanFactory); } return super.normalizeProperties(); } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtils.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtils.java index 64118914..0ce96e64 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtils.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtils.java @@ -299,7 +299,7 @@ public final class ServerWebExchangeUtils { public static void putUriTemplateVariables(ServerWebExchange exchange, Map uriVariables) { if (exchange.getAttributes().containsKey(URI_TEMPLATE_VARIABLES_ATTRIBUTE)) { Map existingVariables = (Map) exchange.getAttributes() - .get(URI_TEMPLATE_VARIABLES_ATTRIBUTE); + .get(URI_TEMPLATE_VARIABLES_ATTRIBUTE); HashMap newVariables = new HashMap<>(); newVariables.putAll(existingVariables); newVariables.putAll(uriVariables); @@ -372,9 +372,11 @@ public final class ServerWebExchangeUtils { ServerHttpResponse response = exchange.getResponse(); DataBufferFactory factory = response.bufferFactory(); // Join all the DataBuffers so we have a single DataBuffer for the body - return DataBufferUtils.join(exchange.getRequest().getBody()).defaultIfEmpty(factory.wrap(EMPTY_BYTES)) - .map(dataBuffer -> decorate(exchange, dataBuffer, cacheDecoratedRequest)) - .switchIfEmpty(Mono.just(exchange.getRequest())).flatMap(function); + return DataBufferUtils.join(exchange.getRequest().getBody()) + .defaultIfEmpty(factory.wrap(EMPTY_BYTES)) + .map(dataBuffer -> decorate(exchange, dataBuffer, cacheDecoratedRequest)) + .switchIfEmpty(Mono.just(exchange.getRequest())) + .flatMap(function); } private static ServerHttpRequest decorate(ServerWebExchange exchange, DataBuffer dataBuffer, diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ShortcutConfigurable.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ShortcutConfigurable.java index 7cb20096..30e2cc2e 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ShortcutConfigurable.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ShortcutConfigurable.java @@ -128,8 +128,11 @@ public interface ShortcutConfigurable { Assert.isTrue(fieldOrder != null && fieldOrder.size() == 1, "Shortcut Configuration Type GATHER_LIST must have shortcutFieldOrder of size 1"); String fieldName = fieldOrder.get(0); - map.put(fieldName, args.values().stream().map(value -> getValue(parser, beanFactory, value)) - .collect(Collectors.toList())); + map.put(fieldName, + args.values() + .stream() + .map(value -> getValue(parser, beanFactory, value)) + .collect(Collectors.toList())); return map; } }, @@ -158,8 +161,10 @@ public interface ShortcutConfigurable { } } String fieldName = fieldOrder.get(0); - map.put(fieldName, values.stream().map(value -> getValue(parser, beanFactory, value)) - .collect(Collectors.toList())); + map.put(fieldName, + values.stream() + .map(value -> getValue(parser, beanFactory, value)) + .collect(Collectors.toList())); return map; } }; @@ -182,7 +187,8 @@ public interface ShortcutConfigurable { Boolean.class, true); if (restrictive) { delegate = SimpleEvaluationContext.forPropertyAccessors(new RestrictivePropertyAccessor()) - .withMethodResolvers((context, targetObject, name, argumentTypes) -> null).build(); + .withMethodResolvers((context, targetObject, name, argumentTypes) -> null) + .build(); } else { delegate = SimpleEvaluationContext.forReadOnlyDataBinding().build(); diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/WeightConfig.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/WeightConfig.java index ad8fae9b..03bbc509 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/WeightConfig.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/WeightConfig.java @@ -80,8 +80,10 @@ public class WeightConfig { @Override public String toString() { - return new ToStringCreator(this).append("group", group).append("routeId", routeId).append("weight", weight) - .toString(); + return new ToStringCreator(this).append("group", group) + .append("routeId", routeId) + .append("weight", weight) + .toString(); } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/tagsprovider/PropertiesTagsProvider.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/tagsprovider/PropertiesTagsProvider.java index 6cd3eb2a..610c1a40 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/tagsprovider/PropertiesTagsProvider.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/tagsprovider/PropertiesTagsProvider.java @@ -32,8 +32,10 @@ public class PropertiesTagsProvider implements GatewayTagsProvider { private final Tags propertiesTags; public PropertiesTagsProvider(Map tagsMap) { - this.propertiesTags = Tags.of(tagsMap.entrySet().stream().map(entry -> Tag.of(entry.getKey(), entry.getValue())) - .collect(Collectors.toList())); + this.propertiesTags = Tags.of(tagsMap.entrySet() + .stream() + .map(entry -> Tag.of(entry.getKey(), entry.getValue())) + .collect(Collectors.toList())); } @Override diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/actuate/GatewayControllerEndpointTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/actuate/GatewayControllerEndpointTests.java index d54c7e6f..ef599fb6 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/actuate/GatewayControllerEndpointTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/actuate/GatewayControllerEndpointTests.java @@ -70,75 +70,109 @@ public class GatewayControllerEndpointTests { @Test public void testEndpoints() { - testClient.get().uri("http://localhost:" + port + "/actuator/gateway").exchange().expectStatus().isOk() - .expectBodyList(Map.class).consumeWith(result -> { - List responseBody = result.getResponseBody(); - assertThat(responseBody).isNotEmpty(); - assertThat(responseBody).contains(Map.of("href", "/actuator/gateway/", "methods", List.of("GET")), - Map.of("href", "/actuator/gateway/globalfilters", "methods", List.of("GET")), - Map.of("href", "/actuator/gateway/refresh", "methods", List.of("POST")), - Map.of("href", "/actuator/gateway/routedefinitions", "methods", List.of("GET")), - Map.of("href", "/actuator/gateway/routefilters", "methods", List.of("GET")), - Map.of("href", "/actuator/gateway/routepredicates", "methods", List.of("GET")), - Map.of("href", "/actuator/gateway/routes", "methods", List.of("POST", "GET")), - Map.of("href", "/actuator/gateway/routes/test-service", "methods", - List.of("POST", "DELETE", "GET")), - Map.of("href", "/actuator/gateway/routes/route_with_metadata", "methods", - List.of("POST", "DELETE", "GET"))); - }); + testClient.get() + .uri("http://localhost:" + port + "/actuator/gateway") + .exchange() + .expectStatus() + .isOk() + .expectBodyList(Map.class) + .consumeWith(result -> { + List responseBody = result.getResponseBody(); + assertThat(responseBody).isNotEmpty(); + assertThat(responseBody).contains(Map.of("href", "/actuator/gateway/", "methods", List.of("GET")), + Map.of("href", "/actuator/gateway/globalfilters", "methods", List.of("GET")), + Map.of("href", "/actuator/gateway/refresh", "methods", List.of("POST")), + Map.of("href", "/actuator/gateway/routedefinitions", "methods", List.of("GET")), + Map.of("href", "/actuator/gateway/routefilters", "methods", List.of("GET")), + Map.of("href", "/actuator/gateway/routepredicates", "methods", List.of("GET")), + Map.of("href", "/actuator/gateway/routes", "methods", List.of("POST", "GET")), + Map.of("href", "/actuator/gateway/routes/test-service", "methods", + List.of("POST", "DELETE", "GET")), + Map.of("href", "/actuator/gateway/routes/route_with_metadata", "methods", + List.of("POST", "DELETE", "GET"))); + }); } @Test public void testRefresh() { - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh").exchange().expectStatus() - .isOk(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/refresh") + .exchange() + .expectStatus() + .isOk(); } @Test public void testRoutes() { - testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routes").exchange().expectStatus().isOk() - .expectBodyList(Map.class).consumeWith(result -> { - List responseBody = result.getResponseBody(); - assertThat(responseBody).isNotEmpty(); - }); + testClient.get() + .uri("http://localhost:" + port + "/actuator/gateway/routes") + .exchange() + .expectStatus() + .isOk() + .expectBodyList(Map.class) + .consumeWith(result -> { + List responseBody = result.getResponseBody(); + assertThat(responseBody).isNotEmpty(); + }); } @Test public void testGetSpecificRoute() { - testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routes/test-service").exchange() - .expectStatus().isOk().expectBodyList(Map.class).consumeWith(result -> { - List responseBody = result.getResponseBody(); - assertThat(responseBody).isNotNull(); - assertThat(responseBody.size()).isEqualTo(1); - assertThat(responseBody).isNotEmpty(); - }); + testClient.get() + .uri("http://localhost:" + port + "/actuator/gateway/routes/test-service") + .exchange() + .expectStatus() + .isOk() + .expectBodyList(Map.class) + .consumeWith(result -> { + List responseBody = result.getResponseBody(); + assertThat(responseBody).isNotNull(); + assertThat(responseBody.size()).isEqualTo(1); + assertThat(responseBody).isNotEmpty(); + }); } @Test public void testRouteReturnsMetadata() { - testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routes/route_with_metadata").exchange() - .expectStatus().isOk().expectBody().jsonPath("$.metadata") - .value(map -> assertThat((Map) map).hasSize(3) - .containsEntry("optionName", "OptionValue").containsEntry("iAmNumber", 1) - .containsEntry("compositeObject", Maps.newHashMap("name", "value"))); + testClient.get() + .uri("http://localhost:" + port + "/actuator/gateway/routes/route_with_metadata") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .jsonPath("$.metadata") + .value(map -> assertThat((Map) map).hasSize(3) + .containsEntry("optionName", "OptionValue") + .containsEntry("iAmNumber", 1) + .containsEntry("compositeObject", Maps.newHashMap("name", "value"))); } @Test public void testRouteFilters() { - testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routefilters").exchange().expectStatus() - .isOk().expectBody(Map.class).consumeWith(result -> { - Map responseBody = result.getResponseBody(); - assertThat(responseBody).isNotEmpty(); - }); + testClient.get() + .uri("http://localhost:" + port + "/actuator/gateway/routefilters") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + Map responseBody = result.getResponseBody(); + assertThat(responseBody).isNotEmpty(); + }); } @Test public void testRoutePredicates() { - testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routepredicates").exchange().expectStatus() - .isOk().expectBody(Map.class).consumeWith(result -> { - Map responseBody = result.getResponseBody(); - assertThat(responseBody).isNotEmpty(); - }); + testClient.get() + .uri("http://localhost:" + port + "/actuator/gateway/routepredicates") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + Map responseBody = result.getResponseBody(); + assertThat(responseBody).isNotEmpty(); + }); } @Test @@ -150,15 +184,24 @@ public class GatewayControllerEndpointTests { testRouteDefinition.setPredicates(Arrays.asList(methodRoutePredicateDefinition)); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/test-route-to-be-delete") - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition)).exchange() - .expectStatus().isCreated(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/test-route-to-be-delete") + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition)) + .exchange() + .expectStatus() + .isCreated(); - testClient.delete().uri("http://localhost:" + port + "/actuator/gateway/routes/test-route-to-be-delete") - .exchange().expectStatus().isOk().expectBody(ResponseEntity.class).consumeWith(result -> { - HttpStatusCode httpStatus = result.getStatus(); - Assertions.assertEquals(HttpStatus.OK, httpStatus); - }); + testClient.delete() + .uri("http://localhost:" + port + "/actuator/gateway/routes/test-route-to-be-delete") + .exchange() + .expectStatus() + .isOk() + .expectBody(ResponseEntity.class) + .consumeWith(result -> { + HttpStatusCode httpStatus = result.getStatus(); + Assertions.assertEquals(HttpStatus.OK, httpStatus); + }); } @Test @@ -169,8 +212,8 @@ public class GatewayControllerEndpointTests { FilterDefinition prefixPathFilterDefinition = new FilterDefinition("PrefixPath=/test-path"); FilterDefinition redirectToFilterDefinition = new FilterDefinition("RemoveResponseHeader=Sensitive-Header"); FilterDefinition testFilterDefinition = new FilterDefinition("TestFilter"); - testRouteDefinition.setFilters( - Arrays.asList(prefixPathFilterDefinition, redirectToFilterDefinition, testFilterDefinition)); + testRouteDefinition + .setFilters(Arrays.asList(prefixPathFilterDefinition, redirectToFilterDefinition, testFilterDefinition)); PredicateDefinition hostRoutePredicateDefinition = new PredicateDefinition("Host=myhost.org"); PredicateDefinition methodRoutePredicateDefinition = new PredicateDefinition("Method=GET"); @@ -178,9 +221,13 @@ public class GatewayControllerEndpointTests { testRouteDefinition.setPredicates( Arrays.asList(hostRoutePredicateDefinition, methodRoutePredicateDefinition, testPredicateDefinition)); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/test-route") - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition)).exchange() - .expectStatus().isCreated(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/test-route") + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition)) + .exchange() + .expectStatus() + .isCreated(); } @Test @@ -191,27 +238,43 @@ public class GatewayControllerEndpointTests { testRouteDefinition.setMetadata(Map.of("groupBy", group1)); String routeId1 = "route-1_" + UUID.randomUUID(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId1) - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition)).exchange() - .expectStatus().isCreated(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId1) + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition)) + .exchange() + .expectStatus() + .isCreated(); RouteDefinition testRouteDefinition2 = new RouteDefinition(); testRouteDefinition2.setUri(URI.create("http://example.org")); String group2 = "group-2_" + UUID.randomUUID(); testRouteDefinition2.setMetadata(Map.of("groupBy", group2)); String routeId2 = "route-2_" + UUID.randomUUID(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId2) - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition2)).exchange() - .expectStatus().isCreated(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId2) + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition2)) + .exchange() + .expectStatus() + .isCreated(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group1) - .exchange().expectStatus().isOk(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group1) + .exchange() + .expectStatus() + .isOk(); - testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routes").exchange().expectStatus().isOk() - .expectBodyList(Map.class).consumeWith(result -> { - List responseBody = result.getResponseBody(); - assertThat(responseBody).extracting("route_id").contains(routeId1).doesNotContain(routeId2); - }); + testClient.get() + .uri("http://localhost:" + port + "/actuator/gateway/routes") + .exchange() + .expectStatus() + .isOk() + .expectBodyList(Map.class) + .consumeWith(result -> { + List responseBody = result.getResponseBody(); + assertThat(responseBody).extracting("route_id").contains(routeId1).doesNotContain(routeId2); + }); } @Test @@ -223,9 +286,13 @@ public class GatewayControllerEndpointTests { testRouteDefinition.setMetadata(Map.of("groupBy", group1)); String routeId1 = "route-1_" + UUID.randomUUID(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId1) - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition)).exchange() - .expectStatus().isCreated(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId1) + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition)) + .exchange() + .expectStatus() + .isCreated(); RouteDefinition testRouteDefinition2 = new RouteDefinition(); testRouteDefinition2.setUri(URI.create("http://example.org")); @@ -233,37 +300,68 @@ public class GatewayControllerEndpointTests { String group2 = "group-2_" + UUID.randomUUID(); testRouteDefinition2.setMetadata(Map.of("groupBy", group2)); String routeId2 = "route-2_" + UUID.randomUUID(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId2) - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition2)).exchange() - .expectStatus().isCreated(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId2) + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition2)) + .exchange() + .expectStatus() + .isCreated(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group1) - .exchange().expectStatus().isOk(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group2) - .exchange().expectStatus().isOk(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group1) + .exchange() + .expectStatus() + .isOk(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group2) + .exchange() + .expectStatus() + .isOk(); - testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routes").exchange().expectStatus().isOk() - .expectBodyList(Map.class).consumeWith(result -> { - List responseBody = result.getResponseBody(); + testClient.get() + .uri("http://localhost:" + port + "/actuator/gateway/routes") + .exchange() + .expectStatus() + .isOk() + .expectBodyList(Map.class) + .consumeWith(result -> { + List responseBody = result.getResponseBody(); - List ids = responseBody.stream().map(route -> route.get("route_id")) - .filter(id -> id.equals(routeId1) || id.equals(routeId2)).collect(Collectors.toList()); - assertThat(ids).containsExactly(routeId2, routeId1); - }); + List ids = responseBody.stream() + .map(route -> route.get("route_id")) + .filter(id -> id.equals(routeId1) || id.equals(routeId2)) + .collect(Collectors.toList()); + assertThat(ids).containsExactly(routeId2, routeId1); + }); testRouteDefinition2.setOrder(testRouteDefinition.getOrder() + 1); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId2) - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition2)).exchange() - .expectStatus().isCreated(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group2) - .exchange().expectStatus().isOk(); - testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routes").exchange().expectStatus().isOk() - .expectBodyList(Map.class).consumeWith(result -> { - List responseBody = result.getResponseBody(); - List ids = responseBody.stream().map(route -> route.get("route_id")) - .filter(id -> id.equals(routeId1) || id.equals(routeId2)).collect(Collectors.toList()); - assertThat(ids).containsExactly(routeId1, routeId2); - }); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId2) + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition2)) + .exchange() + .expectStatus() + .isCreated(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group2) + .exchange() + .expectStatus() + .isOk(); + testClient.get() + .uri("http://localhost:" + port + "/actuator/gateway/routes") + .exchange() + .expectStatus() + .isOk() + .expectBodyList(Map.class) + .consumeWith(result -> { + List responseBody = result.getResponseBody(); + List ids = responseBody.stream() + .map(route -> route.get("route_id")) + .filter(id -> id.equals(routeId1) || id.equals(routeId2)) + .collect(Collectors.toList()); + assertThat(ids).containsExactly(routeId1, routeId2); + }); } @Test @@ -274,24 +372,42 @@ public class GatewayControllerEndpointTests { testRouteDefinition.setMetadata(Map.of("groupBy", group1)); String routeId1 = "route-1_" + UUID.randomUUID(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId1) - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition)).exchange() - .expectStatus().isCreated(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId1) + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition)) + .exchange() + .expectStatus() + .isCreated(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group1) - .exchange().expectStatus().isOk(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group1) + .exchange() + .expectStatus() + .isOk(); - testClient.delete().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId1).exchange() - .expectStatus().isOk(); + testClient.delete() + .uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId1) + .exchange() + .expectStatus() + .isOk(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group1) - .exchange().expectStatus().isOk(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group1) + .exchange() + .expectStatus() + .isOk(); - testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routes").exchange().expectStatus().isOk() - .expectBodyList(Map.class).consumeWith(result -> { - List responseBody = result.getResponseBody(); - assertThat(responseBody).extracting("route_id").doesNotContain(routeId1); - }); + testClient.get() + .uri("http://localhost:" + port + "/actuator/gateway/routes") + .exchange() + .expectStatus() + .isOk() + .expectBodyList(Map.class) + .consumeWith(result -> { + List responseBody = result.getResponseBody(); + assertThat(responseBody).extracting("route_id").doesNotContain(routeId1); + }); } @Test @@ -303,26 +419,42 @@ public class GatewayControllerEndpointTests { testRouteDefinition.setFilters(List.of(new FilterDefinition("StripPrefix=wrong"))); String routeId1 = UUID.randomUUID().toString(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId1) - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition)).exchange() - .expectStatus().isCreated(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId1) + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition)) + .exchange() + .expectStatus() + .isCreated(); RouteDefinition testRouteDefinition2 = new RouteDefinition(); testRouteDefinition2.setUri(URI.create("http://valid.route")); testRouteDefinition2.setMetadata(Map.of("groupBy", group1)); String routeId2 = UUID.randomUUID().toString(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId2) - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition2)).exchange() - .expectStatus().isCreated(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId2) + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition2)) + .exchange() + .expectStatus() + .isCreated(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group1) - .exchange().expectStatus().isOk(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group1) + .exchange() + .expectStatus() + .isOk(); - testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routes").exchange().expectStatus().isOk() - .expectBodyList(Map.class).consumeWith(result -> { - List responseBody = result.getResponseBody(); - assertThat(responseBody).extracting("route_id").doesNotContain(routeId1, routeId2); - }); + testClient.get() + .uri("http://localhost:" + port + "/actuator/gateway/routes") + .exchange() + .expectStatus() + .isOk() + .expectBodyList(Map.class) + .consumeWith(result -> { + List responseBody = result.getResponseBody(); + assertThat(responseBody).extracting("route_id").doesNotContain(routeId1, routeId2); + }); } @Test @@ -339,12 +471,20 @@ public class GatewayControllerEndpointTests { testRouteDefinition2.setId(routeId2); testRouteDefinition2.setUri(URI.create("http://valid-group-1.route")); testRouteDefinition2.setMetadata(Map.of("groupBy", group1)); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId1) - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition)).exchange() - .expectStatus().isCreated(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId2) - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition2)).exchange() - .expectStatus().isCreated(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId1) + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition)) + .exchange() + .expectStatus() + .isCreated(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId2) + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition2)) + .exchange() + .expectStatus() + .isCreated(); RouteDefinition testRouteDefinition3 = new RouteDefinition(); String routeId3 = UUID.randomUUID().toString(); @@ -357,27 +497,47 @@ public class GatewayControllerEndpointTests { testRouteDefinition4.setId(routeId4); testRouteDefinition4.setUri(URI.create("http://valid-group-2.route")); testRouteDefinition4.setMetadata(Map.of("groupBy", group2)); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId3) - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition3)).exchange() - .expectStatus().isCreated(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId4) - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition4)).exchange() - .expectStatus().isCreated(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId3) + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition3)) + .exchange() + .expectStatus() + .isCreated(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId4) + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition4)) + .exchange() + .expectStatus() + .isCreated(); // When - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group1) - .exchange().expectStatus().isOk(); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group2) - .exchange().expectStatus().isOk(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group1) + .exchange() + .expectStatus() + .isOk(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group2) + .exchange() + .expectStatus() + .isOk(); // Then - testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routes").exchange().expectStatus().isOk() - .expectBodyList(Map.class).consumeWith(result -> { - List responseBody = result.getResponseBody(); - assertThat(responseBody).extracting("route_id").doesNotContain(routeId1, routeId2) - .contains(routeId3, routeId4); + testClient.get() + .uri("http://localhost:" + port + "/actuator/gateway/routes") + .exchange() + .expectStatus() + .isOk() + .expectBodyList(Map.class) + .consumeWith(result -> { + List responseBody = result.getResponseBody(); + assertThat(responseBody).extracting("route_id") + .doesNotContain(routeId1, routeId2) + .contains(routeId3, routeId4); - }); + }); } @Test @@ -390,8 +550,8 @@ public class GatewayControllerEndpointTests { FilterDefinition prefixPathFilterDefinition = new FilterDefinition("PrefixPath=/test-path"); FilterDefinition redirectToFilterDefinition = new FilterDefinition("RemoveResponseHeader=Sensitive-Header"); FilterDefinition testFilterDefinition = new FilterDefinition("TestFilter"); - testRouteDefinition.setFilters( - Arrays.asList(prefixPathFilterDefinition, redirectToFilterDefinition, testFilterDefinition)); + testRouteDefinition + .setFilters(Arrays.asList(prefixPathFilterDefinition, redirectToFilterDefinition, testFilterDefinition)); PredicateDefinition hostRoutePredicateDefinition = new PredicateDefinition("Host=myhost.org"); PredicateDefinition methodRoutePredicateDefinition = new PredicateDefinition("Method=GET"); @@ -407,8 +567,8 @@ public class GatewayControllerEndpointTests { FilterDefinition prefixPathFilterDefinition2 = new FilterDefinition("PrefixPath=/test-path-2"); FilterDefinition redirectToFilterDefinition2 = new FilterDefinition("RemoveResponseHeader=Sensitive-Header-2"); FilterDefinition testFilterDefinition2 = new FilterDefinition("TestFilter"); - testRouteDefinition2.setFilters( - Arrays.asList(prefixPathFilterDefinition2, redirectToFilterDefinition2, testFilterDefinition2)); + testRouteDefinition2 + .setFilters(Arrays.asList(prefixPathFilterDefinition2, redirectToFilterDefinition2, testFilterDefinition2)); PredicateDefinition hostRoutePredicateDefinition2 = new PredicateDefinition("Host=myhost-2.org"); PredicateDefinition methodRoutePredicateDefinition2 = new PredicateDefinition("Method=GET"); @@ -418,12 +578,20 @@ public class GatewayControllerEndpointTests { List multipleRouteDefs = List.of(testRouteDefinition, testRouteDefinition2); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes") - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(multipleRouteDefs)).exchange() - .expectStatus().isOk(); - testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routedefinitions") - .accept(MediaType.APPLICATION_JSON).exchange().expectBody() - .jsonPath("[?(@.id in ['%s','%s'])].id".formatted(routeId1, routeId2)).exists(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes") + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(multipleRouteDefs)) + .exchange() + .expectStatus() + .isOk(); + testClient.get() + .uri("http://localhost:" + port + "/actuator/gateway/routedefinitions") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectBody() + .jsonPath("[?(@.id in ['%s','%s'])].id".formatted(routeId1, routeId2)) + .exists(); } @Test @@ -437,8 +605,8 @@ public class GatewayControllerEndpointTests { FilterDefinition prefixPathFilterDefinition = new FilterDefinition("PrefixPath=/test-path"); FilterDefinition redirectToFilterDefinition = new FilterDefinition("RemoveResponseHeader=Sensitive-Header"); FilterDefinition testFilterDefinition = new FilterDefinition("TestFilter"); - testRouteDefinition.setFilters( - Arrays.asList(prefixPathFilterDefinition, redirectToFilterDefinition, testFilterDefinition)); + testRouteDefinition + .setFilters(Arrays.asList(prefixPathFilterDefinition, redirectToFilterDefinition, testFilterDefinition)); PredicateDefinition hostRoutePredicateDefinition = new PredicateDefinition("Host=myhost.org"); PredicateDefinition methodRoutePredicateDefinition = new PredicateDefinition("Method=GET"); @@ -453,20 +621,28 @@ public class GatewayControllerEndpointTests { List multipleRouteDefs = List.of(testRouteDefinition, testRouteDefinition2); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes") - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(multipleRouteDefs)).exchange() - .expectStatus().is4xxClientError(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes") + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(multipleRouteDefs)) + .exchange() + .expectStatus() + .is4xxClientError(); - testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routedefinitions") - .accept(MediaType.APPLICATION_JSON).exchange().expectBody() - .jsonPath("[?(@.id in ['%s','%s'])].id".formatted(routeId1, routeId2)).doesNotExist(); + testClient.get() + .uri("http://localhost:" + port + "/actuator/gateway/routedefinitions") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectBody() + .jsonPath("[?(@.id in ['%s','%s'])].id".formatted(routeId1, routeId2)) + .doesNotExist(); } @Test public void testPostValidShortcutRouteDefinition() { RouteDefinition testRouteDefinition = new RouteDefinition(); - testRouteDefinition.setId( - "gatewaywithgrpcfiltertest-0-104014-8916263311295787431172436062-test-gateway-tls-client-mapping-0"); + testRouteDefinition + .setId("gatewaywithgrpcfiltertest-0-104014-8916263311295787431172436062-test-gateway-tls-client-mapping-0"); testRouteDefinition.setUri(URI.create("https://localhost:8095")); testRouteDefinition.setOrder(0); testRouteDefinition.setMetadata(Collections.emptyMap()); @@ -488,9 +664,13 @@ public class GatewayControllerEndpointTests { hostRoutePredicateDefinition.addArg("_genkey_0", "/json/hello"); testRouteDefinition.setPredicates(Arrays.asList(hostRoutePredicateDefinition)); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/test-route") - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition)).exchange() - .expectStatus().isCreated(); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/test-route") + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition)) + .exchange() + .expectStatus() + .isCreated(); } @Test @@ -502,10 +682,16 @@ public class GatewayControllerEndpointTests { FilterDefinition filterDefinition = new FilterDefinition("NotExistingFilter=test-config"); testRouteDefinition.setFilters(Collections.singletonList(filterDefinition)); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/test-route") - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition)).exchange() - .expectStatus().isBadRequest().expectBody().jsonPath("$.message") - .isEqualTo("Invalid FilterDefinition: [NotExistingFilter]"); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/test-route") + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition)) + .exchange() + .expectStatus() + .isBadRequest() + .expectBody() + .jsonPath("$.message") + .isEqualTo("Invalid FilterDefinition: [NotExistingFilter]"); } @Test @@ -514,10 +700,16 @@ public class GatewayControllerEndpointTests { RouteDefinition testRouteDefinition = new RouteDefinition(); testRouteDefinition.setUri(URI.create("example.org")); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/no-scheme-test-route") - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition)).exchange() - .expectStatus().isBadRequest().expectBody().jsonPath("$.message") - .isEqualTo("The URI format [example.org] is incorrect, scheme can not be empty"); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/no-scheme-test-route") + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition)) + .exchange() + .expectStatus() + .isBadRequest() + .expectBody() + .jsonPath("$.message") + .isEqualTo("The URI format [example.org] is incorrect, scheme can not be empty"); } @Test @@ -526,9 +718,16 @@ public class GatewayControllerEndpointTests { RouteDefinition testRouteDefinition = new RouteDefinition(); testRouteDefinition.setUri(null); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/no-scheme-test-route") - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition)).exchange() - .expectStatus().isBadRequest().expectBody().jsonPath("$.message").isEqualTo("The URI can not be empty"); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/no-scheme-test-route") + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition)) + .exchange() + .expectStatus() + .isBadRequest() + .expectBody() + .jsonPath("$.message") + .isEqualTo("The URI can not be empty"); } @Test @@ -540,10 +739,16 @@ public class GatewayControllerEndpointTests { PredicateDefinition predicateDefinition = new PredicateDefinition("NotExistingPredicate=test-config"); testRouteDefinition.setPredicates(Collections.singletonList(predicateDefinition)); - testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/test-route") - .accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition)).exchange() - .expectStatus().isBadRequest().expectBody().jsonPath("$.message") - .isEqualTo("Invalid PredicateDefinition: [NotExistingPredicate]"); + testClient.post() + .uri("http://localhost:" + port + "/actuator/gateway/routes/test-route") + .accept(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(testRouteDefinition)) + .exchange() + .expectStatus() + .isBadRequest() + .expectBody() + .jsonPath("$.message") + .isEqualTo("Invalid PredicateDefinition: [NotExistingPredicate]"); } @SpringBootConfiguration @@ -554,7 +759,8 @@ public class GatewayControllerEndpointTests { @Bean RouteLocator testRouteLocator(RouteLocatorBuilder routeLocatorBuilder) { return routeLocatorBuilder.routes() - .route("test-service", r -> r.path("/test-service/**").uri("lb://test-service")).build(); + .route("test-service", r -> r.path("/test-service/**").uri("lb://test-service")) + .build(); } @Bean diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/ConfigurableHintsRegistrationProcessorTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/ConfigurableHintsRegistrationProcessorTests.java index 5d5cfaff..f43a2d6d 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/ConfigurableHintsRegistrationProcessorTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/ConfigurableHintsRegistrationProcessorTests.java @@ -58,7 +58,8 @@ class ConfigurableHintsRegistrationProcessorTests { @Test void shouldRegisterReflectionHintsForTypeAndSuperTypesAndGenerics() { BeanDefinition beanDefinition = BeanDefinitionBuilder - .rootBeanDefinition(SpringCloudCircuitBreakerResilience4JFilterFactory.class).getBeanDefinition(); + .rootBeanDefinition(SpringCloudCircuitBreakerResilience4JFilterFactory.class) + .getBeanDefinition(); beanFactory.registerBeanDefinition("test", beanDefinition); BeanFactoryInitializationAotContribution contribution = processor.processAheadOfTime(beanFactory); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java index 73f80152..c85a1969 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java @@ -77,7 +77,7 @@ public class GatewayAutoConfigurationTests { try (ConfigurableApplicationContext ctx = SpringApplication.run(Config.class, "--spring.jmx.enabled=false", "--server.port=0")) { assertThat(ctx.getEnvironment().getProperty("spring.webflux.hiddenmethod.filter.enabled")) - .isEqualTo("false"); + .isEqualTo("false"); assertThat(ctx.getBeanNamesForType(HiddenHttpMethodFilter.class)).isEmpty(); } } @@ -85,83 +85,83 @@ public class GatewayAutoConfigurationTests { @Test public void nettyHttpClientDefaults() { new ReactiveWebApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class, MetricsAutoConfiguration.class, - SimpleMetricsExportAutoConfiguration.class, GatewayAutoConfiguration.class, - ServerPropertiesConfig.class)) - .withPropertyValues("debug=true").run(context -> { - assertThat(context).hasSingleBean(HttpClient.class); - HttpClient httpClient = context.getBean(HttpClient.class); - CustomHttpClientFactory factory = context.getBean(CustomHttpClientFactory.class); + .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class, MetricsAutoConfiguration.class, + SimpleMetricsExportAutoConfiguration.class, GatewayAutoConfiguration.class, + ServerPropertiesConfig.class)) + .withPropertyValues("debug=true") + .run(context -> { + assertThat(context).hasSingleBean(HttpClient.class); + HttpClient httpClient = context.getBean(HttpClient.class); + CustomHttpClientFactory factory = context.getBean(CustomHttpClientFactory.class); - assertThat(factory.connectionProvider).isNotNull(); - assertThat(factory.connectionProvider.maxConnections()).isEqualTo(Integer.MAX_VALUE); // elastic + assertThat(factory.connectionProvider).isNotNull(); + assertThat(factory.connectionProvider.maxConnections()).isEqualTo(Integer.MAX_VALUE); // elastic - assertThat(factory.proxyProvider).isNull(); - assertThat(factory.isSslConfigured()).isFalse(); + assertThat(factory.proxyProvider).isNull(); + assertThat(factory.isSslConfigured()).isFalse(); - assertThat(httpClient.configuration().isAcceptGzip()).isFalse(); - assertThat(httpClient.configuration().loggingHandler()).isNull(); - assertThat(httpClient.configuration().options()) - .doesNotContainKey(ChannelOption.CONNECT_TIMEOUT_MILLIS); - }); + assertThat(httpClient.configuration().isAcceptGzip()).isFalse(); + assertThat(httpClient.configuration().loggingHandler()).isNull(); + assertThat(httpClient.configuration().options()) + .doesNotContainKey(ChannelOption.CONNECT_TIMEOUT_MILLIS); + }); } @Test public void nettyHttpClientConfigured() { new ReactiveWebApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class, MetricsAutoConfiguration.class, - SimpleMetricsExportAutoConfiguration.class, GatewayAutoConfiguration.class, - HttpClientCustomizedConfig.class, ServerPropertiesConfig.class)) - .withPropertyValues("spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager=true", - "spring.cloud.gateway.httpclient.connect-timeout=10", - "spring.cloud.gateway.httpclient.response-timeout=10s", - "spring.cloud.gateway.httpclient.pool.eviction-interval=10s", - "spring.cloud.gateway.httpclient.pool.type=fixed", - "spring.cloud.gateway.httpclient.pool.metrics=true", - "spring.cloud.gateway.httpclient.compression=true", - "spring.cloud.gateway.httpclient.wiretap=true", - // greater than integer max value - "spring.cloud.gateway.httpclient.max-initial-line-length=2147483647", - "spring.cloud.gateway.httpclient.proxy.host=myhost", - "spring.cloud.gateway.httpclient.websocket.max-frame-payload-length=1024") - .run(context -> { - assertThat(context).hasSingleBean(HttpClient.class); - HttpClient httpClient = context.getBean(HttpClient.class); - CustomHttpClientFactory factory = context.getBean(CustomHttpClientFactory.class); - HttpClientProperties properties = context.getBean(HttpClientProperties.class); - assertThat(properties.getMaxInitialLineLength().toBytes()).isLessThanOrEqualTo(Integer.MAX_VALUE); - assertThat(properties.isCompression()).isEqualTo(true); - assertThat(properties.getPool().getEvictionInterval()).hasSeconds(10); - assertThat(properties.getPool().isMetrics()).isEqualTo(true); + .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class, MetricsAutoConfiguration.class, + SimpleMetricsExportAutoConfiguration.class, GatewayAutoConfiguration.class, + HttpClientCustomizedConfig.class, ServerPropertiesConfig.class)) + .withPropertyValues("spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager=true", + "spring.cloud.gateway.httpclient.connect-timeout=10", + "spring.cloud.gateway.httpclient.response-timeout=10s", + "spring.cloud.gateway.httpclient.pool.eviction-interval=10s", + "spring.cloud.gateway.httpclient.pool.type=fixed", + "spring.cloud.gateway.httpclient.pool.metrics=true", + "spring.cloud.gateway.httpclient.compression=true", "spring.cloud.gateway.httpclient.wiretap=true", + // greater than integer max value + "spring.cloud.gateway.httpclient.max-initial-line-length=2147483647", + "spring.cloud.gateway.httpclient.proxy.host=myhost", + "spring.cloud.gateway.httpclient.websocket.max-frame-payload-length=1024") + .run(context -> { + assertThat(context).hasSingleBean(HttpClient.class); + HttpClient httpClient = context.getBean(HttpClient.class); + CustomHttpClientFactory factory = context.getBean(CustomHttpClientFactory.class); + HttpClientProperties properties = context.getBean(HttpClientProperties.class); + assertThat(properties.getMaxInitialLineLength().toBytes()).isLessThanOrEqualTo(Integer.MAX_VALUE); + assertThat(properties.isCompression()).isEqualTo(true); + assertThat(properties.getPool().getEvictionInterval()).hasSeconds(10); + assertThat(properties.getPool().isMetrics()).isEqualTo(true); - assertThat(httpClient.configuration().isAcceptGzip()).isTrue(); - assertThat(httpClient.configuration().loggingHandler()).isNotNull(); - assertThat(httpClient.configuration().options()).containsKey(ChannelOption.CONNECT_TIMEOUT_MILLIS); - assertThat(httpClient.configuration().options().get(ChannelOption.CONNECT_TIMEOUT_MILLIS)) - .isEqualTo(10); + assertThat(httpClient.configuration().isAcceptGzip()).isTrue(); + assertThat(httpClient.configuration().loggingHandler()).isNotNull(); + assertThat(httpClient.configuration().options()).containsKey(ChannelOption.CONNECT_TIMEOUT_MILLIS); + assertThat(httpClient.configuration().options().get(ChannelOption.CONNECT_TIMEOUT_MILLIS)) + .isEqualTo(10); - assertThat(factory.connectionProvider).isNotNull(); - // fixed pool - assertThat(factory.connectionProvider.maxConnections()) - .isEqualTo(ConnectionProvider.DEFAULT_POOL_MAX_CONNECTIONS); + assertThat(factory.connectionProvider).isNotNull(); + // fixed pool + assertThat(factory.connectionProvider.maxConnections()) + .isEqualTo(ConnectionProvider.DEFAULT_POOL_MAX_CONNECTIONS); - assertThat(factory.proxyProvider).isNotNull(); - assertThat(factory.proxyProvider.build().getAddress().get().getHostName()).isEqualTo("myhost"); + assertThat(factory.proxyProvider).isNotNull(); + assertThat(factory.proxyProvider.build().getAddress().get().getHostName()).isEqualTo("myhost"); - assertThat(factory.isSslConfigured()).isTrue(); - assertThat(factory.isInsecureTrustManagerSet()).isTrue(); + assertThat(factory.isSslConfigured()).isTrue(); + assertThat(factory.isInsecureTrustManagerSet()).isTrue(); - assertThat(context).hasSingleBean(ReactorNettyRequestUpgradeStrategy.class); - ReactorNettyRequestUpgradeStrategy upgradeStrategy = context - .getBean(ReactorNettyRequestUpgradeStrategy.class); - assertThat(upgradeStrategy.getWebsocketServerSpec().maxFramePayloadLength()).isEqualTo(1024); - assertThat(upgradeStrategy.getWebsocketServerSpec().handlePing()).isTrue(); - assertThat(context).hasSingleBean(ReactorNettyWebSocketClient.class); - ReactorNettyWebSocketClient webSocketClient = context.getBean(ReactorNettyWebSocketClient.class); - assertThat(webSocketClient.getWebsocketClientSpec().maxFramePayloadLength()).isEqualTo(1024); - HttpClientCustomizedConfig config = context.getBean(HttpClientCustomizedConfig.class); - assertThat(config.called.get()).isTrue(); - }); + assertThat(context).hasSingleBean(ReactorNettyRequestUpgradeStrategy.class); + ReactorNettyRequestUpgradeStrategy upgradeStrategy = context + .getBean(ReactorNettyRequestUpgradeStrategy.class); + assertThat(upgradeStrategy.getWebsocketServerSpec().maxFramePayloadLength()).isEqualTo(1024); + assertThat(upgradeStrategy.getWebsocketServerSpec().handlePing()).isTrue(); + assertThat(context).hasSingleBean(ReactorNettyWebSocketClient.class); + ReactorNettyWebSocketClient webSocketClient = context.getBean(ReactorNettyWebSocketClient.class); + assertThat(webSocketClient.getWebsocketClientSpec().maxFramePayloadLength()).isEqualTo(1024); + HttpClientCustomizedConfig config = context.getBean(HttpClientCustomizedConfig.class); + assertThat(config.called.get()).isTrue(); + }); } @Test @@ -185,39 +185,39 @@ public class GatewayAutoConfigurationTests { @Test public void tokenRelayBeansAreCreated() { new ReactiveWebApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(ReactiveSecurityAutoConfiguration.class, - ReactiveOAuth2ClientAutoConfiguration.class, GatewayReactiveOAuth2AutoConfiguration.class, - GatewayAutoConfiguration.TokenRelayConfiguration.class)) - .withPropertyValues( - "spring.security.oauth2.client.provider[testprovider].authorization-uri=http://localhost", - "spring.security.oauth2.client.provider[testprovider].token-uri=http://localhost/token", - "spring.security.oauth2.client.registration[test].provider=testprovider", - "spring.security.oauth2.client.registration[test].authorization-grant-type=authorization_code", - "spring.security.oauth2.client.registration[test].redirect-uri=http://localhost/redirect", - "spring.security.oauth2.client.registration[test].client-id=login-client") - .run(context -> { - assertThat(context).hasSingleBean(ReactiveOAuth2AuthorizedClientManager.class); - assertThat(context).hasSingleBean(TokenRelayGatewayFilterFactory.class); - }); + .withConfiguration(AutoConfigurations.of(ReactiveSecurityAutoConfiguration.class, + ReactiveOAuth2ClientAutoConfiguration.class, GatewayReactiveOAuth2AutoConfiguration.class, + GatewayAutoConfiguration.TokenRelayConfiguration.class)) + .withPropertyValues( + "spring.security.oauth2.client.provider[testprovider].authorization-uri=http://localhost", + "spring.security.oauth2.client.provider[testprovider].token-uri=http://localhost/token", + "spring.security.oauth2.client.registration[test].provider=testprovider", + "spring.security.oauth2.client.registration[test].authorization-grant-type=authorization_code", + "spring.security.oauth2.client.registration[test].redirect-uri=http://localhost/redirect", + "spring.security.oauth2.client.registration[test].client-id=login-client") + .run(context -> { + assertThat(context).hasSingleBean(ReactiveOAuth2AuthorizedClientManager.class); + assertThat(context).hasSingleBean(TokenRelayGatewayFilterFactory.class); + }); } @Test public void gatewayReactiveOAuth2AuthorizedClientManagerBacksOffForCustomBean() { new ReactiveWebApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(ReactiveSecurityAutoConfiguration.class, - ReactiveOAuth2ClientAutoConfiguration.class, GatewayReactiveOAuth2AutoConfiguration.class)) - .withUserConfiguration(TestReactiveOAuth2AuthorizedClientManagerConfig.class) - .withPropertyValues( - "spring.security.oauth2.client.provider[testprovider].authorization-uri=http://localhost", - "spring.security.oauth2.client.provider[testprovider].token-uri=http://localhost/token", - "spring.security.oauth2.client.registration[test].provider=testprovider", - "spring.security.oauth2.client.registration[test].authorization-grant-type=authorization_code", - "spring.security.oauth2.client.registration[test].redirect-uri=http://localhost/redirect", - "spring.security.oauth2.client.registration[test].client-id=login-client") - .run(context -> { - assertThat(context).hasSingleBean(ReactiveOAuth2AuthorizedClientManager.class); - assertThat(context).hasBean("myReactiveOAuth2AuthorizedClientManager"); - }); + .withConfiguration(AutoConfigurations.of(ReactiveSecurityAutoConfiguration.class, + ReactiveOAuth2ClientAutoConfiguration.class, GatewayReactiveOAuth2AutoConfiguration.class)) + .withUserConfiguration(TestReactiveOAuth2AuthorizedClientManagerConfig.class) + .withPropertyValues( + "spring.security.oauth2.client.provider[testprovider].authorization-uri=http://localhost", + "spring.security.oauth2.client.provider[testprovider].token-uri=http://localhost/token", + "spring.security.oauth2.client.registration[test].provider=testprovider", + "spring.security.oauth2.client.registration[test].authorization-grant-type=authorization_code", + "spring.security.oauth2.client.registration[test].redirect-uri=http://localhost/redirect", + "spring.security.oauth2.client.registration[test].client-id=login-client") + .run(context -> { + assertThat(context).hasSingleBean(ReactiveOAuth2AuthorizedClientManager.class); + assertThat(context).hasBean("myReactiveOAuth2AuthorizedClientManager"); + }); } @Test @@ -235,14 +235,14 @@ public class GatewayAutoConfigurationTests { assertThat(ctx.getBeanNamesForType(GatewayLegacyControllerEndpoint.class)).hasSize(1); } }).hasRootCauseInstanceOf(IllegalStateException.class) - .hasMessageContaining("No TokenRelayGatewayFilterFactory bean was found. Did you include"); + .hasMessageContaining("No TokenRelayGatewayFilterFactory bean was found. Did you include"); } @Test // gh-2159 public void reactorNettyRequestUpgradeStrategyWebSocketSpecBuilderIsUniquePerRequest() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { ReactorNettyRequestUpgradeStrategy strategy = new GatewayAutoConfiguration.NettyConfiguration() - .reactorNettyRequestUpgradeStrategy(new HttpClientProperties()); + .reactorNettyRequestUpgradeStrategy(new HttpClientProperties()); // Method "buildSpec" was introduced for Tests, but has only default visiblity Method buildSpec = ReactorNettyRequestUpgradeStrategy.class.getDeclaredMethod("buildSpec", String.class); @@ -258,7 +258,7 @@ public class GatewayAutoConfigurationTests { public void webSocketClientSpecBuilderIsUniquePerReactorNettyWebSocketClient() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { ReactorNettyWebSocketClient websocketClient = new GatewayAutoConfiguration.NettyConfiguration() - .reactorNettyWebSocketClient(new HttpClientProperties(), HttpClient.create()); + .reactorNettyWebSocketClient(new HttpClientProperties(), HttpClient.create()); // Method "buildSpec" has only private visibility Method buildSpec = ReactorNettyWebSocketClient.class.getDeclaredMethod("buildSpec", String.class); @@ -274,53 +274,56 @@ public class GatewayAutoConfigurationTests { @Test public void gRPCFiltersConfiguredWhenHTTP2Enabled() { new ReactiveWebApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class, MetricsAutoConfiguration.class, - SimpleMetricsExportAutoConfiguration.class, GatewayAutoConfiguration.class, - HttpClientCustomizedConfig.class, ServerPropertiesConfig.class)) - .withPropertyValues("server.http2.enabled=true").run(context -> { - assertThat(context).hasSingleBean(GRPCRequestHeadersFilter.class); - assertThat(context).hasSingleBean(GRPCResponseHeadersFilter.class); - HttpClient httpClient = context.getBean(HttpClient.class); - assertThat(httpClient.configuration().protocols()).contains(HttpProtocol.HTTP11, HttpProtocol.H2); - }); + .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class, MetricsAutoConfiguration.class, + SimpleMetricsExportAutoConfiguration.class, GatewayAutoConfiguration.class, + HttpClientCustomizedConfig.class, ServerPropertiesConfig.class)) + .withPropertyValues("server.http2.enabled=true") + .run(context -> { + assertThat(context).hasSingleBean(GRPCRequestHeadersFilter.class); + assertThat(context).hasSingleBean(GRPCResponseHeadersFilter.class); + HttpClient httpClient = context.getBean(HttpClient.class); + assertThat(httpClient.configuration().protocols()).contains(HttpProtocol.HTTP11, HttpProtocol.H2); + }); } @Test public void gRPCFiltersNotConfiguredWhenHTTP2Disabled() { new ReactiveWebApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class, MetricsAutoConfiguration.class, - SimpleMetricsExportAutoConfiguration.class, GatewayAutoConfiguration.class, - HttpClientCustomizedConfig.class, ServerPropertiesConfig.class)) - .withPropertyValues("server.http2.enabled=false").run(context -> { - assertThat(context).doesNotHaveBean(GRPCRequestHeadersFilter.class); - assertThat(context).doesNotHaveBean(GRPCResponseHeadersFilter.class); - }); + .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class, MetricsAutoConfiguration.class, + SimpleMetricsExportAutoConfiguration.class, GatewayAutoConfiguration.class, + HttpClientCustomizedConfig.class, ServerPropertiesConfig.class)) + .withPropertyValues("server.http2.enabled=false") + .run(context -> { + assertThat(context).doesNotHaveBean(GRPCRequestHeadersFilter.class); + assertThat(context).doesNotHaveBean(GRPCResponseHeadersFilter.class); + }); } @Test public void insecureTrustManagerNotEnabledByDefaultWhenHTTP2Enabled() { new ReactiveWebApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class, MetricsAutoConfiguration.class, - SimpleMetricsExportAutoConfiguration.class, GatewayAutoConfiguration.class, - HttpClientCustomizedConfig.class, ServerPropertiesConfig.class)) - .withPropertyValues("server.http2.enabled=true").run(context -> { - assertThat(context).hasSingleBean(HttpClient.class); - CustomHttpClientFactory factory = context.getBean(CustomHttpClientFactory.class); - assertThat(factory.isInsecureTrustManagerSet()).isFalse(); - }); + .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class, MetricsAutoConfiguration.class, + SimpleMetricsExportAutoConfiguration.class, GatewayAutoConfiguration.class, + HttpClientCustomizedConfig.class, ServerPropertiesConfig.class)) + .withPropertyValues("server.http2.enabled=true") + .run(context -> { + assertThat(context).hasSingleBean(HttpClient.class); + CustomHttpClientFactory factory = context.getBean(CustomHttpClientFactory.class); + assertThat(factory.isInsecureTrustManagerSet()).isFalse(); + }); } @Test public void customHttpClientWorks() { new ReactiveWebApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class, MetricsAutoConfiguration.class, - SimpleMetricsExportAutoConfiguration.class, GatewayAutoConfiguration.class, - HttpClientCustomizedConfig.class, CustomHttpClientConfig.class)) - .run(context -> { - assertThat(context).hasSingleBean(HttpClient.class); - HttpClient httpClient = context.getBean(HttpClient.class); - assertThat(httpClient).isInstanceOf(CustomHttpClient.class); - }); + .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class, MetricsAutoConfiguration.class, + SimpleMetricsExportAutoConfiguration.class, GatewayAutoConfiguration.class, + HttpClientCustomizedConfig.class, CustomHttpClientConfig.class)) + .run(context -> { + assertThat(context).hasSingleBean(HttpClient.class); + HttpClient httpClient = context.getBean(HttpClient.class); + assertThat(httpClient).isInstanceOf(CustomHttpClient.class); + }); } @Configuration @@ -447,8 +450,8 @@ public class GatewayAutoConfigurationTests { @Bean public RouteLocator myRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("test", r -> r.alwaysTrue().filters(GatewayFilterSpec::tokenRelay).uri("http://localhost")) - .build(); + .route("test", r -> r.alwaysTrue().filters(GatewayFilterSpec::tokenRelay).uri("http://localhost")) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayMetricsAutoConfigurationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayMetricsAutoConfigurationTests.java index d328873e..d8e71d86 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayMetricsAutoConfigurationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayMetricsAutoConfigurationTests.java @@ -119,14 +119,14 @@ public class GatewayMetricsAutoConfigurationTests { @Test public void observabilityBeansMissing() { assertThat(beanFactory.getBeanProvider(ObservedRequestHttpHeadersFilter.class).getIfAvailable(() -> null)) - .isNull(); + .isNull(); assertThat(beanFactory.getBeanProvider(ObservedResponseHttpHeadersFilter.class).getIfAvailable(() -> null)) - .isNull(); + .isNull(); assertThat( beanFactory.getBeanProvider(ObservationClosingWebExceptionHandler.class).getIfAvailable(() -> null)) - .isNull(); + .isNull(); assertThat(beanFactory.getBeanProvider(GatewayPropagatingSenderTracingObservationHandler.class) - .getIfAvailable(() -> null)).isNull(); + .getIfAvailable(() -> null)).isNull(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/LocalResponseCacheAutoConfigurationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/LocalResponseCacheAutoConfigurationTests.java index f0ca6a3a..e0aee8cf 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/LocalResponseCacheAutoConfigurationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/LocalResponseCacheAutoConfigurationTests.java @@ -32,23 +32,25 @@ public class LocalResponseCacheAutoConfigurationTests { @Test void onlyOneCacheManagerBeanCreated() { new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(LocalResponseCacheAutoConfiguration.class)) - .withPropertyValues("spring.cloud.gateway.filter.local-response-cache.enabled=true").run(context -> { - context.containsBean(LocalResponseCacheAutoConfiguration.RESPONSE_CACHE_MANAGER_NAME); - context.assertThat().hasSingleBean(GlobalLocalResponseCacheGatewayFilter.class); - }); + .withConfiguration(AutoConfigurations.of(LocalResponseCacheAutoConfiguration.class)) + .withPropertyValues("spring.cloud.gateway.filter.local-response-cache.enabled=true") + .run(context -> { + context.containsBean(LocalResponseCacheAutoConfiguration.RESPONSE_CACHE_MANAGER_NAME); + context.assertThat().hasSingleBean(GlobalLocalResponseCacheGatewayFilter.class); + }); } @Test void twoCacheManagerBeans() { new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(CustomCacheManagerConfig.class, - LocalResponseCacheAutoConfiguration.class)) - .withPropertyValues("spring.cloud.gateway.filter.local-response-cache.enabled=true").run(context -> { - context.containsBean(LocalResponseCacheAutoConfiguration.RESPONSE_CACHE_MANAGER_NAME); - context.containsBean("myCacheManager"); - context.assertThat().hasSingleBean(GlobalLocalResponseCacheGatewayFilter.class); - }); + .withConfiguration( + AutoConfigurations.of(CustomCacheManagerConfig.class, LocalResponseCacheAutoConfiguration.class)) + .withPropertyValues("spring.cloud.gateway.filter.local-response-cache.enabled=true") + .run(context -> { + context.containsBean(LocalResponseCacheAutoConfiguration.RESPONSE_CACHE_MANAGER_NAME); + context.containsBean("myCacheManager"); + context.assertThat().hasSingleBean(GlobalLocalResponseCacheGatewayFilter.class); + }); } @Configuration(proxyBeanMethods = false) diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInFiltersTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInFiltersTests.java index 23eba91d..2669059d 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInFiltersTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInFiltersTests.java @@ -67,8 +67,9 @@ public class DisableBuiltInFiltersTests { @Test public void shouldInjectOnlyEnabledBuiltInFilters() { assertThat(gatewayFilters).hasSizeGreaterThan(0); - assertThat(gatewayFilters).allSatisfy(filter -> assertThat(filter).isNotInstanceOfAny( - AddRequestHeaderGatewayFilterFactory.class, MapRequestHeaderGatewayFilterFactory.class)); + assertThat(gatewayFilters) + .allSatisfy(filter -> assertThat(filter).isNotInstanceOfAny(AddRequestHeaderGatewayFilterFactory.class, + MapRequestHeaderGatewayFilterFactory.class)); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInGlobalFiltersTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInGlobalFiltersTests.java index edd1afa9..73e389e5 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInGlobalFiltersTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInGlobalFiltersTests.java @@ -68,7 +68,7 @@ public class DisableBuiltInGlobalFiltersTests { public void shouldInjectOnlyEnabledBuiltInFilters() { assertThat(globalFilters).hasSizeGreaterThan(0); assertThat(globalFilters).allSatisfy(filter -> assertThat(filter) - .isNotInstanceOfAny(RemoveCachedBodyFilter.class, RouteToRequestUrlFilter.class)); + .isNotInstanceOfAny(RemoveCachedBodyFilter.class, RouteToRequestUrlFilter.class)); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInPredicatesTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInPredicatesTests.java index eeff65c8..e5871bd9 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInPredicatesTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInPredicatesTests.java @@ -68,7 +68,7 @@ public class DisableBuiltInPredicatesTests { public void shouldInjectOnlyEnabledBuiltInPredicates() { assertThat(predicates).hasSizeGreaterThan(0); assertThat(predicates).allSatisfy(filter -> assertThat(filter) - .isNotInstanceOfAny(AfterRoutePredicateFactory.class, BeforeRoutePredicateFactory.class)); + .isNotInstanceOfAny(AfterRoutePredicateFactory.class, BeforeRoutePredicateFactory.class)); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledComponentTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledComponentTests.java index 6ec1054a..0bc62eeb 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledComponentTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledComponentTests.java @@ -73,7 +73,7 @@ class OnEnabledComponentTests { private AnnotatedTypeMetadata mockMetaData(Class value) { AnnotatedTypeMetadata metadata = mock(AnnotatedTypeMetadata.class); when(metadata.getAnnotationAttributes(eq(ConditionalOnEnabledFilter.class.getName()))) - .thenReturn(Collections.singletonMap("value", value)); + .thenReturn(Collections.singletonMap("value", value)); return metadata; } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledFilterTests.java index 3b1e2e8b..053c61f0 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledFilterTests.java @@ -49,11 +49,15 @@ class OnEnabledFilterTests { FallbackHeadersGatewayFilterFactory.class, MapRequestHeaderGatewayFilterFactory.class, SpringCloudCircuitBreakerResilience4JFilterFactory.class); - List resultNames = predicates.stream().map(onEnabledFilter::normalizeComponentName) - .collect(Collectors.toList()); + List resultNames = predicates.stream() + .map(onEnabledFilter::normalizeComponentName) + .collect(Collectors.toList()); - List expectedNames = Stream.of("add-request-header", "dedupe-response-header", "fallback-headers", - "map-request-header", "circuit-breaker").map(s -> "filter." + s).collect(Collectors.toList()); + List expectedNames = Stream + .of("add-request-header", "dedupe-response-header", "fallback-headers", "map-request-header", + "circuit-breaker") + .map(s -> "filter." + s) + .collect(Collectors.toList()); assertThat(resultNames).isEqualTo(expectedNames); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledGlobalFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledGlobalFilterTests.java index 3c7bd025..714c959c 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledGlobalFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledGlobalFilterTests.java @@ -45,11 +45,13 @@ class OnEnabledGlobalFilterTests { List> predicates = Arrays.asList(ForwardPathFilter.class, AdaptCachedBodyGlobalFilter.class, WebsocketRoutingFilter.class); - List resultNames = predicates.stream().map(onEnabledGlobalFilter::normalizeComponentName) - .collect(Collectors.toList()); + List resultNames = predicates.stream() + .map(onEnabledGlobalFilter::normalizeComponentName) + .collect(Collectors.toList()); List expectedNames = Stream.of("forward-path", "adapt-cached-body", "websocket-routing") - .map(s -> "global-filter." + s).collect(Collectors.toList()); + .map(s -> "global-filter." + s) + .collect(Collectors.toList()); assertThat(resultNames).isEqualTo(expectedNames); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledPredicateTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledPredicateTests.java index 2d3e5591..3cb18745 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledPredicateTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/OnEnabledPredicateTests.java @@ -47,11 +47,13 @@ class OnEnabledPredicateTests { CloudFoundryRouteServiceRoutePredicateFactory.class, ReadBodyRoutePredicateFactory.class, RemoteAddrRoutePredicateFactory.class); - List resultNames = predicates.stream().map(onEnabledPredicate::normalizeComponentName) - .collect(Collectors.toList()); + List resultNames = predicates.stream() + .map(onEnabledPredicate::normalizeComponentName) + .collect(Collectors.toList()); List expectedNames = Stream.of("after", "cloud-foundry-route-service", "read-body", "remote-addr") - .map(s -> "predicate." + s).collect(Collectors.toList()); + .map(s -> "predicate." + s) + .collect(Collectors.toList()); assertThat(resultNames).isEqualTo(expectedNames); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/cors/CorsGlobalTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/cors/CorsGlobalTests.java index bfa44b94..f4e2f791 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/cors/CorsGlobalTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/cors/CorsGlobalTests.java @@ -46,28 +46,39 @@ public class CorsGlobalTests extends BaseWebClientTests { @Test public void testPreFlightCorsRequest() { - ClientResponse clientResponse = webClient.options().uri("/abc/123/function").header("Origin", "domain.com") - .header("Access-Control-Request-Method", "GET").exchangeToMono(Mono::just).block(); + ClientResponse clientResponse = webClient.options() + .uri("/abc/123/function") + .header("Origin", "domain.com") + .header("Access-Control-Request-Method", "GET") + .exchangeToMono(Mono::just) + .block(); HttpHeaders asHttpHeaders = clientResponse.headers().asHttpHeaders(); Mono bodyToMono = clientResponse.bodyToMono(String.class); // pre-flight request shouldn't return the response body assertThat(bodyToMono.block()).isNull(); assertThat(asHttpHeaders.getAccessControlAllowOrigin()) - .as("Missing header value in response: " + HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN).isEqualTo("*"); + .as("Missing header value in response: " + HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN) + .isEqualTo("*"); assertThat(asHttpHeaders.getAccessControlAllowMethods()) - .as("Missing header value in response: " + HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS) - .isEqualTo(Arrays.asList(new HttpMethod[] { HttpMethod.GET })); + .as("Missing header value in response: " + HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS) + .isEqualTo(Arrays.asList(new HttpMethod[] { HttpMethod.GET })); assertThat(clientResponse.statusCode()).as("Pre Flight call failed.").isEqualTo(HttpStatus.OK); } @Test public void testCorsRequest() { - ResponseEntity response = webClient.get().uri("/abc/123/function").header("Origin", "domain.com") - .header(HttpHeaders.HOST, "www.path.org").retrieve().toEntity(String.class).block(); + ResponseEntity response = webClient.get() + .uri("/abc/123/function") + .header("Origin", "domain.com") + .header(HttpHeaders.HOST, "www.path.org") + .retrieve() + .toEntity(String.class) + .block(); assertThat(response).isNotNull(); assertThat(response.getBody()).isNotNull(); assertThat(response.getHeaders().getAccessControlAllowOrigin()) - .as("Missing header value in response: " + HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN).isEqualTo("*"); + .as("Missing header value in response: " + HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN) + .isEqualTo("*"); assertThat(response.getStatusCode()).as("CORS request failed.").isEqualTo(HttpStatus.OK); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/cors/CorsPerRouteTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/cors/CorsPerRouteTests.java index 5f186903..47b67ef2 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/cors/CorsPerRouteTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/cors/CorsPerRouteTests.java @@ -48,59 +48,79 @@ public class CorsPerRouteTests extends BaseWebClientTests { @Test public void testPreFlightCorsRequest() { - testClient.options().uri("/abc").header("Origin", "domain.com").header("Access-Control-Request-Method", "GET") - .exchange().expectBody(Map.class).consumeWith(result -> { - assertThat(result.getResponseBody()).isNull(); - assertThat(result.getStatus()).isEqualTo(HttpStatus.OK); + testClient.options() + .uri("/abc") + .header("Origin", "domain.com") + .header("Access-Control-Request-Method", "GET") + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + assertThat(result.getResponseBody()).isNull(); + assertThat(result.getStatus()).isEqualTo(HttpStatus.OK); - HttpHeaders responseHeaders = result.getResponseHeaders(); - assertThat(responseHeaders.getAccessControlAllowOrigin()) - .as(missingHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isEqualTo("domain.com"); - assertThat(responseHeaders.getAccessControlAllowMethods()) - .as(missingHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS)) - .containsExactlyInAnyOrder(HttpMethod.GET, HttpMethod.POST); - assertThat(responseHeaders.getAccessControlMaxAge()).as(missingHeader(ACCESS_CONTROL_MAX_AGE)) - .isEqualTo(30L); - assertThat(responseHeaders.getAccessControlAllowCredentials()) - .as(missingHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS)).isEqualTo(true); - }); + HttpHeaders responseHeaders = result.getResponseHeaders(); + assertThat(responseHeaders.getAccessControlAllowOrigin()).as(missingHeader(ACCESS_CONTROL_ALLOW_ORIGIN)) + .isEqualTo("domain.com"); + assertThat(responseHeaders.getAccessControlAllowMethods()) + .as(missingHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS)) + .containsExactlyInAnyOrder(HttpMethod.GET, HttpMethod.POST); + assertThat(responseHeaders.getAccessControlMaxAge()).as(missingHeader(ACCESS_CONTROL_MAX_AGE)) + .isEqualTo(30L); + assertThat(responseHeaders.getAccessControlAllowCredentials()) + .as(missingHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS)) + .isEqualTo(true); + }); } @Test public void testPreFlightCorsRequestJavaConfig() { - testClient.options().uri("/route-test").header("Origin", "another-domain.com") - .header("Host", "www.javaconfhost.org").header("Access-Control-Request-Method", "GET").exchange() - .expectBody(Map.class).consumeWith(result -> { - assertThat(result.getResponseBody()).isNull(); - assertThat(result.getStatus()).isEqualTo(HttpStatus.OK); + testClient.options() + .uri("/route-test") + .header("Origin", "another-domain.com") + .header("Host", "www.javaconfhost.org") + .header("Access-Control-Request-Method", "GET") + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + assertThat(result.getResponseBody()).isNull(); + assertThat(result.getStatus()).isEqualTo(HttpStatus.OK); - HttpHeaders responseHeaders = result.getResponseHeaders(); - assertThat(responseHeaders.getAccessControlAllowOrigin()) - .as(missingHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isEqualTo("another-domain.com"); - assertThat(responseHeaders.getAccessControlAllowMethods()) - .as(missingHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS)) - .containsExactlyInAnyOrder(HttpMethod.GET); - assertThat(responseHeaders.getAccessControlMaxAge()).as(missingHeader(ACCESS_CONTROL_MAX_AGE)) - .isEqualTo(50L); - }); + HttpHeaders responseHeaders = result.getResponseHeaders(); + assertThat(responseHeaders.getAccessControlAllowOrigin()).as(missingHeader(ACCESS_CONTROL_ALLOW_ORIGIN)) + .isEqualTo("another-domain.com"); + assertThat(responseHeaders.getAccessControlAllowMethods()) + .as(missingHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS)) + .containsExactlyInAnyOrder(HttpMethod.GET); + assertThat(responseHeaders.getAccessControlMaxAge()).as(missingHeader(ACCESS_CONTROL_MAX_AGE)) + .isEqualTo(50L); + }); } @Test public void testPreFlightForbiddenCorsRequest() { - testClient.get().uri("/cors").header("Origin", "domain.com").header("Access-Control-Request-Method", "GET") - .exchange().expectBody(Map.class).consumeWith(result -> { - assertThat(result.getResponseBody()).isNull(); - assertThat(result.getStatus()).isEqualTo(HttpStatus.FORBIDDEN); - }); + testClient.get() + .uri("/cors") + .header("Origin", "domain.com") + .header("Access-Control-Request-Method", "GET") + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + assertThat(result.getResponseBody()).isNull(); + assertThat(result.getStatus()).isEqualTo(HttpStatus.FORBIDDEN); + }); } @Test public void testCorsValidatedRequest() { - testClient.get().uri("/cors/status/201").header("Origin", "https://test.com").exchange() - .expectBody(String.class).consumeWith(result -> { - assertThat(result.getResponseBody()).endsWith("201"); - assertThat(result.getStatus()).isEqualTo(HttpStatus.CREATED); - }); + testClient.get() + .uri("/cors/status/201") + .header("Origin", "https://test.com") + .exchange() + .expectBody(String.class) + .consumeWith(result -> { + assertThat(result.getResponseBody()).endsWith("201"); + assertThat(result.getStatus()).isEqualTo(HttpStatus.CREATED); + }); } private String missingHeader(String accessControlAllowOrigin) { @@ -118,13 +138,16 @@ public class CorsPerRouteTests extends BaseWebClientTests { @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("cors_route_java_test", - r -> r.host("*.javaconfhost.org").and().path("/route-test/**") - .filters(f -> f.stripPrefix(1).prefixPath("/httpbin")) - .metadata(Map.of("cors", Map.of("allowedOrigins", "another-domain.com", - "allowedMethods", HttpMethod.GET.name(), "maxAge", 50))) - .uri(uri)) - .build(); + .route("cors_route_java_test", + r -> r.host("*.javaconfhost.org") + .and() + .path("/route-test/**") + .filters(f -> f.stripPrefix(1).prefixPath("/httpbin")) + .metadata(Map.of("cors", + Map.of("allowedOrigins", "another-domain.com", "allowedMethods", + HttpMethod.GET.name(), "maxAge", 50))) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/cors/SimpleUrlHandlerCorsTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/cors/SimpleUrlHandlerCorsTests.java index f87da623..4784fd3f 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/cors/SimpleUrlHandlerCorsTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/cors/SimpleUrlHandlerCorsTests.java @@ -47,28 +47,40 @@ public class SimpleUrlHandlerCorsTests extends BaseWebClientTests { @Test public void testPreFlightCorsRequestNotHandledByGW() { - ResponseEntity response = webClient.options().uri("/abc/123/function").header("Origin", "domain.com") - .header("Access-Control-Request-Method", "GET").retrieve().toEntity(String.class).block(); + ResponseEntity response = webClient.options() + .uri("/abc/123/function") + .header("Origin", "domain.com") + .header("Access-Control-Request-Method", "GET") + .retrieve() + .toEntity(String.class) + .block(); HttpHeaders asHttpHeaders = response.getHeaders(); // pre-flight request shouldn't return the response body assertThat(response.getBody()).isNull(); assertThat(asHttpHeaders.getAccessControlAllowOrigin()) - .as("Missing header value in response: " + HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN).isEqualTo("*"); + .as("Missing header value in response: " + HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN) + .isEqualTo("*"); assertThat(asHttpHeaders.getAccessControlAllowMethods()) - .as("Missing header value in response: " + HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS) - .isEqualTo(List.of(HttpMethod.GET)); + .as("Missing header value in response: " + HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS) + .isEqualTo(List.of(HttpMethod.GET)); assertThat(response.getStatusCode()).as("Pre Flight call failed.").isEqualTo(HttpStatus.OK); } @Test public void testCorsRequestNotHandledByGW() { - ResponseEntity responseEntity = webClient.get().uri("/abc/123/function").header("Origin", "domain.com") - .header(HttpHeaders.HOST, "www.path.org").retrieve() - .onStatus(HttpStatusCode::isError, t -> Mono.empty()).toEntity(String.class).block(); + ResponseEntity responseEntity = webClient.get() + .uri("/abc/123/function") + .header("Origin", "domain.com") + .header(HttpHeaders.HOST, "www.path.org") + .retrieve() + .onStatus(HttpStatusCode::isError, t -> Mono.empty()) + .toEntity(String.class) + .block(); HttpHeaders asHttpHeaders = responseEntity.getHeaders(); assertThat(responseEntity.getBody()).isNotNull(); assertThat(asHttpHeaders.getAccessControlAllowOrigin()) - .as("Missing header value in response: " + HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN).isEqualTo("*"); + .as("Missing header value in response: " + HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN) + .isEqualTo("*"); assertThat(responseEntity.getStatusCode()).as("CORS request failed.").isEqualTo(HttpStatus.NOT_FOUND); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocatorIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocatorIntegrationTests.java index efed18ad..1178515c 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocatorIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocatorIntegrationTests.java @@ -53,8 +53,10 @@ public class DiscoveryClientRouteDefinitionLocatorIntegrationTests { @Test public void newServiceAddsRoute() throws Exception { - List routes = routeLocator.getRoutes().filter(route -> route.getId().startsWith("test__")).collectList() - .block(); + List routes = routeLocator.getRoutes() + .filter(route -> route.getId().startsWith("test__")) + .collectList() + .block(); assertThat(routes).hasSize(1); discoveryClient.multiple(); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocatorTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocatorTests.java index daf352f8..5c1f5a66 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocatorTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocatorTests.java @@ -80,8 +80,9 @@ public class DiscoveryClientRouteDefinitionLocatorTests { assertThat(definition.getFilters()).hasSize(1); FilterDefinition filter = definition.getFilters().get(0); assertThat(filter.getName()).isEqualTo("RewritePath"); - assertThat(filter.getArgs()).hasSize(2).containsEntry(REGEXP_KEY, "/service1/?(?.*)") - .containsEntry(REPLACEMENT_KEY, "/${remaining}"); + assertThat(filter.getArgs()).hasSize(2) + .containsEntry(REGEXP_KEY, "/service1/?(?.*)") + .containsEntry(REPLACEMENT_KEY, "/${remaining}"); RouteDefinition definition2 = definitions.get(1); assertThat(definition2.getId()).isEqualTo("testedge_service3"); @@ -96,8 +97,9 @@ public class DiscoveryClientRouteDefinitionLocatorTests { assertThat(definition.getFilters()).hasSize(1); FilterDefinition filter2 = definition2.getFilters().get(0); assertThat(filter2.getName()).isEqualTo("RewritePath"); - assertThat(filter2.getArgs()).hasSize(2).containsEntry(REGEXP_KEY, "/service3/?(?.*)") - .containsEntry(REPLACEMENT_KEY, "/${remaining}"); + assertThat(filter2.getArgs()).hasSize(2) + .containsEntry(REGEXP_KEY, "/service3/?(?.*)") + .containsEntry(REPLACEMENT_KEY, "/${remaining}"); } @SpringBootConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/discovery/GatewayDiscoveryClientAutoConfigurationTest.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/discovery/GatewayDiscoveryClientAutoConfigurationTest.java index e37051c5..39b8784f 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/discovery/GatewayDiscoveryClientAutoConfigurationTest.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/discovery/GatewayDiscoveryClientAutoConfigurationTest.java @@ -41,7 +41,8 @@ public class GatewayDiscoveryClientAutoConfigurationTest { private static final SpelExpressionParser PARSER = new SpelExpressionParser(); private static final SimpleEvaluationContext CONTEXT = SimpleEvaluationContext.forReadOnlyDataBinding() - .withInstanceMethods().build(); + .withInstanceMethods() + .build(); private static final FilterDefinition DEFAULT_FILTER = GatewayDiscoveryClientAutoConfiguration.initFilters().get(0); @@ -87,7 +88,7 @@ public class GatewayDiscoveryClientAutoConfigurationTest { private String evaluateExpression(String expression) { return Objects - .requireNonNull(PARSER.parseExpression(expression).getValue(CONTEXT, serviceInstance, String.class)); + .requireNonNull(PARSER.parseExpression(expression).getValue(CONTEXT, serviceInstance, String.class)); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilterStaticIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilterStaticIntegrationTests.java index e7adf9b9..46d1bdfa 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilterStaticIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilterStaticIntegrationTests.java @@ -34,10 +34,15 @@ public class ForwardRoutingFilterStaticIntegrationTests extends BaseWebClientTes @Test public void gatewayRequestsMeterFilterHasTags() { - testClient.get().uri("/mydocs").exchange().expectStatus().isOk().expectBody(String.class) - .consumeWith(result -> { - assertThat(result.getResponseBody()).contains("Docs 123"); - }); + testClient.get() + .uri("/mydocs") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .consumeWith(result -> { + assertThat(result.getResponseBody()).contains("Docs 123"); + }); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilterTests.java index cf927f3b..5099290a 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilterTests.java @@ -114,9 +114,9 @@ public class GatewayMetricsFilterTests extends BaseWebClientTests { @Bean public RouteLocator myRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("test_custom_http_status_metrics", - r -> r.host("*.setcustomstatusmetrics.org").filters(f -> f.setStatus(432)).uri(testUri)) - .build(); + .route("test_custom_http_status_metrics", + r -> r.host("*.setcustomstatusmetrics.org").filters(f -> f.setStatus(432)).uri(testUri)) + .build(); } @GetMapping("/httpbin/badtargeturi") diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/LoadBalancerServiceInstanceCookieFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/LoadBalancerServiceInstanceCookieFilterTests.java index 2821afca..5ecef788 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/LoadBalancerServiceInstanceCookieFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/LoadBalancerServiceInstanceCookieFilterTests.java @@ -50,7 +50,7 @@ class LoadBalancerServiceInstanceCookieFilterTests { private final GatewayFilterChain chain = mock(GatewayFilterChain.class); private final ServerWebExchange exchange = MockServerWebExchange - .from(MockServerHttpRequest.get("http://localhost/get").build()); + .from(MockServerHttpRequest.get("http://localhost/get").build()); private final LoadBalancerServiceInstanceCookieFilter filter = new LoadBalancerServiceInstanceCookieFilter( properties); @@ -62,27 +62,30 @@ class LoadBalancerServiceInstanceCookieFilterTests { @Test void shouldAddServiceInstanceCookieHeader() { - exchange.getAttributes().put(GATEWAY_LOADBALANCER_RESPONSE_ATTR, - new DefaultResponse(new DefaultServiceInstance("test-01", "test", "host", 8080, false))); + exchange.getAttributes() + .put(GATEWAY_LOADBALANCER_RESPONSE_ATTR, + new DefaultResponse(new DefaultServiceInstance("test-01", "test", "host", 8080, false))); ServerWebExchange filteredExchange = testFilter(exchange); assertThat(filteredExchange.getRequest().getHeaders().get(HttpHeaders.COOKIE)).hasSize(1); assertThat(filteredExchange.getRequest().getHeaders().get(HttpHeaders.COOKIE)) - .containsExactly("sc-lb-instance-id=test-01"); + .containsExactly("sc-lb-instance-id=test-01"); } @Test void shouldAppendServiceInstanceCookieHeaderIfCookiesPresent() { ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("http://localhost/get") - .cookie(new HttpCookie("testCookieName", "testCookieValue")).build()); - exchange.getAttributes().put(GATEWAY_LOADBALANCER_RESPONSE_ATTR, - new DefaultResponse(new DefaultServiceInstance("test-01", "test", "host", 8080, false))); + .cookie(new HttpCookie("testCookieName", "testCookieValue")) + .build()); + exchange.getAttributes() + .put(GATEWAY_LOADBALANCER_RESPONSE_ATTR, + new DefaultResponse(new DefaultServiceInstance("test-01", "test", "host", 8080, false))); ServerWebExchange filteredExchange = testFilter(exchange); assertThat(filteredExchange.getRequest().getHeaders().get(HttpHeaders.COOKIE)) - .containsExactly("testCookieName=testCookieValue", "sc-lb-instance-id=test-01"); + .containsExactly("testCookieName=testCookieValue", "sc-lb-instance-id=test-01"); } @Test @@ -94,8 +97,9 @@ class LoadBalancerServiceInstanceCookieFilterTests { @Test void shouldContinueChainWhenNullServiceInstanceCookieName() { - exchange.getAttributes().put(GATEWAY_LOADBALANCER_RESPONSE_ATTR, - new DefaultResponse(new DefaultServiceInstance("test-01", "test", "host", 8080, false))); + exchange.getAttributes() + .put(GATEWAY_LOADBALANCER_RESPONSE_ATTR, + new DefaultResponse(new DefaultServiceInstance("test-01", "test", "host", 8080, false))); properties.getStickySession().setInstanceIdCookieName(null); ServerWebExchange filteredExchange = testFilter(exchange); @@ -105,8 +109,9 @@ class LoadBalancerServiceInstanceCookieFilterTests { @Test void shouldContinueChainWhenEmptyServiceInstanceCookieName() { - exchange.getAttributes().put(GATEWAY_LOADBALANCER_RESPONSE_ATTR, - new DefaultResponse(new DefaultServiceInstance("test-01", "test", "host", 8080, false))); + exchange.getAttributes() + .put(GATEWAY_LOADBALANCER_RESPONSE_ATTR, + new DefaultResponse(new DefaultServiceInstance("test-01", "test", "host", 8080, false))); properties.getStickySession().setInstanceIdCookieName(""); ServerWebExchange filteredExchange = testFilter(exchange); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterCompatibleTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterCompatibleTests.java index c7883099..8ef21a5d 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterCompatibleTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterCompatibleTests.java @@ -63,9 +63,16 @@ class NettyRoutingFilterCompatibleTests extends BaseWebClientTests { @Test void shouldApplyResponseTimeoutPerRoute() { - testClient.get().uri("/route/delay/2").exchange().expectStatus().isEqualTo(HttpStatus.GATEWAY_TIMEOUT) - .expectBody().jsonPath("$.status").isEqualTo(String.valueOf(HttpStatus.GATEWAY_TIMEOUT.value())) - .jsonPath("$.message").isEqualTo("Response took longer than timeout: PT1S"); + testClient.get() + .uri("/route/delay/2") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.GATEWAY_TIMEOUT) + .expectBody() + .jsonPath("$.status") + .isEqualTo(String.valueOf(HttpStatus.GATEWAY_TIMEOUT.value())) + .jsonPath("$.message") + .isEqualTo("Response took longer than timeout: PT1S"); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterIntegrationTests.java index e7e96113..e130ca5d 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterIntegrationTests.java @@ -53,9 +53,16 @@ public class NettyRoutingFilterIntegrationTests extends BaseWebClientTests { @Test public void responseTimeoutWorks() { - testClient.get().uri("/delay/5").exchange().expectStatus().isEqualTo(HttpStatus.GATEWAY_TIMEOUT).expectBody() - .jsonPath("$.status").isEqualTo(String.valueOf(HttpStatus.GATEWAY_TIMEOUT.value())) - .jsonPath("$.message").isEqualTo("Response took longer than timeout: PT3S"); + testClient.get() + .uri("/delay/5") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.GATEWAY_TIMEOUT) + .expectBody() + .jsonPath("$.status") + .isEqualTo(String.valueOf(HttpStatus.GATEWAY_TIMEOUT.value())) + .jsonPath("$.message") + .isEqualTo("Response took longer than timeout: PT3S"); } @Test @@ -72,33 +79,56 @@ public class NettyRoutingFilterIntegrationTests extends BaseWebClientTests { public void canHandleDecoratedResponseWithNonStandardStatusValue() { final int NON_STANDARD_STATUS = 480; responseDecorator.decorateResponseTimes(1); - testClient.mutate().baseUrl("http://localhost:" + port).build().get().uri("/status/" + NON_STANDARD_STATUS) - .exchange().expectStatus().isEqualTo(NON_STANDARD_STATUS); + testClient.mutate() + .baseUrl("http://localhost:" + port) + .build() + .get() + .uri("/status/" + NON_STANDARD_STATUS) + .exchange() + .expectStatus() + .isEqualTo(NON_STANDARD_STATUS); } @Test public void canHandleUndecoratedResponseWithNonStandardStatusValue() { final int NON_STANDARD_STATUS = 480; responseDecorator.decorateResponseTimes(0); - testClient.mutate().baseUrl("http://localhost:" + port).build().get().uri("/status/" + NON_STANDARD_STATUS) - .exchange().expectStatus().isEqualTo(NON_STANDARD_STATUS); + testClient.mutate() + .baseUrl("http://localhost:" + port) + .build() + .get() + .uri("/status/" + NON_STANDARD_STATUS) + .exchange() + .expectStatus() + .isEqualTo(NON_STANDARD_STATUS); } @Test public void canHandleMultiplyDecoratedResponseWithNonStandardStatusValue() { final int NON_STANDARD_STATUS = 142; responseDecorator.decorateResponseTimes(14); - testClient.mutate().baseUrl("http://localhost:" + port).build().get().uri("/status/" + NON_STANDARD_STATUS) - .exchange().expectStatus().isEqualTo(NON_STANDARD_STATUS); + testClient.mutate() + .baseUrl("http://localhost:" + port) + .build() + .get() + .uri("/status/" + NON_STANDARD_STATUS) + .exchange() + .expectStatus() + .isEqualTo(NON_STANDARD_STATUS); } @Test public void shouldApplyConnectTimeoutPerRoute() { long currentTimeMillisBeforeCall = System.currentTimeMillis(); - testClient.get().uri("/connect/delay/2").exchange().expectStatus().isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR) - .expectBody().jsonPath("$.message") - .value(allOf(containsString("Connection refused:"), containsString(":32167"))); + testClient.get() + .uri("/connect/delay/2") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR) + .expectBody() + .jsonPath("$.message") + .value(allOf(containsString("Connection refused:"), containsString(":32167"))); // default connect timeout is 45 sec, this test verifies that it is possible to // reduce timeout via config @@ -107,9 +137,16 @@ public class NettyRoutingFilterIntegrationTests extends BaseWebClientTests { @Test public void shouldApplyResponseTimeoutPerRoute() { - testClient.get().uri("/route/delay/2").exchange().expectStatus().isEqualTo(HttpStatus.GATEWAY_TIMEOUT) - .expectBody().jsonPath("$.status").isEqualTo(String.valueOf(HttpStatus.GATEWAY_TIMEOUT.value())) - .jsonPath("$.message").isEqualTo("Response took longer than timeout: PT1S"); + testClient.get() + .uri("/route/delay/2") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.GATEWAY_TIMEOUT) + .expectBody() + .jsonPath("$.status") + .isEqualTo(String.valueOf(HttpStatus.GATEWAY_TIMEOUT.value())) + .jsonPath("$.message") + .isEqualTo("Response took longer than timeout: PT1S"); } @Test @@ -117,20 +154,31 @@ public class NettyRoutingFilterIntegrationTests extends BaseWebClientTests { assertThatThrownBy(() -> { testClient.get().uri("/disabledRoute/delay/10").exchange(); }).isInstanceOf(IllegalStateException.class) - .hasMessageContaining("Timeout on blocking read for 5000000000 NANOSECONDS"); + .hasMessageContaining("Timeout on blocking read for 5000000000 NANOSECONDS"); } @Test public void shouldApplyResponseTimeoutForPlaceholder() { - testClient.get().uri("/responseheaders/200").header("Host", "www.responsetimeoutplaceholder.org").exchange() - .expectStatus().isEqualTo(HttpStatus.OK); + testClient.get() + .uri("/responseheaders/200") + .header("Host", "www.responsetimeoutplaceholder.org") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.OK); } @Test public void shouldApplyGlobalResponseTimeoutForInvalidRouteTimeoutValue() { - testClient.get().uri("/invalidRoute/delay/5").exchange().expectStatus().isEqualTo(HttpStatus.GATEWAY_TIMEOUT) - .expectBody().jsonPath("$.status").isEqualTo(String.valueOf(HttpStatus.GATEWAY_TIMEOUT.value())) - .jsonPath("$.message").isEqualTo("Response took longer than timeout: PT3S"); + testClient.get() + .uri("/invalidRoute/delay/5") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.GATEWAY_TIMEOUT) + .expectBody() + .jsonPath("$.status") + .isEqualTo(String.valueOf(HttpStatus.GATEWAY_TIMEOUT.value())) + .jsonPath("$.message") + .isEqualTo("Response took longer than timeout: PT3S"); } @Test @@ -144,9 +192,13 @@ public class NettyRoutingFilterIntegrationTests extends BaseWebClientTests { String header = "X-Test-SHOULD-MERGED-HEADER"; String gatewayHeaderValue = "value-from-gateway"; String upstreamHeaderValue = "value-from-upstream"; - testClient.post().uri("/responseheaders/200").header("Host", "www.mergeresponseheader.org") - .header(header, upstreamHeaderValue).exchange().expectHeader() - .valueEquals(header, upstreamHeaderValue, gatewayHeaderValue); + testClient.post() + .uri("/responseheaders/200") + .header("Host", "www.mergeresponseheader.org") + .header(header, upstreamHeaderValue) + .exchange() + .expectHeader() + .valueEquals(header, upstreamHeaderValue, gatewayHeaderValue); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterTests.java index 7a2e5951..ace0bcc2 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterTests.java @@ -63,18 +63,25 @@ class NettyRoutingFilterTests extends BaseWebClientTests { @Test // gh-2207 void testCaseInsensitiveScheme() { - DisposableServer server = HttpServer.create().port(port).host("127.0.0.1").route( - routes -> routes.get("/issue", (request, response) -> response.sendString(Mono.just("issue2207")))) - .bindNow(); + DisposableServer server = HttpServer.create() + .port(port) + .host("127.0.0.1") + .route(routes -> routes.get("/issue", (request, response) -> response.sendString(Mono.just("issue2207")))) + .bindNow(); try { - testClient.get().uri("/issue").exchange().expectStatus().isOk().expectBody() - .consumeWith(entityExchangeResult -> { - assertThat(entityExchangeResult).isNotNull(); - assertThat(entityExchangeResult.getResponseBody()).isNotNull(); - String content = new String(entityExchangeResult.getResponseBody()); - assertThat(content).isEqualTo("issue2207"); - }); + testClient.get() + .uri("/issue") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .consumeWith(entityExchangeResult -> { + assertThat(entityExchangeResult).isNotNull(); + assertThat(entityExchangeResult.getResponseBody()).isNotNull(); + String content = new String(entityExchangeResult.getResponseBody()); + assertThat(content).isEqualTo("issue2207"); + }); } finally { server.disposeNow(); @@ -89,8 +96,9 @@ class NettyRoutingFilterTests extends BaseWebClientTests { @Bean public RouteLocator routes(RouteLocatorBuilder builder) { return builder.routes() - .route(p -> p.path("/mockexample").filters(f -> f.prefixPath("/httpbin")).uri("http://example.com")) - .route(p -> p.path("/issue").uri("HTTP://127.0.0.1:" + port)).build(); + .route(p -> p.path("/mockexample").filters(f -> f.prefixPath("/httpbin")).uri("http://example.com")) + .route(p -> p.path("/issue").uri("HTTP://127.0.0.1:" + port)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ReactiveLoadBalancerClientFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ReactiveLoadBalancerClientFilterTests.java index 62f83758..b30b72ec 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ReactiveLoadBalancerClientFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ReactiveLoadBalancerClientFilterTests.java @@ -159,7 +159,7 @@ class ReactiveLoadBalancerClientFilterTests { verifyNoMoreInteractions(clientFactory); assertThat((URI) exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR)) - .isEqualTo(URI.create("https://localhost:8080/mypath")); + .isEqualTo(URI.create("https://localhost:8080/mypath")); verify(chain).filter(exchange); verifyNoMoreInteractions(chain); @@ -189,8 +189,10 @@ class ReactiveLoadBalancerClientFilterTests { @Test void encodedParameters() { when(clientFactory.getProperties(any())).thenReturn(loadBalancerProperties); - URI url = UriComponentsBuilder.fromUriString("http://localhost/get?a=b&c=d[]").buildAndExpand().encode() - .toUri(); + URI url = UriComponentsBuilder.fromUriString("http://localhost/get?a=b&c=d[]") + .buildAndExpand() + .encode() + .toUri(); MockServerHttpRequest request = MockServerHttpRequest.method(HttpMethod.GET, url).build(); @@ -284,7 +286,7 @@ class ReactiveLoadBalancerClientFilterTests { when(clientFactory.getProperties(any())).thenReturn(loadBalancerProperties); URI url = UriComponentsBuilder.fromUriString("lb://myservice").build().toUri(); ServerWebExchange exchange = MockServerWebExchange - .from(MockServerHttpRequest.get("https://localhost:9999/mypath").build()); + .from(MockServerHttpRequest.get("https://localhost:9999/mypath").build()); exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, url); ServiceInstance serviceInstance = new DefaultServiceInstance("myservice1", "myservice", "localhost", 8080, false); @@ -297,7 +299,7 @@ class ReactiveLoadBalancerClientFilterTests { assertThat((LinkedHashSet) exchange.getAttribute(GATEWAY_ORIGINAL_REQUEST_URL_ATTR)).contains(url); assertThat((URI) exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR)) - .isEqualTo(URI.create("http://localhost:8080/mypath")); + .isEqualTo(URI.create("http://localhost:8080/mypath")); verify(chain).filter(exchange); verifyNoMoreInteractions(chain); } @@ -314,11 +316,11 @@ class ReactiveLoadBalancerClientFilterTests { when(serverWebExchange.getAttribute(GATEWAY_REQUEST_URL_ATTR)).thenReturn(lbUri); when(serverWebExchange.getAttributes()).thenReturn(new HashMap<>(Map.of("myattr", "myattrval"))); when(serverWebExchange.getRequiredAttribute(GATEWAY_ORIGINAL_REQUEST_URL_ATTR)) - .thenReturn(new LinkedHashSet<>()); + .thenReturn(new LinkedHashSet<>()); when(serverWebExchange.getRequest()).thenReturn(request); RoundRobinLoadBalancer loadBalancer = mock(RoundRobinLoadBalancer.class); - when(loadBalancer.choose(any(Request.class))).thenReturn(Mono.just( - new DefaultResponse(new DefaultServiceInstance("myservice1", "service1", "localhost", 8080, false)))); + when(loadBalancer.choose(any(Request.class))).thenReturn(Mono + .just(new DefaultResponse(new DefaultServiceInstance("myservice1", "service1", "localhost", 8080, false)))); when(clientFactory.getInstance("service1", ReactorServiceInstanceLoadBalancer.class)).thenReturn(loadBalancer); when(chain.filter(any())).thenReturn(Mono.empty()); @@ -346,11 +348,11 @@ class ReactiveLoadBalancerClientFilterTests { verify(lifecycleProcessor).onStart(any(Request.class)); verify(lifecycleProcessor).onStartRequest(any(Request.class), any(Response.class)); - verify(lifecycleProcessor).onComplete(argThat(completionContext -> CompletionContext.Status.SUCCESS - .equals(completionContext.status()) - && completionContext.getLoadBalancerResponse().getServer().equals(serviceInstance) - && HttpMethod.GET.equals( - ((RequestDataContext) completionContext.getLoadBalancerRequest().getContext()).method()))); + verify(lifecycleProcessor) + .onComplete(argThat(completionContext -> CompletionContext.Status.SUCCESS.equals(completionContext.status()) + && completionContext.getLoadBalancerResponse().getServer().equals(serviceInstance) + && HttpMethod.GET.equals( + ((RequestDataContext) completionContext.getLoadBalancerRequest().getContext()).method()))); } @SuppressWarnings({ "unchecked", "rawtypes" }) @@ -364,10 +366,10 @@ class ReactiveLoadBalancerClientFilterTests { filter.filter(serverWebExchange, chain).subscribe(); verify(lifecycleProcessor).onStart(any(Request.class)); - verify(lifecycleProcessor).onComplete(argThat(completionContext -> CompletionContext.Status.DISCARD - .equals(completionContext.status()) - && HttpMethod.GET.equals( - ((RequestDataContext) completionContext.getLoadBalancerRequest().getContext()).method()))); + verify(lifecycleProcessor) + .onComplete(argThat(completionContext -> CompletionContext.Status.DISCARD.equals(completionContext.status()) + && HttpMethod.GET.equals( + ((RequestDataContext) completionContext.getLoadBalancerRequest().getContext()).method()))); } @SuppressWarnings({ "unchecked", "rawtypes" }) @@ -383,10 +385,10 @@ class ReactiveLoadBalancerClientFilterTests { verify(lifecycleProcessor).onStart(any(Request.class)); verify(lifecycleProcessor).onStartRequest(any(Request.class), any(Response.class)); - verify(lifecycleProcessor).onComplete(argThat(completionContext -> CompletionContext.Status.FAILED - .equals(completionContext.status()) - && HttpMethod.GET.equals( - ((RequestDataContext) completionContext.getLoadBalancerRequest().getContext()).method()))); + verify(lifecycleProcessor) + .onComplete(argThat(completionContext -> CompletionContext.Status.FAILED.equals(completionContext.status()) + && HttpMethod.GET.equals( + ((RequestDataContext) completionContext.getLoadBalancerRequest().getContext()).method()))); } @SuppressWarnings({ "rawtypes", "unchecked" }) diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilterTests.java index b8bfd5ea..f48d6312 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilterTests.java @@ -92,8 +92,10 @@ public class RouteToRequestUrlFilterTests { @Test public void encodedParameters() { - URI url = UriComponentsBuilder.fromUriString("http://localhost/get?a=b&c=d[]").buildAndExpand().encode() - .toUri(); + URI url = UriComponentsBuilder.fromUriString("http://localhost/get?a=b&c=d[]") + .buildAndExpand() + .encode() + .toUri(); // prove that it is encoded assertThat(url.getRawQuery()).isEqualTo("a=b&c=d%5B%5D"); @@ -114,8 +116,9 @@ public class RouteToRequestUrlFilterTests { public void partialEncodedParameters() { assumeTrue("partialEncodedParameters ignored for boot 2.2", SpringBootVersion.getVersion().startsWith("2.3.")); - URI url = UriComponentsBuilder.fromUriString("http://localhost/get?key[]=test= key&start=1533108081").build() - .toUri(); + URI url = UriComponentsBuilder.fromUriString("http://localhost/get?key[]=test= key&start=1533108081") + .build() + .toUri(); // prove that it is partial encoded assertThat(url.getRawQuery()).isEqualTo("key[]=test=%20key&start=1533108081"); @@ -127,10 +130,12 @@ public class RouteToRequestUrlFilterTests { ServerWebExchange webExchange = testFilter(request, "http://myhost"); URI uri = webExchange.getRequiredAttribute(GATEWAY_REQUEST_URL_ATTR); - assertThat(uri).hasScheme("http").hasHost("myhost") - // since https://github.com/joel-costigliola/assertj-core/issues/1699 - // assertj uses raw query - .hasParameter("key[]", "test=%20key").hasParameter("start", "1533108081"); + assertThat(uri).hasScheme("http") + .hasHost("myhost") + // since https://github.com/joel-costigliola/assertj-core/issues/1699 + // assertj uses raw query + .hasParameter("key[]", "test=%20key") + .hasParameter("start", "1533108081"); // prove that it is double encoded since partial encoded uri is treated as // unencoded. diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilterTests.java index 19408ec1..8b5be710 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilterTests.java @@ -71,10 +71,11 @@ public class WebsocketRoutingFilterTests { @Test public void testEncodedUrl() { MockServerHttpRequest request = MockServerHttpRequest.get("http://not-matters-that") - .header(UPGRADE, "WebSocket").build(); + .header(UPGRADE, "WebSocket") + .build(); ServerWebExchange exchange = MockServerWebExchange.from(request); - exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, - URI.create("http://microservice/my-service/websocket%20upgrade")); + exchange.getAttributes() + .put(GATEWAY_REQUEST_URL_ATTR, URI.create("http://microservice/my-service/websocket%20upgrade")); changeSchemeIfIsWebSocketUpgrade(exchange); URI wsRequestUrl = exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR); assertThat(wsRequestUrl).isEqualTo(URI.create("ws://microservice/my-service/websocket%20upgrade")); @@ -97,8 +98,11 @@ public class WebsocketRoutingFilterTests { WebsocketRoutingFilter filter = new WebsocketRoutingFilter(mock(WebSocketClient.class), mock(WebSocketService.class), headersFilters); List filters = filter.getHeadersFilters(); - MockServerHttpRequest request = MockServerHttpRequest.get("ws://not-matters-that").header(HOST, "MyHost") - .header("Sec-Websocket-Something", "someval").header("x-foo", "bar").build(); + MockServerHttpRequest request = MockServerHttpRequest.get("ws://not-matters-that") + .header(HOST, "MyHost") + .header("Sec-Websocket-Something", "someval") + .header("x-foo", "bar") + .build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); exchange.getAttributes().put(PRESERVE_HOST_HEADER_ATTRIBUTE, preserveHostHeader); HttpHeaders httpHeaders = HttpHeadersFilter.filterRequest(filters, exchange); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/WeightCalculatorWebFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/WeightCalculatorWebFilterTests.java index 7471b705..ec9d9235 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/WeightCalculatorWebFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/WeightCalculatorWebFilterTests.java @@ -108,7 +108,7 @@ public class WeightCalculatorWebFilterTests { filter.setRandomSupplier(random); MockServerWebExchange exchange = MockServerWebExchange - .from(MockServerHttpRequest.get("http://localhost").build()); + .from(MockServerHttpRequest.get("http://localhost").build()); WebFilterChain filterChain = mock(WebFilterChain.class); filter.filter(exchange, filterChain); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactoryTests.java index 4e50b2ab..fa0b1da7 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactoryTests.java @@ -50,38 +50,54 @@ public class AddRequestHeaderGatewayFilterFactoryTests extends BaseWebClientTest @Test public void addRequestHeaderFilterWorks() { - testClient.get().uri("/headers").header("Host", "www.addrequestheader.org").exchange().expectBody(Map.class) - .consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Request-Example", "ValueA"); - }); + testClient.get() + .uri("/headers") + .header("Host", "www.addrequestheader.org") + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).containsEntry("X-Request-Example", "ValueA"); + }); } @Test public void addRequestHeaderFilterWorksMultipleValues() { - testClient.get().uri("/multivalueheaders").header("Host", "www.addrequestheader.org").exchange() - .expectBody(Map.class).consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Request-Example", Arrays.asList("ValueA", "ValueB")); - }); + testClient.get() + .uri("/multivalueheaders") + .header("Host", "www.addrequestheader.org") + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).containsEntry("X-Request-Example", Arrays.asList("ValueA", "ValueB")); + }); } @Test public void addRequestHeaderFilterWorksJavaDsl() { - testClient.get().uri("/headers").header("Host", "www.addrequestheaderjava.org").exchange().expectBody(Map.class) - .consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Request-Acme", "ValueB-www"); - }); + testClient.get() + .uri("/headers") + .header("Host", "www.addrequestheaderjava.org") + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).containsEntry("X-Request-Acme", "ValueB-www"); + }); } @Test public void addRequestHeaderFilterMultipleValuesWorksJavaDsl() { - testClient.get().uri("/multivalueheaders").header("Host", "www.addrequestheaderjava.org").exchange() - .expectBody(Map.class).consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Request-Acme", Arrays.asList("ValueB-www", "ValueC-www")); - }); + testClient.get() + .uri("/multivalueheaders") + .header("Host", "www.addrequestheaderjava.org") + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).containsEntry("X-Request-Acme", Arrays.asList("ValueB-www", "ValueC-www")); + }); } @Test @@ -101,17 +117,22 @@ public class AddRequestHeaderGatewayFilterFactoryTests extends BaseWebClientTest @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("add_request_header_java_test", - r -> r.path("/headers").and().host("{sub}.addrequestheaderjava.org") + return builder.routes() + .route("add_request_header_java_test", + r -> r.path("/headers") + .and() + .host("{sub}.addrequestheaderjava.org") .filters(f -> f.prefixPath("/httpbin").addRequestHeader("X-Request-Acme", "ValueB-{sub}")) .uri(uri)) - .route("add_multiple_request_header_java_test", - r -> r.path("/multivalueheaders").and().host("{sub}.addrequestheaderjava.org") - .filters(f -> f.prefixPath("/httpbin") - .addRequestHeader("X-Request-Acme", "ValueB-{sub}") - .addRequestHeader("X-Request-Acme", "ValueC-{sub}")) - .uri(uri)) - .build(); + .route("add_multiple_request_header_java_test", + r -> r.path("/multivalueheaders") + .and() + .host("{sub}.addrequestheaderjava.org") + .filters(f -> f.prefixPath("/httpbin") + .addRequestHeader("X-Request-Acme", "ValueB-{sub}") + .addRequestHeader("X-Request-Acme", "ValueC-{sub}")) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactoryTests.java index 160aa874..6b5ffaa7 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactoryTests.java @@ -54,11 +54,15 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactoryTests extends Base @Test public void addRequestHeadersIfHeaderPresentFilterDoesNotAddHeaderIfPresent() { final String initialHeaderValue = "initial-value"; - testClient.get().uri("/headers").header(TEST_HEADER_1, initialHeaderValue).exchange().expectBody(Map.class) - .consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsEntry(TEST_HEADER_1, initialHeaderValue); - }); + testClient.get() + .uri("/headers") + .header(TEST_HEADER_1, initialHeaderValue) + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).containsEntry(TEST_HEADER_1, initialHeaderValue); + }); } @Test @@ -81,31 +85,42 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactoryTests extends Base @Test public void addRequestHeadersIfNotPresentFilterWorksOnlyMissingValues() { final String existingValue = "existing-value"; - testClient.get().uri("/multivalueheaders").header(TEST_HEADER_2, existingValue).exchange().expectBody(Map.class) - .consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsEntry(TEST_HEADER_1, Arrays.asList("ValueA")); - assertThat(headers).containsEntry(TEST_HEADER_2, Arrays.asList(existingValue)); - }); + testClient.get() + .uri("/multivalueheaders") + .header(TEST_HEADER_2, existingValue) + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).containsEntry(TEST_HEADER_1, Arrays.asList("ValueA")); + assertThat(headers).containsEntry(TEST_HEADER_2, Arrays.asList(existingValue)); + }); } @Test public void addRequestHeadersIfNotPresentFilterWorksJavaDsl() { - testClient.get().uri("/headers").header("Host", TEST_HOST_HEADER_VALUE).exchange().expectBody(Map.class) - .consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Request-Acme", "ValueB-www"); - }); + testClient.get() + .uri("/headers") + .header("Host", TEST_HOST_HEADER_VALUE) + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).containsEntry("X-Request-Acme", "ValueB-www"); + }); } @Test public void addRequestHeadersIfNotPresentFilterMultipleValuesWorksJavaDsl() { - testClient.get().uri("/multivalueheaders").header("Host", TEST_HOST_HEADER_VALUE).exchange() - .expectBody(Map.class).consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Request-Acme", - Arrays.asList("ValueX", "ValueY", "ValueZ", "www")); - }); + testClient.get() + .uri("/multivalueheaders") + .header("Host", TEST_HOST_HEADER_VALUE) + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).containsEntry("X-Request-Acme", Arrays.asList("ValueX", "ValueY", "ValueZ", "www")); + }); } @Test @@ -115,8 +130,9 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactoryTests extends Base new KeyValue("my-header-name-2", "my-header-value-2"), }); GatewayFilter filter = new AddRequestHeadersIfNotPresentGatewayFilterFactory().apply(keyValueConfig); assertThat(filter.toString()).startsWith("[AddRequestHeadersIfNotPresent") - .contains("my-header-name-1 = 'my-header-value-1'").contains("my-header-name-2 = 'my-header-value-2'") - .endsWith("]"); + .contains("my-header-name-1 = 'my-header-value-1'") + .contains("my-header-name-2 = 'my-header-value-2'") + .endsWith("]"); } @EnableAutoConfiguration @@ -129,15 +145,21 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactoryTests extends Base @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("add_request_headers_if_not_present_java_test", - r -> r.path("/headers").and().host("{sub}.addrequestheaderjava.org") - .filters(f -> f.addRequestHeadersIfNotPresent("X-Request-Acme:ValueB-{sub}")).uri(uri)) - .route("add_multiple_request_headers_java_test", - r -> r.path("/multivalueheaders").and().host("{sub}.addrequestheaderjava.org") - .filters(f -> f.addRequestHeadersIfNotPresent("X-Request-Acme:ValueX", - "X-Request-Acme:ValueY", "X-Request-Acme:ValueZ", "X-Request-Acme:{sub}")) - .uri(uri)) - .build(); + return builder.routes() + .route("add_request_headers_if_not_present_java_test", + r -> r.path("/headers") + .and() + .host("{sub}.addrequestheaderjava.org") + .filters(f -> f.addRequestHeadersIfNotPresent("X-Request-Acme:ValueB-{sub}")) + .uri(uri)) + .route("add_multiple_request_headers_java_test", + r -> r.path("/multivalueheaders") + .and() + .host("{sub}.addrequestheaderjava.org") + .filters(f -> f.addRequestHeadersIfNotPresent("X-Request-Acme:ValueX", + "X-Request-Acme:ValueY", "X-Request-Acme:ValueZ", "X-Request-Acme:{sub}")) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestParameterGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestParameterGatewayFilterFactoryTests.java index 0c5a1000..10a321c3 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestParameterGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestParameterGatewayFilterFactoryTests.java @@ -129,14 +129,19 @@ public class AddRequestParameterGatewayFilterFactoryTests extends BaseWebClientT @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("add_request_param_java_test", r -> r.path("/get").and().host("{sub}.addreqparamjava.org") + .route("add_request_param_java_test", + r -> r.path("/get") + .and() + .host("{sub}.addreqparamjava.org") .filters(f -> f.prefixPath("/httpbin").addRequestParameter("example", "ValueB-{sub}")) .uri(uri)) - .route("add_request_param_java_test_encoded_segment", r -> r.path("/anything/{segment}").and() + .route("add_request_param_java_test_encoded_segment", + r -> r.path("/anything/{segment}") + .and() .host("{sub}.addreqparamjavaencodedsegment.org") .filters(f -> f.prefixPath("/httpbin").addRequestParameter("example", "ValueB-{sub}")) .uri(uri)) - .build(); + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddResponseHeaderGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddResponseHeaderGatewayFilterFactoryTests.java index 47e256e6..4c3c002e 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddResponseHeaderGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddResponseHeaderGatewayFilterFactoryTests.java @@ -46,8 +46,12 @@ class AddResponseHeaderGatewayFilterFactoryTests extends BaseWebClientTests { URI uri = UriComponentsBuilder.fromUriString(this.baseUri + "/headers").build(true).toUri(); String host = "www.addresponseheader.org"; String expectedValue = "Bar"; - testClient.get().uri(uri).header("Host", host).exchange().expectHeader().valueEquals("X-Request-Foo", - expectedValue); + testClient.get() + .uri(uri) + .header("Host", host) + .exchange() + .expectHeader() + .valueEquals("X-Request-Foo", expectedValue); } @Test @@ -76,11 +80,14 @@ class AddResponseHeaderGatewayFilterFactoryTests extends BaseWebClientTests { @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("add_response_header_java_test", - r -> r.path("/get").and().host("{sub}.addresponseheaderjava.org").filters( + .route("add_response_header_java_test", + r -> r.path("/get") + .and() + .host("{sub}.addresponseheaderjava.org") + .filters( f -> f.prefixPath("/httpbin").addResponseHeader("example", "myresponsevalue-{sub}")) - .uri(uri)) - .build(); + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/CacheRequestBodyGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/CacheRequestBodyGatewayFilterFactoryTests.java index 7a9be442..cb4c508c 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/CacheRequestBodyGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/CacheRequestBodyGatewayFilterFactoryTests.java @@ -59,39 +59,63 @@ public class CacheRequestBodyGatewayFilterFactoryTests extends BaseWebClientTest @Test public void cacheRequestBodyWorks() { - testClient.post().uri("/post").header("Host", "www.cacherequestbody.org").bodyValue(BODY_VALUE).exchange() - .expectStatus().isOk().expectBody(Map.class).consumeWith(result -> { - Map response = result.getResponseBody(); - assertThat(response).isNotNull(); + testClient.post() + .uri("/post") + .header("Host", "www.cacherequestbody.org") + .bodyValue(BODY_VALUE) + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + Map response = result.getResponseBody(); + assertThat(response).isNotNull(); - String responseBody = (String) response.get("data"); - assertThat(responseBody).isEqualTo(BODY_VALUE); - }); + String responseBody = (String) response.get("data"); + assertThat(responseBody).isEqualTo(BODY_VALUE); + }); } @Test public void cacheRequestBodyDoesntWorkForLargePayload() { - testClient.post().uri("/post").header("Host", "www.cacherequestbody.org") - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).bodyValue(LARGE_BODY_VALUE) - .exchange().expectStatus().isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR).expectBody().jsonPath("message") - .isEqualTo("Exceeded limit on max bytes to buffer : 25"); + testClient.post() + .uri("/post") + .header("Host", "www.cacherequestbody.org") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .bodyValue(LARGE_BODY_VALUE) + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR) + .expectBody() + .jsonPath("message") + .isEqualTo("Exceeded limit on max bytes to buffer : 25"); } @Test public void cacheRequestBodyEmpty() { - testClient.post().uri("/post").header("Host", "www.cacherequestbodyempty.org").exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(result -> { - Map response = result.getResponseBody(); - assertThat(response).isNotNull(); + testClient.post() + .uri("/post") + .header("Host", "www.cacherequestbodyempty.org") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + Map response = result.getResponseBody(); + assertThat(response).isNotNull(); - assertThat(response.get("data")).isNull(); - }); + assertThat(response.get("data")).isNull(); + }); } @Test public void cacheRequestBodyExists() { - testClient.post().uri("/post").header("Host", "www.cacherequestbodyexists.org").exchange().expectStatus() - .isOk(); + testClient.post() + .uri("/post") + .header("Host", "www.cacherequestbodyexists.org") + .exchange() + .expectStatus() + .isOk(); } @Test @@ -113,25 +137,33 @@ public class CacheRequestBodyGatewayFilterFactoryTests extends BaseWebClientTest @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("cache_request_body_java_test", - r -> r.path("/post").and().host("**.cacherequestbody.org") - .filters(f -> f.prefixPath("/httpbin").cacheRequestBody(String.class) - .filter(new AssertCachedRequestBodyGatewayFilter(BODY_VALUE)) - .filter(new CheckCachedRequestBodyReleasedGatewayFilter())) - .uri(uri)) - .route("cache_request_body_empty_java_test", - r -> r.path("/post").and().host("**.cacherequestbodyempty.org") - .filters(f -> f.prefixPath("/httpbin").cacheRequestBody(String.class) - .filter(new AssertCachedRequestBodyGatewayFilter(BODY_EMPTY))) - .uri(uri)) - .route("cache_request_body_exists_java_test", - r -> r.path("/post").and().host("**.cacherequestbodyexists.org") - .filters(f -> f.prefixPath("/httpbin") - .filter(new SetExchangeCachedRequestBodyGatewayFilter(BODY_CACHED_EXISTS)) - .cacheRequestBody(String.class) - .filter(new AssertCachedRequestBodyGatewayFilter(BODY_CACHED_EXISTS))) - .uri(uri)) - .build(); + .route("cache_request_body_java_test", + r -> r.path("/post") + .and() + .host("**.cacherequestbody.org") + .filters(f -> f.prefixPath("/httpbin") + .cacheRequestBody(String.class) + .filter(new AssertCachedRequestBodyGatewayFilter(BODY_VALUE)) + .filter(new CheckCachedRequestBodyReleasedGatewayFilter())) + .uri(uri)) + .route("cache_request_body_empty_java_test", + r -> r.path("/post") + .and() + .host("**.cacherequestbodyempty.org") + .filters(f -> f.prefixPath("/httpbin") + .cacheRequestBody(String.class) + .filter(new AssertCachedRequestBodyGatewayFilter(BODY_EMPTY))) + .uri(uri)) + .route("cache_request_body_exists_java_test", + r -> r.path("/post") + .and() + .host("**.cacherequestbodyexists.org") + .filters(f -> f.prefixPath("/httpbin") + .filter(new SetExchangeCachedRequestBodyGatewayFilter(BODY_CACHED_EXISTS)) + .cacheRequestBody(String.class) + .filter(new AssertCachedRequestBodyGatewayFilter(BODY_CACHED_EXISTS))) + .uri(uri)) + .build(); } } @@ -186,7 +218,7 @@ public class CacheRequestBodyGatewayFilterFactoryTests extends BaseWebClientTest public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { return chain.filter(exchange).doAfterTerminate(() -> { Object o = exchange.getAttributes() - .get(CacheRequestBodyGatewayFilterFactory.CACHED_ORIGINAL_REQUEST_BODY_BACKUP_ATTR); + .get(CacheRequestBodyGatewayFilterFactory.CACHED_ORIGINAL_REQUEST_BODY_BACKUP_ATTR); if (o instanceof PooledDataBuffer dataBuffer) { if (dataBuffer.isAllocated()) { exchange.getResponse().setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/DedupeResponseHeaderGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/DedupeResponseHeaderGatewayFilterFactoryTests.java index 4179fceb..bef5120a 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/DedupeResponseHeaderGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/DedupeResponseHeaderGatewayFilterFactoryTests.java @@ -33,11 +33,20 @@ class DedupeResponseHeaderGatewayFilterFactoryTests extends BaseWebClientTests { @Test void dedupeResponseHeaderFilterWorks() { - testClient.get().uri("/headers").header("Host", "www.deduperesponseheader.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals("Access-Control-Allow-Credentials", "true").expectHeader() - .valueEquals("Access-Control-Allow-Origin", "https://musk.mars").expectHeader() - .valueEquals("Scout-Cookie", "S'mores").expectHeader() - .valueEquals("Next-Week-Lottery-Numbers", "4", "2", "42"); + testClient.get() + .uri("/headers") + .header("Host", "www.deduperesponseheader.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("Access-Control-Allow-Credentials", "true") + .expectHeader() + .valueEquals("Access-Control-Allow-Origin", "https://musk.mars") + .expectHeader() + .valueEquals("Scout-Cookie", "S'mores") + .expectHeader() + .valueEquals("Next-Week-Lottery-Numbers", "4", "2", "42"); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/MapRequestHeaderGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/MapRequestHeaderGatewayFilterFactoryTests.java index 65aed5be..e455d3b6 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/MapRequestHeaderGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/MapRequestHeaderGatewayFilterFactoryTests.java @@ -49,50 +49,74 @@ class MapRequestHeaderGatewayFilterFactoryTests extends BaseWebClientTests { @Test void mapRequestHeaderFilterWorks() { - testClient.get().uri("/headers").header("Host", "www.maprequestheader.org").header("a", "tome").exchange() - .expectBody(Map.class).consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Request-Example", "tome"); - }); + testClient.get() + .uri("/headers") + .header("Host", "www.maprequestheader.org") + .header("a", "tome") + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).containsEntry("X-Request-Example", "tome"); + }); } @Test void mapRequestHeaderFilterWorksJavaDsl() { - testClient.get().uri("/headers").header("Host", "www.maprequestheaderjava.org").header("b", "tome").exchange() - .expectBody(Map.class).consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Request-Example-Java", "tome"); - }); + testClient.get() + .uri("/headers") + .header("Host", "www.maprequestheaderjava.org") + .header("b", "tome") + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).containsEntry("X-Request-Example-Java", "tome"); + }); } @SuppressWarnings("unchecked") @Test void mapRequestHeaderWithMultiValueFilterWorks() { - testClient.get().uri("/multivalueheaders").header("Host", "www.maprequestheader.org") - .header("a", "tome", "toyou").exchange().expectBody(Map.class).consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsKey("X-Request-Example"); - List values = (List) headers.get("X-Request-Example"); - assertThat(values).contains("tome", "toyou"); - }); + testClient.get() + .uri("/multivalueheaders") + .header("Host", "www.maprequestheader.org") + .header("a", "tome", "toyou") + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).containsKey("X-Request-Example"); + List values = (List) headers.get("X-Request-Example"); + assertThat(values).contains("tome", "toyou"); + }); } @Test void mapRequestHeaderWithNullValueFilterWorks() { - testClient.get().uri("/headers").header("Host", "www.maprequestheader.org").header("a", (String) null) - .exchange().expectBody(Map.class).consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).doesNotContainKey("X-Request-Example"); - }); + testClient.get() + .uri("/headers") + .header("Host", "www.maprequestheader.org") + .header("a", (String) null) + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).doesNotContainKey("X-Request-Example"); + }); } @Test void mapRequestHeaderWhenInputHeaderDoesNotExist() { - testClient.get().uri("/headers").header("Host", "www.maprequestheader.org").exchange().expectBody(Map.class) - .consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).doesNotContainKey("X-Request-Example"); - }); + testClient.get() + .uri("/headers") + .header("Host", "www.maprequestheader.org") + .exchange() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).doesNotContainKey("X-Request-Example"); + }); } @Test @@ -112,11 +136,14 @@ class MapRequestHeaderGatewayFilterFactoryTests extends BaseWebClientTests { @Bean RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("map_request_header_java_test", - r -> r.path("/headers").and().host("**.maprequestheaderjava.org") + return builder.routes() + .route("map_request_header_java_test", + r -> r.path("/headers") + .and() + .host("**.maprequestheaderjava.org") .filters(f -> f.prefixPath("/httpbin").mapRequestHeader("b", "X-Request-Example-Java")) .uri(uri)) - .build(); + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/PreserveHostHeaderGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/PreserveHostHeaderGatewayFilterFactoryTests.java index 710f76e0..64dfecbb 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/PreserveHostHeaderGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/PreserveHostHeaderGatewayFilterFactoryTests.java @@ -47,13 +47,19 @@ public class PreserveHostHeaderGatewayFilterFactoryTests extends BaseWebClientTe @SuppressWarnings("unchecked") @Test public void preserveHostHeaderGatewayFilterFactoryWorks() { - testClient.get().uri("/multivalueheaders").header("Host", "www.preservehostheader.org").exchange() - .expectStatus().isOk().expectBody(Map.class).consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsKey("Host"); - List values = (List) headers.get("Host"); - assertThat(values).containsExactly("myhost.net"); - }); + testClient.get() + .uri("/multivalueheaders") + .header("Host", "www.preservehostheader.org") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).containsKey("Host"); + List values = (List) headers.get("Host"); + assertThat(values).containsExactly("myhost.net"); + }); } @Test @@ -73,10 +79,11 @@ public class PreserveHostHeaderGatewayFilterFactoryTests extends BaseWebClientTe @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("test_preserve_host_header", r -> r.order(-1).host("**.preservehostheader.org").filters( - f -> f.prefixPath("/httpbin").preserveHostHeader().setRequestHeader("Host", "myhost.net")) - .uri(uri)) - .build(); + .route("test_preserve_host_header", r -> r.order(-1) + .host("**.preservehostheader.org") + .filters(f -> f.prefixPath("/httpbin").preserveHostHeader().setRequestHeader("Host", "myhost.net")) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RedirectToGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RedirectToGatewayFilterFactoryTests.java index 21d8a220..004023e2 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RedirectToGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RedirectToGatewayFilterFactoryTests.java @@ -43,46 +43,86 @@ public class RedirectToGatewayFilterFactoryTests extends BaseWebClientTests { @Test public void redirectToFilterWorks() { - testClient.get().uri("/").header("Host", "www.redirectto.org").exchange().expectStatus() - .isEqualTo(HttpStatus.FOUND).expectHeader().valueEquals(HttpHeaders.LOCATION, "https://example.org"); + testClient.get() + .uri("/") + .header("Host", "www.redirectto.org") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.FOUND) + .expectHeader() + .valueEquals(HttpHeaders.LOCATION, "https://example.org"); } @Test public void redirectToUrlDoesNotPassQueryParametersByDefault() { - testClient.get().uri("/?membership=gold").header("Host", "www.redirectto.org").exchange().expectStatus() - .isEqualTo(HttpStatus.FOUND).expectHeader().valueEquals(HttpHeaders.LOCATION, "https://example.org"); + testClient.get() + .uri("/?membership=gold") + .header("Host", "www.redirectto.org") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.FOUND) + .expectHeader() + .valueEquals(HttpHeaders.LOCATION, "https://example.org"); } @Test public void redirectToUrlAddsQueryParametersWhenEnabledOnFilter() { - testClient.get().uri("/?membership=gold").header("Host", "queryparams.redirectto.org").exchange().expectStatus() - .isEqualTo(HttpStatus.FOUND).expectHeader() - .valueEquals(HttpHeaders.LOCATION, "https://example.org?membership=gold"); + testClient.get() + .uri("/?membership=gold") + .header("Host", "queryparams.redirectto.org") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.FOUND) + .expectHeader() + .valueEquals(HttpHeaders.LOCATION, "https://example.org?membership=gold"); } @Test public void redirectToRelativeUrlFilterWorks() { - testClient.get().uri("/").header("Host", "www.relativeredirect.org").exchange().expectStatus() - .isEqualTo(HttpStatus.FOUND).expectHeader().valueEquals(HttpHeaders.LOCATION, "/index.html#/customers"); + testClient.get() + .uri("/") + .header("Host", "www.relativeredirect.org") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.FOUND) + .expectHeader() + .valueEquals(HttpHeaders.LOCATION, "/index.html#/customers"); } @Test public void redirectToRelativeUrlFilterWorksWithStrStatusCode() { - testClient.get().uri("/").header("Host", "strcode.relativeredirect.org").exchange().expectStatus() - .isEqualTo(HttpStatus.FOUND).expectHeader().valueEquals(HttpHeaders.LOCATION, "/index.html#/customers"); + testClient.get() + .uri("/") + .header("Host", "strcode.relativeredirect.org") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.FOUND) + .expectHeader() + .valueEquals(HttpHeaders.LOCATION, "/index.html#/customers"); } @Test public void redirectToRelativeUrlDoesNotPassQueryParametersByDefault() { - testClient.get().uri("/?membership=gold").header("Host", "www.relativeredirect.org").exchange().expectStatus() - .isEqualTo(HttpStatus.FOUND).expectHeader().valueEquals(HttpHeaders.LOCATION, "/index.html#/customers"); + testClient.get() + .uri("/?membership=gold") + .header("Host", "www.relativeredirect.org") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.FOUND) + .expectHeader() + .valueEquals(HttpHeaders.LOCATION, "/index.html#/customers"); } @Test public void redirectToRelativeUrlAddsQueryParametersWhenEnabledOnFilter() { - testClient.get().uri("/?membership=gold").header("Host", "queryparams.relativeredirect.org").exchange() - .expectStatus().isEqualTo(HttpStatus.FOUND).expectHeader() - .valueEquals(HttpHeaders.LOCATION, "/index.html?membership=gold#/customers"); + testClient.get() + .uri("/?membership=gold") + .header("Host", "queryparams.relativeredirect.org") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.FOUND) + .expectHeader() + .valueEquals(HttpHeaders.LOCATION, "/index.html?membership=gold#/customers"); } @Test @@ -103,14 +143,19 @@ public class RedirectToGatewayFilterFactoryTests extends BaseWebClientTests { @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("relative_redirect_uri_object", r -> r.host("strcode.relativeredirect.org") - .filters(f -> f.redirect("302", URI.create("/index.html#/customers"))).uri("no://op")) - .route("relative_redirect_with_query_params", - r -> r.host("queryparams.relativeredirect.org") - .filters(f -> f.redirect(302, "/index.html#/customers", true)).uri("no://op")) - .route("relative_redirect", r -> r.host("**.relativeredirect.org") - .filters(f -> f.redirect(302, "/index.html#/customers")).uri("no://op")) - .build(); + .route("relative_redirect_uri_object", + r -> r.host("strcode.relativeredirect.org") + .filters(f -> f.redirect("302", URI.create("/index.html#/customers"))) + .uri("no://op")) + .route("relative_redirect_with_query_params", + r -> r.host("queryparams.relativeredirect.org") + .filters(f -> f.redirect(302, "/index.html#/customers", true)) + .uri("no://op")) + .route("relative_redirect", + r -> r.host("**.relativeredirect.org") + .filters(f -> f.redirect(302, "/index.html#/customers")) + .uri("no://op")) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveJsonAttributesResponseBodyGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveJsonAttributesResponseBodyGatewayFilterFactoryTests.java index 84db78fd..12482d1a 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveJsonAttributesResponseBodyGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveJsonAttributesResponseBodyGatewayFilterFactoryTests.java @@ -46,49 +46,71 @@ public class RemoveJsonAttributesResponseBodyGatewayFilterFactoryTests extends B @Test public void removeJsonAttributeRootWorks() { - testClient.post().uri("/post").header("Host", "www.removejsonattributes.org") - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).header("foo", "test") - .header("bar", "test").exchange().expectStatus().isOk().expectBody(Map.class).consumeWith(result -> { - Map response = result.getResponseBody(); - assertThat(response).isNotNull(); + testClient.post() + .uri("/post") + .header("Host", "www.removejsonattributes.org") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("foo", "test") + .header("bar", "test") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + Map response = result.getResponseBody(); + assertThat(response).isNotNull(); - String responseBody = (String) response.get("data"); - assertThat(responseBody).isNull(); + String responseBody = (String) response.get("data"); + assertThat(responseBody).isNull(); - Map headers = getMap(response, "headers"); - assertThat(headers).containsKey("user-agent"); + Map headers = getMap(response, "headers"); + assertThat(headers).containsKey("user-agent"); - }); + }); } @Test public void removeJsonAttributeRecursivelyWorks() { - testClient.post().uri("/post").header("Host", "www.removejsonattributesrecursively.org") - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).header("foo", "test") - .header("bar", "test").exchange().expectStatus().isOk().expectBody(Map.class).consumeWith(result -> { - Map response = result.getResponseBody(); - assertThat(response).isNotNull(); + testClient.post() + .uri("/post") + .header("Host", "www.removejsonattributesrecursively.org") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("foo", "test") + .header("bar", "test") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + Map response = result.getResponseBody(); + assertThat(response).isNotNull(); - Map headers = getMap(response, "headers"); - assertThat(headers).doesNotContainKey("foo"); - assertThat(headers).containsEntry("bar", "test"); - }); + Map headers = getMap(response, "headers"); + assertThat(headers).doesNotContainKey("foo"); + assertThat(headers).containsEntry("bar", "test"); + }); } @Test public void removeJsonAttributeNoMatchesWorks() { - testClient.post().uri("/post").header("Host", "www.removejsonattributesnomatches.org") - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(result -> { - Map response = result.getResponseBody(); - assertThat(response).isNotNull(); + testClient.post() + .uri("/post") + .header("Host", "www.removejsonattributesnomatches.org") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + Map response = result.getResponseBody(); + assertThat(response).isNotNull(); - Map headers = getMap(response, "headers"); - assertThat(headers).isNotNull(); - assertThat(headers).containsEntry(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); - }); + Map headers = getMap(response, "headers"); + assertThat(headers).isNotNull(); + assertThat(headers).containsEntry(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); + }); } @EnableAutoConfiguration @@ -102,16 +124,25 @@ public class RemoveJsonAttributesResponseBodyGatewayFilterFactoryTests extends B @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("remove_json_attributes_root_level_java_test", - r -> r.path("/post").and().host("{sub}.removejsonattributes.org") - .filters(f -> f.removeJsonAttributes(false, "data", "foo")).uri(uri)) - .route("remove_json_attributes_recursively_java_test", - r -> r.path("/post").and().host("{sub}.removejsonattributesrecursively.org") - .filters(f -> f.removeJsonAttributes(true, "foo")).uri(uri)) - .route("remove_json_attributes_no_matches_java_test", - r -> r.path("/post").and().host("{sub}.removejsonattributesnomatches.org") - .filters(f -> f.removeJsonAttributes("test")).uri(uri)) - .build(); + .route("remove_json_attributes_root_level_java_test", + r -> r.path("/post") + .and() + .host("{sub}.removejsonattributes.org") + .filters(f -> f.removeJsonAttributes(false, "data", "foo")) + .uri(uri)) + .route("remove_json_attributes_recursively_java_test", + r -> r.path("/post") + .and() + .host("{sub}.removejsonattributesrecursively.org") + .filters(f -> f.removeJsonAttributes(true, "foo")) + .uri(uri)) + .route("remove_json_attributes_no_matches_java_test", + r -> r.path("/post") + .and() + .host("{sub}.removejsonattributesnomatches.org") + .filters(f -> f.removeJsonAttributes("test")) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestHeaderGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestHeaderGatewayFilterFactoryTests.java index 0da13c06..b3b53943 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestHeaderGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestHeaderGatewayFilterFactoryTests.java @@ -39,11 +39,18 @@ public class RemoveRequestHeaderGatewayFilterFactoryTests extends BaseWebClientT @Test public void removeRequestHeaderFilterWorks() { - testClient.get().uri("/headers").header("Host", "www.removerequestheader.org").header("X-Request-Foo", "Bar") - .exchange().expectStatus().isOk().expectBody(Map.class).consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).doesNotContainKey("X-Request-Foo"); - }); + testClient.get() + .uri("/headers") + .header("Host", "www.removerequestheader.org") + .header("X-Request-Foo", "Bar") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).doesNotContainKey("X-Request-Foo"); + }); } @Test diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryIntegrationTests.java index a067e12b..2d9038a9 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryIntegrationTests.java @@ -43,12 +43,18 @@ public class RemoveRequestParameterGatewayFilterFactoryIntegrationTests extends @Test public void removeResponseHeaderFilterWorks() { - testClient.get().uri("/get?foo=bar&baz=bam%20bar").header("Host", "www.removerequestparamjava.org").exchange() - .expectStatus().isOk().expectBody(Map.class).consumeWith(result -> { - Map params = getMap(result.getResponseBody(), "args"); - assertThat(params).doesNotContainKey("foo"); - assertThat(params).containsEntry("baz", "bam%20bar"); - }); + testClient.get() + .uri("/get?foo=bar&baz=bam%20bar") + .header("Host", "www.removerequestparamjava.org") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + Map params = getMap(result.getResponseBody(), "args"); + assertThat(params).doesNotContainKey("foo"); + assertThat(params).containsEntry("baz", "bam%20bar"); + }); } @Test @@ -70,10 +76,13 @@ public class RemoveRequestParameterGatewayFilterFactoryIntegrationTests extends @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("removerequestparam_java_test", - r -> r.path("/get").and().host("**.removerequestparamjava.org") - .filters(f -> f.prefixPath("/httpbin").removeRequestParameter("foo")).uri(uri)) - .build(); + .route("removerequestparam_java_test", + r -> r.path("/get") + .and() + .host("**.removerequestparamjava.org") + .filters(f -> f.prefixPath("/httpbin").removeRequestParameter("foo")) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryTests.java index 470160f5..a1fdf471 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryTests.java @@ -56,7 +56,8 @@ public class RemoveRequestParameterGatewayFilterFactoryTests { @Test public void removeRequestParameterFilterWorks() { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost") - .queryParam("foo", singletonList("bar")).build(); + .queryParam("foo", singletonList("bar")) + .build(); exchange = MockServerWebExchange.from(request); NameConfig config = new NameConfig(); config.setName("foo"); @@ -84,8 +85,10 @@ public class RemoveRequestParameterGatewayFilterFactoryTests { @Test public void removeRequestParameterFilterShouldOnlyRemoveSpecifiedParam() { - MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost").queryParam("foo", "bar") - .queryParam("abc", "xyz").build(); + MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost") + .queryParam("foo", "bar") + .queryParam("abc", "xyz") + .build(); exchange = MockServerWebExchange.from(request); NameConfig config = new NameConfig(); config.setName("foo"); @@ -100,8 +103,12 @@ public class RemoveRequestParameterGatewayFilterFactoryTests { @Test public void removeRequestParameterFilterShouldHandleRemainingParamsWhichRequiringEncoding() { - MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost").queryParam("foo", "bar") - .queryParam("aaa", "abc xyz").queryParam("bbb", "[xyz").queryParam("ccc", ",xyz").build(); + MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost") + .queryParam("foo", "bar") + .queryParam("aaa", "abc xyz") + .queryParam("bbb", "[xyz") + .queryParam("ccc", ",xyz") + .build(); exchange = MockServerWebExchange.from(request); NameConfig config = new NameConfig(); config.setName("foo"); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveResponseHeaderGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveResponseHeaderGatewayFilterFactoryTests.java index 05a0fc4d..fa5c4a9b 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveResponseHeaderGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveResponseHeaderGatewayFilterFactoryTests.java @@ -36,8 +36,14 @@ public class RemoveResponseHeaderGatewayFilterFactoryTests extends BaseWebClient @Test public void removeResponseHeaderFilterWorks() { - testClient.get().uri("/headers").header("Host", "www.removereresponseheader.org").exchange().expectStatus() - .isOk().expectHeader().doesNotExist("X-Request-Foo"); + testClient.get() + .uri("/headers") + .header("Host", "www.removereresponseheader.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .doesNotExist("X-Request-Foo"); } @Test diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderSizeGatewayFilterFactoryTest.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderSizeGatewayFilterFactoryTest.java index 70b23798..753fcaa7 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderSizeGatewayFilterFactoryTest.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderSizeGatewayFilterFactoryTest.java @@ -51,35 +51,59 @@ public class RequestHeaderSizeGatewayFilterFactoryTest extends BaseWebClientTest @Test public void setRequestHeaderSizeFilterWorks() { System.err.println("Here: " + longString.length() + ", " + longString.getBytes().length); - testClient.get().uri("/headers").header("Host", "www.testrequestheadersizefilter.org") - .header("HeaderName", longString).exchange().expectStatus() - .isEqualTo(HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE).expectHeader().value("errorMessage", - header -> assertThat(header).contains("permissible limit (46B)", "'HeaderName' is 57B")); + testClient.get() + .uri("/headers") + .header("Host", "www.testrequestheadersizefilter.org") + .header("HeaderName", longString) + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE) + .expectHeader() + .value("errorMessage", + header -> assertThat(header).contains("permissible limit (46B)", "'HeaderName' is 57B")); } @Test public void setRequestHeaderSizeFilterShortcutWorks() { - testClient.get().uri("/headers").header("Host", "www.requestheadersize.org").header("HeaderName", longString) - .exchange().expectStatus().isEqualTo(HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE).expectHeader() - .value("errorMessage", - header -> assertThat(header).contains("permissible limit (46B)", "'HeaderName' is 57B")); + testClient.get() + .uri("/headers") + .header("Host", "www.requestheadersize.org") + .header("HeaderName", longString) + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE) + .expectHeader() + .value("errorMessage", + header -> assertThat(header).contains("permissible limit (46B)", "'HeaderName' is 57B")); } @Test public void setRequestHeaderSizeFilterMultipleHeadersWorks() { - testClient.get().uri("/headers").header("Host", "www.requestheadersize.org").header("HeaderName", longString) - .header("HeaderName2", longString).exchange().expectStatus() - .isEqualTo(HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE).expectHeader() - .value("errorMessage", header -> assertThat(header).contains("permissible limit (46B)", - "'HeaderName' is 57B", "'HeaderName2' is 58B")); + testClient.get() + .uri("/headers") + .header("Host", "www.requestheadersize.org") + .header("HeaderName", longString) + .header("HeaderName2", longString) + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE) + .expectHeader() + .value("errorMessage", header -> assertThat(header).contains("permissible limit (46B)", + "'HeaderName' is 57B", "'HeaderName2' is 58B")); } @Test public void setRequestHeaderSizeFilterTakesIntoAccountHeaderName() { - testClient.get().uri("/headers").header("Host", "www.testrequestheadersizefiltername.org") - .header("HeaderName", longString).exchange().expectStatus() - .isEqualTo(HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE).expectHeader().value("errorMessage", - header -> assertThat(header).contains("permissible limit (47B)", "'HeaderName' is 57B")); + testClient.get() + .uri("/headers") + .header("Host", "www.testrequestheadersizefiltername.org") + .header("HeaderName", longString) + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE) + .expectHeader() + .value("errorMessage", + header -> assertThat(header).contains("permissible limit (47B)", "'HeaderName' is 57B")); } @Test @@ -101,13 +125,17 @@ public class RequestHeaderSizeGatewayFilterFactoryTest extends BaseWebClientTest @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("test_request_header_size", - r -> r.order(-1).host("**.testrequestheadersizefilter.org") - .filters(f -> f.setRequestHeaderSize(DataSize.of(46L, DataUnit.BYTES))).uri(uri)) - .route("test_request_header_size_name", - r -> r.order(1).host("**.testrequestheadersizefiltername.org") - .filters(f -> f.setRequestHeaderSize(DataSize.of(47L, DataUnit.BYTES))).uri(uri)) - .build(); + .route("test_request_header_size", + r -> r.order(-1) + .host("**.testrequestheadersizefilter.org") + .filters(f -> f.setRequestHeaderSize(DataSize.of(46L, DataUnit.BYTES))) + .uri(uri)) + .route("test_request_header_size_name", + r -> r.order(1) + .host("**.testrequestheadersizefiltername.org") + .filters(f -> f.setRequestHeaderSize(DataSize.of(47L, DataUnit.BYTES))) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderToRequestUriGatewayFilterFactoryIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderToRequestUriGatewayFilterFactoryIntegrationTests.java index 6dc07f48..3ba13ffe 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderToRequestUriGatewayFilterFactoryIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderToRequestUriGatewayFilterFactoryIntegrationTests.java @@ -48,24 +48,34 @@ public class RequestHeaderToRequestUriGatewayFilterFactoryIntegrationTests exten @Test public void changeUriWorkWithProperties() { - testClient.get().uri("/").header("Host", "www.changeuri.org") - .header("X-CF-Forwarded-Url", "http://localhost:" + port + "/actuator/health").exchange() - .expectBody(JsonNode.class).consumeWith(r -> assertThat(r.getResponseBody().has("status")).isTrue()); + testClient.get() + .uri("/") + .header("Host", "www.changeuri.org") + .header("X-CF-Forwarded-Url", "http://localhost:" + port + "/actuator/health") + .exchange() + .expectBody(JsonNode.class) + .consumeWith(r -> assertThat(r.getResponseBody().has("status")).isTrue()); } @Test public void changeUriWorkWithDsl() { - testClient.get().uri("/").header("Host", "www.changeuri.org") - .header("X-Next-Url", "http://localhost:" + port + "/actuator/health").exchange() - .expectBody(JsonNode.class).consumeWith(r -> assertThat(r.getResponseBody().has("status")).isTrue()); + testClient.get() + .uri("/") + .header("Host", "www.changeuri.org") + .header("X-Next-Url", "http://localhost:" + port + "/actuator/health") + .exchange() + .expectBody(JsonNode.class) + .consumeWith(r -> assertThat(r.getResponseBody().has("status")).isTrue()); } @Test public void changeUriWorkWithCustomLogic() { testClient.get() - .uri(b -> b.path("/").queryParam("url", "http://localhost:" + port + "/actuator/health").build()) - .header("Host", "www.changeuri.org").exchange().expectBody(JsonNode.class) - .consumeWith(r -> assertThat(r.getResponseBody().has("status")).isTrue()); + .uri(b -> b.path("/").queryParam("url", "http://localhost:" + port + "/actuator/health").build()) + .header("Host", "www.changeuri.org") + .exchange() + .expectBody(JsonNode.class) + .consumeWith(r -> assertThat(r.getResponseBody().has("status")).isTrue()); } @EnableAutoConfiguration @@ -76,13 +86,18 @@ public class RequestHeaderToRequestUriGatewayFilterFactoryIntegrationTests exten @Bean public RouteLocator routeLocator(RouteLocatorBuilder builder) { return builder.routes() - .route(r -> r.host("**.changeuri.org").and().header("X-Next-Url") - .filters(f -> f.requestHeaderToRequestUri("X-Next-Url")).uri("https://example.com")) - .route(r -> r.host("**.changeuri.org").and().query("url") - .filters(f -> f.changeRequestUri( - e -> Optional.of(URI.create(e.getRequest().getQueryParams().getFirst("url"))))) - .uri("https://example.com")) - .build(); + .route(r -> r.host("**.changeuri.org") + .and() + .header("X-Next-Url") + .filters(f -> f.requestHeaderToRequestUri("X-Next-Url")) + .uri("https://example.com")) + .route(r -> r.host("**.changeuri.org") + .and() + .query("url") + .filters(f -> f.changeRequestUri( + e -> Optional.of(URI.create(e.getRequest().getQueryParams().getFirst("url"))))) + .uri("https://example.com")) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderToRequestUriGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderToRequestUriGatewayFilterFactoryTests.java index 16253ff6..b1cb8616 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderToRequestUriGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestHeaderToRequestUriGatewayFilterFactoryTests.java @@ -44,7 +44,8 @@ public class RequestHeaderToRequestUriGatewayFilterFactoryTests { RequestHeaderToRequestUriGatewayFilterFactory factory = new RequestHeaderToRequestUriGatewayFilterFactory(); GatewayFilter filter = factory.apply(c -> c.setName("X-CF-Forwarded-Url")); MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost") - .header("X-CF-Forwarded-Url", "https://example.com").build(); + .header("X-CF-Forwarded-Url", "https://example.com") + .build(); ServerWebExchange exchange = MockServerWebExchange.from(request); exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, URI.create("http://localhost")); GatewayFilterChain filterChain = mock(GatewayFilterChain.class); @@ -79,7 +80,8 @@ public class RequestHeaderToRequestUriGatewayFilterFactoryTests { RequestHeaderToRequestUriGatewayFilterFactory factory = new RequestHeaderToRequestUriGatewayFilterFactory(); GatewayFilter filter = factory.apply(c -> c.setName("X-CF-Forwarded-Url")); MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost") - .header("X-CF-Forwarded-Url", "example").build(); + .header("X-CF-Forwarded-Url", "example") + .build(); ServerWebExchange exchange = MockServerWebExchange.from(request); exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, URI.create("http://localhost")); GatewayFilterChain filterChain = mock(GatewayFilterChain.class); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactoryTests.java index 8f7b825b..5d1dfe53 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactoryTests.java @@ -111,13 +111,14 @@ public class RequestRateLimiterGatewayFilterFactoryTests extends BaseWebClientTe MockServerHttpRequest request = MockServerHttpRequest.get("/").build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); exchange.getResponse().setStatusCode(HttpStatus.OK); - exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR, - Route.async().id("myroute").predicate(ex -> true).uri("http://localhost").build()); + exchange.getAttributes() + .put(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR, + Route.async().id("myroute").predicate(ex -> true).uri("http://localhost").build()); when(this.filterChain.filter(exchange)).thenReturn(Mono.empty()); RequestRateLimiterGatewayFilterFactory factory = this.context - .getBean(RequestRateLimiterGatewayFilterFactory.class); + .getBean(RequestRateLimiterGatewayFilterFactory.class); if (denyEmptyKey != null) { factory.setDenyEmptyKey(denyEmptyKey); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestSizeGatewayFilterFactoryTest.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestSizeGatewayFilterFactoryTest.java index 2dd2adc3..6d4da7af 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestSizeGatewayFilterFactoryTest.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestSizeGatewayFilterFactoryTest.java @@ -49,9 +49,16 @@ public class RequestSizeGatewayFilterFactoryTest extends BaseWebClientTests { @Test public void setRequestSizeFilterWorks() { - testClient.post().uri("/post").header("Host", "www.setrequestsize.org").header("content-length", "6") - .bodyValue("123456").exchange().expectStatus().isEqualTo(HttpStatus.PAYLOAD_TOO_LARGE).expectHeader() - .valueMatches("errorMessage", responseMesssage); + testClient.post() + .uri("/post") + .header("Host", "www.setrequestsize.org") + .header("content-length", "6") + .bodyValue("123456") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.PAYLOAD_TOO_LARGE) + .expectHeader() + .valueMatches("errorMessage", responseMesssage); } @Test @@ -73,9 +80,9 @@ public class RequestSizeGatewayFilterFactoryTest extends BaseWebClientTests { @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("test_request_size", - r -> r.order(-1).host("**.setrequestsize.org").filters(f -> f.setRequestSize(5L)).uri(uri)) - .build(); + .route("test_request_size", + r -> r.order(-1).host("**.setrequestsize.org").filters(f -> f.setRequestSize(5L)).uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RetryGatewayFilterFactoryIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RetryGatewayFilterFactoryIntegrationTests.java index 2f7689bc..192411b1 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RetryGatewayFilterFactoryIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RetryGatewayFilterFactoryIntegrationTests.java @@ -82,11 +82,19 @@ public class RetryGatewayFilterFactoryIntegrationTests extends BaseWebClientTest @Test public void retryFilterFailure() { - testClient.mutate().responseTimeout(Duration.ofSeconds(10)).build().get() - .uri("/retryalwaysfail?key=getjavafailure&count=4").header(HttpHeaders.HOST, "www.retryjava.org") - .exchange().expectStatus().is5xxServerError().expectBody(String.class).consumeWith(result -> { - assertThat(result.getResponseBody()).contains("permanently broken"); - }); + testClient.mutate() + .responseTimeout(Duration.ofSeconds(10)) + .build() + .get() + .uri("/retryalwaysfail?key=getjavafailure&count=4") + .header(HttpHeaders.HOST, "www.retryjava.org") + .exchange() + .expectStatus() + .is5xxServerError() + .expectBody(String.class) + .consumeWith(result -> { + assertThat(result.getResponseBody()).contains("permanently broken"); + }); } @Test @@ -103,67 +111,113 @@ public class RetryGatewayFilterFactoryIntegrationTests extends BaseWebClientTest @Test public void retryFilterGetJavaDsl() { - testClient.get().uri("/retry?key=getjava&count=2").header(HttpHeaders.HOST, "www.retryjava.org").exchange() - .expectStatus().isOk().expectBody(String.class).isEqualTo("2"); + testClient.get() + .uri("/retry?key=getjava&count=2") + .header(HttpHeaders.HOST, "www.retryjava.org") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("2"); } @Test public void retryFilterPost(CapturedOutput output) { - testClient.post().uri("/retrypost?key=postconfig&expectedbody=HelloConfig") - .header(HttpHeaders.HOST, "www.retrypostconfig.org").bodyValue("HelloConfig").exchange().expectStatus() - .isOk().expectBody(String.class).isEqualTo("3"); + testClient.post() + .uri("/retrypost?key=postconfig&expectedbody=HelloConfig") + .header(HttpHeaders.HOST, "www.retrypostconfig.org") + .bodyValue("HelloConfig") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("3"); assertThat(output).contains("disposing response connection before next iteration"); } @Test public void retryFilterPostJavaDsl() { - testClient.post().uri("/retrypost?key=post&expectedbody=Hello").header(HttpHeaders.HOST, "www.retryjava.org") - .bodyValue("Hello").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("3"); + testClient.post() + .uri("/retrypost?key=post&expectedbody=Hello") + .header(HttpHeaders.HOST, "www.retryjava.org") + .bodyValue("Hello") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("3"); } @Test public void retryFilterPostOneTime(CapturedOutput output) { - testClient.post().uri("/retrypost?key=retryFilterPostOneTime&expectedbody=HelloGateway&count=1") - .header(HttpHeaders.HOST, "www.retrypostonceconfig.org").bodyValue("HelloGateway").exchange() - .expectStatus().isOk(); + testClient.post() + .uri("/retrypost?key=retryFilterPostOneTime&expectedbody=HelloGateway&count=1") + .header(HttpHeaders.HOST, "www.retrypostonceconfig.org") + .bodyValue("HelloGateway") + .exchange() + .expectStatus() + .isOk(); assertThat(output).contains("setting new iteration in attr 0"); assertThat(output).doesNotContain("setting new iteration in attr 1"); } @Test public void retriesSleepyRequest() throws Exception { - testClient.mutate().responseTimeout(Duration.ofSeconds(10)).build().get() - .uri("/sleep?key=sleepyRequest&millis=3000").header(HttpHeaders.HOST, "www.retryjava.org").exchange() - .expectStatus().isEqualTo(HttpStatus.GATEWAY_TIMEOUT); + testClient.mutate() + .responseTimeout(Duration.ofSeconds(10)) + .build() + .get() + .uri("/sleep?key=sleepyRequest&millis=3000") + .header(HttpHeaders.HOST, "www.retryjava.org") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.GATEWAY_TIMEOUT); assertThat(TestConfig.map.get("sleepyRequest")).isNotNull().hasValue(3); } @Test public void shouldNotRetryWhenSleepyRequestPost() throws Exception { - testClient.mutate().responseTimeout(Duration.ofSeconds(10)).build().post() - .uri("/sleep?key=notRetriesSleepyRequestPost&millis=3000") - .header(HttpHeaders.HOST, "www.retry-only-get.org").exchange().expectStatus() - .isEqualTo(HttpStatus.GATEWAY_TIMEOUT); + testClient.mutate() + .responseTimeout(Duration.ofSeconds(10)) + .build() + .post() + .uri("/sleep?key=notRetriesSleepyRequestPost&millis=3000") + .header(HttpHeaders.HOST, "www.retry-only-get.org") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.GATEWAY_TIMEOUT); assertThat(TestConfig.map.get("notRetriesSleepyRequestPost")).isNotNull().hasValue(1); } @Test public void shouldNotRetryWhenSleepyRequestPostWithBody() throws Exception { - testClient.mutate().responseTimeout(Duration.ofSeconds(10)).build().post() - .uri("/sleep?key=notRetriesSleepyRequestPostWithBody&millis=3000") - .header(HttpHeaders.HOST, "www.retry-only-get.org").bodyValue("retry sleepy post with body").exchange() - .expectStatus().isEqualTo(HttpStatus.GATEWAY_TIMEOUT); + testClient.mutate() + .responseTimeout(Duration.ofSeconds(10)) + .build() + .post() + .uri("/sleep?key=notRetriesSleepyRequestPostWithBody&millis=3000") + .header(HttpHeaders.HOST, "www.retry-only-get.org") + .bodyValue("retry sleepy post with body") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.GATEWAY_TIMEOUT); assertThat(TestConfig.map.get("notRetriesSleepyRequestPostWithBody")).isNotNull().hasValue(1); } @Test public void shouldRetryWhenSleepyRequestGet() throws Exception { - testClient.mutate().responseTimeout(Duration.ofSeconds(10)).build().get() - .uri("/sleep?key=sleepyRequestGet&millis=3000").header(HttpHeaders.HOST, "www.retry-only-get.org") - .exchange().expectStatus().isEqualTo(HttpStatus.GATEWAY_TIMEOUT); + testClient.mutate() + .responseTimeout(Duration.ofSeconds(10)) + .build() + .get() + .uri("/sleep?key=sleepyRequestGet&millis=3000") + .header(HttpHeaders.HOST, "www.retry-only-get.org") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.GATEWAY_TIMEOUT); assertThat(TestConfig.map.get("sleepyRequestGet")).isNotNull().hasValue(3); } @@ -172,19 +226,31 @@ public class RetryGatewayFilterFactoryIntegrationTests extends BaseWebClientTest @SuppressWarnings("unchecked") public void retryFilterLoadBalancedWithMultipleServers() { String host = "www.retrywithloadbalancer.org"; - testClient.get().uri("/get").header(HttpHeaders.HOST, host).exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(res -> { - Map body = res.getResponseBody(); - assertThat(body).isNotNull(); - Map headers = (Map) body.get("headers"); - assertThat(headers).containsEntry("X-Forwarded-Host", host); - }); + testClient.get() + .uri("/get") + .header(HttpHeaders.HOST, host) + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map body = res.getResponseBody(); + assertThat(body).isNotNull(); + Map headers = (Map) body.get("headers"); + assertThat(headers).containsEntry("X-Forwarded-Host", host); + }); } @Test public void retryFilterSeries() { - testClient.get().uri("/retry?key=series&failStatus=404").header(HttpHeaders.HOST, "www.retryseries.org") - .exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("3"); + testClient.get() + .uri("/retry?key=series&failStatus=404") + .header(HttpHeaders.HOST, "www.retryseries.org") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("3"); } @Test @@ -196,8 +262,10 @@ public class RetryGatewayFilterFactoryIntegrationTests extends BaseWebClientTest config.setSeries(HttpStatus.Series.SERVER_ERROR); config.setExceptions(IOException.class); GatewayFilter filter = new RetryGatewayFilterFactory().apply(config); - assertThat(filter.toString()).contains("4").contains("[GET]").contains("[SERVER_ERROR]") - .contains("[IOException]"); + assertThat(filter.toString()).contains("4") + .contains("[GET]") + .contains("[SERVER_ERROR]") + .contains("[IOException]"); } @RestController @@ -220,8 +288,10 @@ public class RetryGatewayFilterFactoryIntegrationTests extends BaseWebClientTest AtomicInteger num = getCount(key); int retryCount = num.incrementAndGet(); log.warn("Retry count: " + retryCount); - return Mono.delay(Duration.ofMillis(millisToSleep)).thenReturn(ResponseEntity.status(HttpStatus.OK) - .header("X-Retry-Count", String.valueOf(retryCount)).body("slept " + millisToSleep + " ms")); + return Mono.delay(Duration.ofMillis(millisToSleep)) + .thenReturn(ResponseEntity.status(HttpStatus.OK) + .header("X-Retry-Count", String.valueOf(retryCount)) + .body("slept " + millisToSleep + " ms")); } @GetMapping("/httpbin/retryalwaysfail") @@ -230,8 +300,9 @@ public class RetryGatewayFilterFactoryIntegrationTests extends BaseWebClientTest AtomicInteger num = getCount(key); int i = num.incrementAndGet(); log.warn("Retry count: " + i); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).header("X-Retry-Count", String.valueOf(i)) - .body("permanently broken"); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .header("X-Retry-Count", String.valueOf(i)) + .body("permanently broken"); } @PostMapping("/httpbin/retrypost") @@ -242,7 +313,8 @@ public class RetryGatewayFilterFactoryIntegrationTests extends BaseWebClientTest if (!expectedbody.equals(body)) { AtomicInteger num = getCount(key); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .header("X-Retry-Count", String.valueOf(num)).body("body did not match on try" + num); + .header("X-Retry-Count", String.valueOf(num)) + .body("body did not match on try" + num); } return response; } @@ -271,31 +343,32 @@ public class RetryGatewayFilterFactoryIntegrationTests extends BaseWebClientTest @Bean public RouteLocator hystrixRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("retry_java", - r -> r.host("**.retryjava.org") + return builder.routes() + .route("retry_java", + r -> r.host("**.retryjava.org") .filters(f -> f.prefixPath("/httpbin") - .retry(config -> config.setRetries(2).setMethods(HttpMethod.POST, HttpMethod.GET))) + .retry(config -> config.setRetries(2).setMethods(HttpMethod.POST, HttpMethod.GET))) .uri(uri)) - .route("retry_series", - r -> r.host("**.retryseries.org") - .filters(f -> f.prefixPath("/httpbin").retry( - config -> config.setRetries(2).setSeries(HttpStatus.Series.CLIENT_ERROR))) - .uri(uri)) - .route("retry_only_get", - r -> r.host("**.retry-only-get.org") - .filters(f -> f.prefixPath("/httpbin") - .retry(config -> config.setRetries(2).setMethods(HttpMethod.GET))) - .uri(uri)) - .route("retry_with_backoff", r -> r.host("**.retrywithbackoff.org") - .filters(f -> f.prefixPath("/httpbin").retry(config -> { - config.setRetries(2).setBackoff(Duration.ofMillis(100), null, 2, true); - })).uri(uri)) + .route("retry_series", + r -> r.host("**.retryseries.org") + .filters(f -> f.prefixPath("/httpbin") + .retry(config -> config.setRetries(2).setSeries(HttpStatus.Series.CLIENT_ERROR))) + .uri(uri)) + .route("retry_only_get", + r -> r.host("**.retry-only-get.org") + .filters(f -> f.prefixPath("/httpbin") + .retry(config -> config.setRetries(2).setMethods(HttpMethod.GET))) + .uri(uri)) + .route("retry_with_backoff", + r -> r.host("**.retrywithbackoff.org").filters(f -> f.prefixPath("/httpbin").retry(config -> { + config.setRetries(2).setBackoff(Duration.ofMillis(100), null, 2, true); + })).uri(uri)) - .route("retry_with_loadbalancer", - r -> r.host("**.retrywithloadbalancer.org") - .filters(f -> f.prefixPath("/httpbin").retry(config -> config.setRetries(2))) - .uri("lb://badservice2")) - .build(); + .route("retry_with_loadbalancer", + r -> r.host("**.retrywithloadbalancer.org") + .filters(f -> f.prefixPath("/httpbin").retry(config -> config.setRetries(2))) + .uri("lb://badservice2")) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteLocationResponseHeaderGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteLocationResponseHeaderGatewayFilterFactoryTests.java index 318a1033..e945b91e 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteLocationResponseHeaderGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteLocationResponseHeaderGatewayFilterFactoryTests.java @@ -33,9 +33,14 @@ public class RewriteLocationResponseHeaderGatewayFilterFactoryTests extends Base @Test public void rewriteLocationResponseHeaderFilterWorks() { - testClient.post().uri("/headers").header("Host", "test1.rewritelocationresponseheader.org").exchange() - .expectStatus().isOk().expectHeader() - .valueEquals("Location", "https://test1.rewritelocationresponseheader.org/some/object/id"); + testClient.post() + .uri("/headers") + .header("Host", "test1.rewritelocationresponseheader.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("Location", "https://test1.rewritelocationresponseheader.org/some/object/id"); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteLocationResponseHeaderGatewayFilterFactoryUnitTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteLocationResponseHeaderGatewayFilterFactoryUnitTests.java index ae04e904..fcc13c12 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteLocationResponseHeaderGatewayFilterFactoryUnitTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteLocationResponseHeaderGatewayFilterFactoryUnitTests.java @@ -134,7 +134,8 @@ public class RewriteLocationResponseHeaderGatewayFilterFactoryUnitTests { String path = "/v1/path/to/riches"; setupTest(location, host, path); assertThat(filter.fixedLocation(location, host, path, StripVersion.ALWAYS_STRIP, config.getHostPortPattern(), - config.getHostPortVersionPattern())).isEqualTo("https://example.com:443/path/to/riches"); + config.getHostPortVersionPattern())) + .isEqualTo("https://example.com:443/path/to/riches"); } @Test @@ -144,7 +145,8 @@ public class RewriteLocationResponseHeaderGatewayFilterFactoryUnitTests { String path = "/v1/path/to/riches"; setupTest(location, host, path); assertThat(filter.fixedLocation(location, host, path, StripVersion.AS_IN_REQUEST, config.getHostPortPattern(), - config.getHostPortVersionPattern())).isEqualTo("https://example.com:443/v1/path/to/riches"); + config.getHostPortVersionPattern())) + .isEqualTo("https://example.com:443/v1/path/to/riches"); } @Test @@ -154,7 +156,8 @@ public class RewriteLocationResponseHeaderGatewayFilterFactoryUnitTests { String path = "/v1/path/to/riches"; setupTest(location, host, path); assertThat(filter.fixedLocation(location, host, path, StripVersion.NEVER_STRIP, config.getHostPortPattern(), - config.getHostPortVersionPattern())).isEqualTo("https://example.com:443/v1/path/to/riches"); + config.getHostPortVersionPattern())) + .isEqualTo("https://example.com:443/v1/path/to/riches"); } @Test @@ -164,7 +167,8 @@ public class RewriteLocationResponseHeaderGatewayFilterFactoryUnitTests { String path = "/path/to/riches"; setupTest(location, host, path); assertThat(filter.fixedLocation(location, host, path, StripVersion.ALWAYS_STRIP, config.getHostPortPattern(), - config.getHostPortVersionPattern())).isEqualTo("https://api.example.com:443/path/to/riches"); + config.getHostPortVersionPattern())) + .isEqualTo("https://api.example.com:443/path/to/riches"); } @Test @@ -174,7 +178,8 @@ public class RewriteLocationResponseHeaderGatewayFilterFactoryUnitTests { String path = "/path/to/riches"; setupTest(location, host, path); assertThat(filter.fixedLocation(location, host, path, StripVersion.AS_IN_REQUEST, config.getHostPortPattern(), - config.getHostPortVersionPattern())).isEqualTo("https://api.example.com:443/path/to/riches"); + config.getHostPortVersionPattern())) + .isEqualTo("https://api.example.com:443/path/to/riches"); } @Test @@ -184,7 +189,8 @@ public class RewriteLocationResponseHeaderGatewayFilterFactoryUnitTests { String path = "/path/to/riches"; setupTest(location, host, path); assertThat(filter.fixedLocation(location, host, path, StripVersion.NEVER_STRIP, config.getHostPortPattern(), - config.getHostPortVersionPattern())).isEqualTo("https://api.example.com:443/v2/path/to/riches"); + config.getHostPortVersionPattern())) + .isEqualTo("https://api.example.com:443/v2/path/to/riches"); } @Test @@ -194,7 +200,8 @@ public class RewriteLocationResponseHeaderGatewayFilterFactoryUnitTests { String path = "/path/to/riches"; setupTest(location, host, path); assertThat(filter.fixedLocation(location, host, path, StripVersion.AS_IN_REQUEST, config.getHostPortPattern(), - config.getHostPortVersionPattern())).isEqualTo("https://api.example.com:443/path/to/riches"); + config.getHostPortVersionPattern())) + .isEqualTo("https://api.example.com:443/path/to/riches"); } @Test diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewritePathGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewritePathGatewayFilterFactoryTests.java index 18ec28c5..5f6781e0 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewritePathGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewritePathGatewayFilterFactoryTests.java @@ -61,7 +61,7 @@ public class RewritePathGatewayFilterFactoryTests { private ServerWebExchange testRewriteFilter(String regex, String replacement, String actualPath, String expectedPath) { GatewayFilter filter = new RewritePathGatewayFilterFactory() - .apply(c -> c.setRegexp(regex).setReplacement(replacement)); + .apply(c -> c.setRegexp(regex).setReplacement(replacement)); URI url = UriComponentsBuilder.fromUriString("http://localhost" + actualPath).build(true).toUri(); MockServerHttpRequest request = MockServerHttpRequest.method(HttpMethod.GET, url).build(); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteRequestParameterGatewayFilterFactoryIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteRequestParameterGatewayFilterFactoryIntegrationTests.java index 26d49797..d5951c29 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteRequestParameterGatewayFilterFactoryIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteRequestParameterGatewayFilterFactoryIntegrationTests.java @@ -36,8 +36,14 @@ class RewriteRequestParameterGatewayFilterFactoryIntegrationTests extends BaseWe @Test void rewriteRequestParameterFilterWorks() { - testClient.get().uri("/get?campaign=old").header("Host", "www.rewriterequestparameter.org").exchange() - .expectStatus().isOk().expectBody().jsonPath("$.args.size", "fall2023"); + testClient.get() + .uri("/get?campaign=old") + .header("Host", "www.rewriterequestparameter.org") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .jsonPath("$.args.size", "fall2023"); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteRequestParameterGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteRequestParameterGatewayFilterFactoryTests.java index 9efd0924..9df80c61 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteRequestParameterGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteRequestParameterGatewayFilterFactoryTests.java @@ -79,7 +79,7 @@ class RewriteRequestParameterGatewayFilterFactoryTests { private void testRewriteRequestParameterFilter(String name, String replacement, String query, Map> expectedQueryParams) { GatewayFilter filter = new RewriteRequestParameterGatewayFilterFactory() - .apply(config -> config.setReplacement(replacement).setName(name)); + .apply(config -> config.setReplacement(replacement).setName(name)); URI url = UriComponentsBuilder.fromUriString("http://localhost/get").query(query).build(true).toUri(); MockServerHttpRequest request = MockServerHttpRequest.method(HttpMethod.GET, url).build(); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteResponseHeaderGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteResponseHeaderGatewayFilterFactoryTests.java index db65493f..55047ab7 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteResponseHeaderGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteResponseHeaderGatewayFilterFactoryTests.java @@ -33,8 +33,14 @@ public class RewriteResponseHeaderGatewayFilterFactoryTests extends BaseWebClien @Test public void rewriteResponseHeaderFilterWorks() { - testClient.get().uri("/headers").header("Host", "www.rewriteresponseheader.org").exchange().expectStatus() - .isOk().expectHeader().valueEquals("X-Request-Foo", "/42?user=ford&password=***&flag=true"); + testClient.get() + .uri("/headers") + .header("Host", "www.rewriteresponseheader.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-Request-Foo", "/42?user=ford&password=***&flag=true"); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteResponseHeaderGatewayFilterFactoryUnitTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteResponseHeaderGatewayFilterFactoryUnitTests.java index eeba7e0a..6a0d1b1a 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteResponseHeaderGatewayFilterFactoryUnitTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/RewriteResponseHeaderGatewayFilterFactoryUnitTests.java @@ -44,7 +44,7 @@ public class RewriteResponseHeaderGatewayFilterFactoryUnitTests { @Test public void testRewriteDollarSlash() { assertThat(filterFactory.rewrite("/foo/bar", "/foo/(?.*)", "/$\\{segment}/$\\{segment}/42")) - .isEqualTo("/bar/bar/42"); + .isEqualTo("/bar/bar/42"); } @Test diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SecureHeadersGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SecureHeadersGatewayFilterFactoryTests.java index 11c104a9..1742a19e 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SecureHeadersGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SecureHeadersGatewayFilterFactoryTests.java @@ -49,8 +49,10 @@ public class SecureHeadersGatewayFilterFactoryTests extends BaseWebClientTests { @Test public void secureHeadersFilterWorks() { - Mono result = webClient.get().uri("/headers").header("Host", "www.secureheaders.org") - .exchangeToMono(Mono::just); + Mono result = webClient.get() + .uri("/headers") + .header("Host", "www.secureheaders.org") + .exchangeToMono(Mono::just); SecureHeadersProperties defaults = new SecureHeadersProperties(); @@ -59,23 +61,27 @@ public class SecureHeadersGatewayFilterFactoryTests extends BaseWebClientTests { HttpHeaders httpHeaders = response.headers().asHttpHeaders(); // assertThat(httpHeaders.getFirst(X_XSS_PROTECTION_HEADER)).isEqualTo(defaults.getXssProtectionHeader()); assertThat(httpHeaders.getFirst(STRICT_TRANSPORT_SECURITY_HEADER)) - .isEqualTo(defaults.getStrictTransportSecurity()); + .isEqualTo(defaults.getStrictTransportSecurity()); assertThat(httpHeaders.getFirst(X_FRAME_OPTIONS_HEADER)).isEqualTo(defaults.getFrameOptions()); assertThat(httpHeaders.getFirst(X_CONTENT_TYPE_OPTIONS_HEADER)).isEqualTo(defaults.getContentTypeOptions()); assertThat(httpHeaders.getFirst(REFERRER_POLICY_HEADER)).isEqualTo(defaults.getReferrerPolicy()); assertThat(httpHeaders.getFirst(CONTENT_SECURITY_POLICY_HEADER)) - .isEqualTo(defaults.getContentSecurityPolicy()); + .isEqualTo(defaults.getContentSecurityPolicy()); assertThat(httpHeaders.getFirst(X_DOWNLOAD_OPTIONS_HEADER)).isEqualTo(defaults.getDownloadOptions()); assertThat(httpHeaders.getFirst(X_PERMITTED_CROSS_DOMAIN_POLICIES_HEADER)) - .isEqualTo(defaults.getPermittedCrossDomainPolicies()); + .isEqualTo(defaults.getPermittedCrossDomainPolicies()); }).expectComplete().verify(DURATION); } @Test public void addsSecureHeadersAfterResponseIsReceived() { - Mono> responseEntity = webClient.patch().uri("/headers") - .header("Host", "www.secureheaders.org").contentType(MediaType.APPLICATION_JSON) - .bodyValue("{ \"X-Frame-Options\": \"sameorigin\" }").retrieve().toEntity(String.class); + Mono> responseEntity = webClient.patch() + .uri("/headers") + .header("Host", "www.secureheaders.org") + .contentType(MediaType.APPLICATION_JSON) + .bodyValue("{ \"X-Frame-Options\": \"sameorigin\" }") + .retrieve() + .toEntity(String.class); StepVerifier.create(responseEntity).consumeNextWith(response -> { assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SecureHeadersGatewayFilterFactoryUnitTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SecureHeadersGatewayFilterFactoryUnitTests.java index 167238a1..65dc9809 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SecureHeadersGatewayFilterFactoryUnitTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SecureHeadersGatewayFilterFactoryUnitTests.java @@ -120,15 +120,15 @@ public class SecureHeadersGatewayFilterFactoryUnitTests { assertThat(response.getHeaders().get(REFERRER_POLICY_HEADER)).containsOnly("referrer"); assertThat(response.getHeaders().get(X_XSS_PROTECTION_HEADER)) - .containsOnly(properties.getXssProtectionHeader()); + .containsOnly(properties.getXssProtectionHeader()); assertThat(response.getHeaders().get(X_FRAME_OPTIONS_HEADER)).containsOnly(properties.getFrameOptions()); assertThat(response.getHeaders().get(X_CONTENT_TYPE_OPTIONS_HEADER)) - .containsOnly(properties.getContentTypeOptions()); + .containsOnly(properties.getContentTypeOptions()); assertThat(response.getHeaders().get(CONTENT_SECURITY_POLICY_HEADER)) - .containsOnly(properties.getContentSecurityPolicy()); + .containsOnly(properties.getContentSecurityPolicy()); assertThat(response.getHeaders().get(X_DOWNLOAD_OPTIONS_HEADER)).containsOnly(properties.getDownloadOptions()); assertThat(response.getHeaders().get(X_PERMITTED_CROSS_DOMAIN_POLICIES_HEADER)) - .containsOnly(properties.getPermittedCrossDomainPolicies()); + .containsOnly(properties.getPermittedCrossDomainPolicies()); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetPathGatewayFilterFactoryIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetPathGatewayFilterFactoryIntegrationTests.java index c58a57c6..c5050847 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetPathGatewayFilterFactoryIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetPathGatewayFilterFactoryIntegrationTests.java @@ -33,14 +33,26 @@ public class SetPathGatewayFilterFactoryIntegrationTests extends BaseWebClientTe @Test public void setPathFilterDefaultValuesWork() { - testClient.get().uri("/foo/get").header("Host", "www.setpath.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals(ROUTE_ID_HEADER, "set_path_test"); + testClient.get() + .uri("/foo/get") + .header("Host", "www.setpath.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "set_path_test"); } @Test public void setPathViaHostFilterWork() { - testClient.get().uri("/").header("Host", "get.setpathhost.org").exchange().expectStatus().isOk().expectHeader() - .valueEquals(ROUTE_ID_HEADER, "set_path_host_test"); + testClient.get() + .uri("/") + .header("Host", "get.setpathhost.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "set_path_host_test"); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetRequestHeaderGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetRequestHeaderGatewayFilterFactoryTests.java index f3386d34..0ace6c7d 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetRequestHeaderGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetRequestHeaderGatewayFilterFactoryTests.java @@ -47,13 +47,19 @@ public class SetRequestHeaderGatewayFilterFactoryTests extends BaseWebClientTest @Test public void setRequestHeaderFilterWorks() { - testClient.get().uri("/headers").header("Host", "www.setrequestheader.org").exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - // add was called first, so sets will overwrite - assertThat(headers).doesNotContainEntry("X-Req-Foo", "First"); - assertThat(headers).containsEntry("X-Req-Foo", "Second-www"); - }); + testClient.get() + .uri("/headers") + .header("Host", "www.setrequestheader.org") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + // add was called first, so sets will overwrite + assertThat(headers).doesNotContainEntry("X-Req-Foo", "First"); + assertThat(headers).containsEntry("X-Req-Foo", "Second-www"); + }); } @Test @@ -73,11 +79,15 @@ public class SetRequestHeaderGatewayFilterFactoryTests extends BaseWebClientTest @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("test_set_request_header", - r -> r.order(-1).host("{sub}.setrequestheader.org").filters(f -> f.prefixPath("/httpbin") - .addRequestHeader("X-Req-Foo", "First").setRequestHeader("X-Req-Foo", "Second-{sub}")) + return builder.routes() + .route("test_set_request_header", + r -> r.order(-1) + .host("{sub}.setrequestheader.org") + .filters(f -> f.prefixPath("/httpbin") + .addRequestHeader("X-Req-Foo", "First") + .setRequestHeader("X-Req-Foo", "Second-{sub}")) .uri(uri)) - .build(); + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetRequestHostHeaderGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetRequestHostHeaderGatewayFilterFactoryTests.java index 416f9ec0..b45438c8 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetRequestHostHeaderGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetRequestHostHeaderGatewayFilterFactoryTests.java @@ -38,11 +38,17 @@ public class SetRequestHostHeaderGatewayFilterFactoryTests extends BaseWebClient @Test public void setRequestHostHeaderFilterWorks() { - testClient.get().uri("/headers").header("Host", "www.setrequesthostheader.org").exchange().expectStatus().isOk() - .expectBody(Map.class).consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).hasEntrySatisfying("Host", val -> assertThat(val).isEqualTo("otherhost.io")); - }); + testClient.get() + .uri("/headers") + .header("Host", "www.setrequesthostheader.org") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).hasEntrySatisfying("Host", val -> assertThat(val).isEqualTo("otherhost.io")); + }); } @Test diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetResponseHeaderGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetResponseHeaderGatewayFilterFactoryTests.java index 7bfe96f9..dff3004d 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetResponseHeaderGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetResponseHeaderGatewayFilterFactoryTests.java @@ -40,14 +40,26 @@ public class SetResponseHeaderGatewayFilterFactoryTests extends BaseWebClientTes @Test public void setResponseHeaderFilterWorks() { - testClient.get().uri("/headers").header("Host", "www.setreresponseheader.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals("X-Response-Foo", "Bar"); + testClient.get() + .uri("/headers") + .header("Host", "www.setreresponseheader.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-Response-Foo", "Bar"); } @Test public void setResponseHeaderFilterWorksJavaDsl() { - testClient.get().uri("/headers").header("Host", "www.setresponseheaderdsl.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals("X-Res-Foo", "Second-www"); + testClient.get() + .uri("/headers") + .header("Host", "www.setresponseheaderdsl.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-Res-Foo", "Second-www"); } @Test @@ -67,11 +79,15 @@ public class SetResponseHeaderGatewayFilterFactoryTests extends BaseWebClientTes @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("test_set_response_header_dsl", - r -> r.order(-1).host("{sub}.setresponseheaderdsl.org").filters(f -> f.prefixPath("/httpbin") - .setResponseHeader("X-Res-Foo", "Second-{sub}").addResponseHeader("X-Res-Foo", "First")) + return builder.routes() + .route("test_set_response_header_dsl", + r -> r.order(-1) + .host("{sub}.setresponseheaderdsl.org") + .filters(f -> f.prefixPath("/httpbin") + .setResponseHeader("X-Res-Foo", "Second-{sub}") + .addResponseHeader("X-Res-Foo", "First")) .uri(uri)) - .build(); + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetStatusGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetStatusGatewayFilterFactoryTests.java index 59c46287..d4db2df9 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetStatusGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SetStatusGatewayFilterFactoryTests.java @@ -79,8 +79,8 @@ public class SetStatusGatewayFilterFactoryTests extends BaseWebClientTests { public void shouldSetStatusIntAndAddOriginalHeader() { String headerName = "original-http-status"; filterFactory.setOriginalStatusHeaderName(headerName); - setStatusStringTest("www.setstatusint.org", HttpStatus.UNAUTHORIZED).expectHeader().value(headerName, - Matchers.is("[200]")); + setStatusStringTest("www.setstatusint.org", HttpStatus.UNAUTHORIZED).expectHeader() + .value(headerName, Matchers.is("[200]")); } @@ -106,9 +106,10 @@ public class SetStatusGatewayFilterFactoryTests extends BaseWebClientTests { @Bean public RouteLocator enumRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("test_enum_http_status", - r -> r.host("*.setenumstatus.org").filters(f -> f.setStatus(HttpStatus.UNAUTHORIZED)).uri(uri)) - .build(); + return builder.routes() + .route("test_enum_http_status", + r -> r.host("*.setenumstatus.org").filters(f -> f.setStatus(HttpStatus.UNAUTHORIZED)).uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerFilterFactoryTests.java index 76aebf1e..9368ed5c 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerFilterFactoryTests.java @@ -31,15 +31,27 @@ public abstract class SpringCloudCircuitBreakerFilterFactoryTests extends BaseWe @Test public void cbFilterWorks() { - testClient.get().uri("/get").header("Host", "www.sccbsuccess.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals(ROUTE_ID_HEADER, "sccb_success_test"); + testClient.get() + .uri("/get") + .header("Host", "www.sccbsuccess.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "sccb_success_test"); } @Test public void cbFilterTimesout() { - testClient.get().uri("/delay/3").header("Host", "www.sccbtimeout.org").exchange().expectStatus() - .isEqualTo(HttpStatus.GATEWAY_TIMEOUT).expectBody().jsonPath("$.status") - .isEqualTo(String.valueOf(HttpStatus.GATEWAY_TIMEOUT.value())); + testClient.get() + .uri("/delay/3") + .header("Host", "www.sccbtimeout.org") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.GATEWAY_TIMEOUT) + .expectBody() + .jsonPath("$.status") + .isEqualTo(String.valueOf(HttpStatus.GATEWAY_TIMEOUT.value())); } /* @@ -51,91 +63,183 @@ public abstract class SpringCloudCircuitBreakerFilterFactoryTests extends BaseWe */ @Test public void timeoutFromWebClient() { - testClient.get().uri("/delay/10").header("Host", "www.circuitbreakerresponsestall.org").exchange() - .expectStatus().isEqualTo(HttpStatus.GATEWAY_TIMEOUT); + testClient.get() + .uri("/delay/10") + .header("Host", "www.circuitbreakerresponsestall.org") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.GATEWAY_TIMEOUT); } @Test public void filterFallback() { - testClient.get().uri("/delay/3?a=b").header("Host", "www.circuitbreakerfallback.org").exchange().expectStatus() - .isOk().expectBody().json("{\"from\":\"circuitbreakerfallbackcontroller\"}"); + testClient.get() + .uri("/delay/3?a=b") + .header("Host", "www.circuitbreakerfallback.org") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .json("{\"from\":\"circuitbreakerfallbackcontroller\"}"); } @Test public void filterWithVariables() { - testClient.get().uri("/delay/3/extra?a=b").header("Host", "www.circuitbreakervariables.org").exchange() - .expectStatus().isOk().expectBody() - .json("{\"uri\":\"/circuitbreakerUriFallbackController/3/extra/www?a=b\"}"); + testClient.get() + .uri("/delay/3/extra?a=b") + .header("Host", "www.circuitbreakervariables.org") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .json("{\"uri\":\"/circuitbreakerUriFallbackController/3/extra/www?a=b\"}"); } @Test public void filterFallbackPath() { - testClient.get().uri("/status/200").header("Host", "www.circuitbreakerfallbackpath.org").exchange() - .expectStatus().isOk().expectBody().jsonPath("$.headers").exists(); + testClient.get() + .uri("/status/200") + .header("Host", "www.circuitbreakerfallbackpath.org") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .jsonPath("$.headers") + .exists(); } @Test public void filterWorksJavaDsl() { - testClient.get().uri("/get").header("Host", "www.circuitbreakerjava.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals(ROUTE_ID_HEADER, "circuitbreaker_java"); + testClient.get() + .uri("/get") + .header("Host", "www.circuitbreakerjava.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "circuitbreaker_java"); } @Test public void filterFallbackJavaDsl() { - testClient.get().uri("/delay/3").header("Host", "www.circuitbreakerjava.org").exchange().expectStatus().isOk() - .expectBody().json("{\"from\":\"circuitbreakerfallbackcontroller2\"}"); + testClient.get() + .uri("/delay/3") + .header("Host", "www.circuitbreakerjava.org") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .json("{\"from\":\"circuitbreakerfallbackcontroller2\"}"); } @Test public void filterConnectFailure() { - testClient.get().uri("/delay/3").header("Host", "www.circuitbreakerconnectfail.org").exchange().expectStatus() - .is5xxServerError(); + testClient.get() + .uri("/delay/3") + .header("Host", "www.circuitbreakerconnectfail.org") + .exchange() + .expectStatus() + .is5xxServerError(); } @Test @DisabledIfEnvironmentVariable(named = "GITHUB_ACTIONS", matches = "true") public void filterErrorPage() { - testClient.get().uri("/delay/3").header("Host", "www.circuitbreakerconnectfail.org").accept(APPLICATION_JSON) - .exchange().expectStatus().is5xxServerError().expectBody().jsonPath("$.status").isEqualTo(504) - .jsonPath("$.message").isNotEmpty().jsonPath("$.error").isEqualTo("Gateway Timeout"); + testClient.get() + .uri("/delay/3") + .header("Host", "www.circuitbreakerconnectfail.org") + .accept(APPLICATION_JSON) + .exchange() + .expectStatus() + .is5xxServerError() + .expectBody() + .jsonPath("$.status") + .isEqualTo(504) + .jsonPath("$.message") + .isNotEmpty() + .jsonPath("$.error") + .isEqualTo("Gateway Timeout"); } @Test public void filterFallbackForward() { - testClient.get().uri("/delay/3?a=c").header("Host", "www.circuitbreakerforward.org").exchange().expectStatus() - .isOk().expectBody().json("{\"from\":\"circuitbreakerfallbackcontroller3\"}"); + testClient.get() + .uri("/delay/3?a=c") + .header("Host", "www.circuitbreakerforward.org") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .json("{\"from\":\"circuitbreakerfallbackcontroller3\"}"); } @Test public void filterFallbackForwardWithCORS() { - testClient.get().uri("/delay/3?a=b").header("Host", "www.circuitbreakerforward.org") - .header("Origin", "https://cors.withcircuitbreaker.org").exchange().expectStatus().isOk().expectBody() - .json("{\"from\":\"circuitbreakerfallbackcontroller3\"}"); + testClient.get() + .uri("/delay/3?a=b") + .header("Host", "www.circuitbreakerforward.org") + .header("Origin", "https://cors.withcircuitbreaker.org") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .json("{\"from\":\"circuitbreakerfallbackcontroller3\"}"); } @Test public void filterStatusCodeFallback() { - testClient.get().uri("/status/500").header("Host", "www.circuitbreakerstatuscode.org").exchange().expectStatus() - .isOk().expectBody().json("{\"from\":\"statusCodeFallbackController\"}"); + testClient.get() + .uri("/status/500") + .header("Host", "www.circuitbreakerstatuscode.org") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .json("{\"from\":\"statusCodeFallbackController\"}"); - testClient.get().uri("/status/404").header("Host", "www.circuitbreakerstatuscode.org").exchange().expectStatus() - .isOk().expectBody().json("{\"from\":\"statusCodeFallbackController\"}"); + testClient.get() + .uri("/status/404") + .header("Host", "www.circuitbreakerstatuscode.org") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .json("{\"from\":\"statusCodeFallbackController\"}"); - testClient.get().uri("/status/200").header("Host", "www.circuitbreakerstatuscode.org").exchange().expectStatus() - .isOk().expectHeader().valueEquals(ROUTE_ID_HEADER, "circuitbreaker_fallback_test_statuscode"); + testClient.get() + .uri("/status/200") + .header("Host", "www.circuitbreakerstatuscode.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "circuitbreaker_fallback_test_statuscode"); } @Test public void filterStatusCodeResumeWithoutError() { - testClient.get().uri("/status/500").header("Host", "www.circuitbreakerresumewithouterror.org").exchange() - .expectStatus().isEqualTo(500); + testClient.get() + .uri("/status/500") + .header("Host", "www.circuitbreakerresumewithouterror.org") + .exchange() + .expectStatus() + .isEqualTo(500); - testClient.get().uri("/status/404").header("Host", "www.circuitbreakerresumewithouterror.org").exchange() - .expectStatus().isEqualTo(404); + testClient.get() + .uri("/status/404") + .header("Host", "www.circuitbreakerresumewithouterror.org") + .exchange() + .expectStatus() + .isEqualTo(404); - testClient.get().uri("/status/200").header("Host", "www.circuitbreakerresumewithouterror.org").exchange() - .expectStatus().isOk().expectHeader() - .valueEquals(ROUTE_ID_HEADER, "circuitbreaker_resume_without_error"); + testClient.get() + .uri("/status/200") + .header("Host", "www.circuitbreakerresumewithouterror.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "circuitbreaker_resume_without_error"); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerResilience4JFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerResilience4JFilterFactoryTests.java index 5e745b49..10d199ba 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerResilience4JFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerResilience4JFilterFactoryTests.java @@ -60,41 +60,69 @@ public class SpringCloudCircuitBreakerResilience4JFilterFactoryTests @Test public void r4jFilterServiceUnavailable() { - testClient.get().uri("/delay/3").header("Host", "www.sccbfailure.org").exchange().expectStatus() - .isEqualTo(HttpStatus.SERVICE_UNAVAILABLE); + testClient.get() + .uri("/delay/3") + .header("Host", "www.sccbfailure.org") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.SERVICE_UNAVAILABLE); } @Test public void r4jFilterExceptionFallback() { - testClient.get().uri("/delay/3").header("Host", "www.circuitbreakerexceptionfallback.org").exchange() - .expectStatus().isOk().expectHeader().value(RETRIEVED_EXCEPTION, containsString("TimeoutException")); + testClient.get() + .uri("/delay/3") + .header("Host", "www.circuitbreakerexceptionfallback.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .value(RETRIEVED_EXCEPTION, containsString("TimeoutException")); } @Test public void cbFilterTimesoutMessage() { - testClient.get().uri("/delay/3").header("Host", "www.sccbtimeout.org").exchange().expectStatus() - .isEqualTo(HttpStatus.GATEWAY_TIMEOUT).expectBody().jsonPath("$.status") - .isEqualTo(String.valueOf(HttpStatus.GATEWAY_TIMEOUT.value())).jsonPath("$.message") - .value(containsString("1000ms")); + testClient.get() + .uri("/delay/3") + .header("Host", "www.sccbtimeout.org") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.GATEWAY_TIMEOUT) + .expectBody() + .jsonPath("$.status") + .isEqualTo(String.valueOf(HttpStatus.GATEWAY_TIMEOUT.value())) + .jsonPath("$.message") + .value(containsString("1000ms")); } @Test public void toStringFormat() { SpringCloudCircuitBreakerFilterFactory.Config config = new SpringCloudCircuitBreakerFilterFactory.Config() - .setName("myname").setFallbackUri("forward:/myfallback"); + .setName("myname") + .setFallbackUri("forward:/myfallback"); GatewayFilter filter = new SpringCloudCircuitBreakerResilience4JFilterFactory( new ReactiveResilience4JCircuitBreakerFactory(CircuitBreakerRegistry.ofDefaults(), TimeLimiterRegistry.ofDefaults()), - null).apply(config); + null) + .apply(config); assertThat(filter.toString()).contains("myname").contains("forward:/myfallback"); } @Test public void testHeadersAreClearedOnFallback() { - testClient.post().uri("/responseheaders/502").body(BodyInserters.fromFormData("name-1", "value-1")) - .header("Host", "www.circuitbreakerresetexchange.org").header("X-Test-Header-1", "value1") - .accept(MediaType.APPLICATION_JSON).exchange().expectStatus().isOk().expectHeader() - .doesNotExist("X-Test-Header-1").expectHeader().valueEquals("X-Test-Header-1-fallback", "value1"); + testClient.post() + .uri("/responseheaders/502") + .body(BodyInserters.fromFormData("name-1", "value-1")) + .header("Host", "www.circuitbreakerresetexchange.org") + .header("X-Test-Header-1", "value1") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .doesNotExist("X-Test-Header-1") + .expectHeader() + .valueEquals("X-Test-Header-1-fallback", "value1"); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerTestConfig.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerTestConfig.java index a09f92f5..1b481ee2 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerTestConfig.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/SpringCloudCircuitBreakerTestConfig.java @@ -91,49 +91,52 @@ public class SpringCloudCircuitBreakerTestConfig { @RequestMapping("/resetExchangeFallbackController") public ResponseEntity> resetExchangeFallbackController(ServerWebExchange exchange) { return ResponseEntity.status(HttpStatus.OK) - .headers((HttpHeaders) exchange.getRequest().getHeaders().entrySet().stream() - .filter(entry -> entry.getKey().startsWith("X-Test-")) - .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey() + "-fallback", entry.getValue())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, - (list1, list2) -> Stream.concat(list1.stream(), list2.stream()) - .collect(Collectors.toList()), - HttpHeaders::new))) - .body(Collections.singletonMap("from", "resetExchangeFallbackController")); + .headers((HttpHeaders) exchange.getRequest() + .getHeaders() + .entrySet() + .stream() + .filter(entry -> entry.getKey().startsWith("X-Test-")) + .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey() + "-fallback", entry.getValue())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, + (list1, list2) -> Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList()), + HttpHeaders::new))) + .body(Collections.singletonMap("from", "resetExchangeFallbackController")); } @Bean public RouteLocator circuitBreakerRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("fallback_controller_3", - r -> r.path("/fallback").filters(f -> f.setPath("/circuitbreakerFallbackController3")).uri(uri)) - .route("circuitbreaker_fallback_forward", r -> r.host("**.circuitbreakerforward.org") - .filters(f -> f.circuitBreaker(config -> config.setFallbackUri("forward:/fallback"))).uri(uri)) - .route("circuitbreaker_java", - r -> r.host("**.circuitbreakerjava.org") - .filters(f -> f.prefixPath("/httpbin").circuitBreaker( - config -> config.setFallbackUri("forward:/circuitbreakerFallbackController2"))) - .uri(uri)) - .route("circuitbreaker_connection_failure", r -> r.host("**.circuitbreakerconnectfail.org") - .filters(f -> f.prefixPath("/httpbin").circuitBreaker(config -> { - })).uri("lb://badservice")) - /* - * This is a route encapsulated in a circuit breaker that is ready to wait - * for a response far longer than the underpinning WebClient would. - */ - .route("circuitbreaker_response_stall", - r -> r.host("**.circuitbreakerresponsestall.org") - .filters(f -> f.prefixPath("/httpbin") - .circuitBreaker(config -> config.setName("stalling-command"))) - .uri(uri)) - .route("circuitbreaker_fallback_test_reset_exchange", - r -> r.host("**.circuitbreakerresetexchange.org").filters(f -> f - .circuitBreaker(config -> config.setName("fallbackcmd") - .setFallbackUri("forward:/resetExchangeFallbackController")) - .filter((exchange, chain) -> chain.filter(exchange) - .then(Mono.defer(() -> !exchange.getResponse().isCommitted() - ? Mono.error(new Exception("Some Random Exception")) : Mono.empty())))) - .uri(uri)) - .build(); + .route("fallback_controller_3", + r -> r.path("/fallback").filters(f -> f.setPath("/circuitbreakerFallbackController3")).uri(uri)) + .route("circuitbreaker_fallback_forward", + r -> r.host("**.circuitbreakerforward.org") + .filters(f -> f.circuitBreaker(config -> config.setFallbackUri("forward:/fallback"))) + .uri(uri)) + .route("circuitbreaker_java", r -> r.host("**.circuitbreakerjava.org") + .filters(f -> f.prefixPath("/httpbin") + .circuitBreaker(config -> config.setFallbackUri("forward:/circuitbreakerFallbackController2"))) + .uri(uri)) + .route("circuitbreaker_connection_failure", r -> r.host("**.circuitbreakerconnectfail.org") + .filters(f -> f.prefixPath("/httpbin").circuitBreaker(config -> { + })) + .uri("lb://badservice")) + /* + * This is a route encapsulated in a circuit breaker that is ready to wait for + * a response far longer than the underpinning WebClient would. + */ + .route("circuitbreaker_response_stall", r -> r.host("**.circuitbreakerresponsestall.org") + .filters(f -> f.prefixPath("/httpbin").circuitBreaker(config -> config.setName("stalling-command"))) + .uri(uri)) + .route("circuitbreaker_fallback_test_reset_exchange", + r -> r.host("**.circuitbreakerresetexchange.org") + .filters(f -> f + .circuitBreaker(config -> config.setName("fallbackcmd") + .setFallbackUri("forward:/resetExchangeFallbackController")) + .filter((exchange, chain) -> chain.filter(exchange) + .then(Mono.defer(() -> !exchange.getResponse().isCommitted() + ? Mono.error(new Exception("Some Random Exception")) : Mono.empty())))) + .uri(uri)) + .build(); } @Bean @@ -152,7 +155,8 @@ public class SpringCloudCircuitBreakerTestConfig { Mono retrieveExceptionInfo(ServerRequest serverRequest) { String exceptionName = serverRequest.attribute(CIRCUITBREAKER_EXECUTION_EXCEPTION_ATTR) - .map(exception -> exception.getClass().getName()).orElse(""); + .map(exception -> exception.getClass().getName()) + .orElse(""); return ServerResponse.ok().header(RETRIEVED_EXCEPTION, exceptionName).build(); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/TokenRelayGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/TokenRelayGatewayFilterFactoryTests.java index 0514c52c..ac0e30c7 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/TokenRelayGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/TokenRelayGatewayFilterFactoryTests.java @@ -103,12 +103,14 @@ public class TokenRelayGatewayFilterFactoryTests { when(accessToken.getTokenValue()).thenReturn("mytoken"); ClientRegistration clientRegistration = ClientRegistration.withRegistrationId("myregistrationid") - .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS).clientId("myclientid") - .tokenUri("mytokenuri").build(); + .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS) + .clientId("myclientid") + .tokenUri("mytokenuri") + .build(); OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(clientRegistration, "joe", accessToken); when(authorizedClientManager.authorize(any(OAuth2AuthorizeRequest.class))) - .thenReturn(Mono.just(authorizedClient)); + .thenReturn(Mono.just(authorizedClient)); OAuth2AuthenticationToken authenticationToken = new OAuth2AuthenticationToken(mock(OAuth2User.class), Collections.emptyList(), "myId"); @@ -123,12 +125,12 @@ public class TokenRelayGatewayFilterFactoryTests { Collections.singletonList("Bearer mytoken")); ArgumentCaptor authorizeRequestCaptor = ArgumentCaptor - .forClass(OAuth2AuthorizeRequest.class); + .forClass(OAuth2AuthorizeRequest.class); verify(authorizedClientManager).authorize(authorizeRequestCaptor.capture()); OAuth2AuthorizeRequest authorizeRequest = authorizeRequestCaptor.getValue(); assertThat(authorizeRequest.getClientRegistrationId()) - .isEqualTo(authenticationToken.getAuthorizedClientRegistrationId()); + .isEqualTo(authenticationToken.getAuthorizedClientRegistrationId()); assertThat(authorizeRequest.getClientRegistrationId()).isNotEqualTo(clientRegistration.getRegistrationId()); } @@ -138,12 +140,14 @@ public class TokenRelayGatewayFilterFactoryTests { when(accessToken.getTokenValue()).thenReturn("mytoken"); ClientRegistration clientRegistration = ClientRegistration.withRegistrationId("myregistrationid") - .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS).clientId("myclientid") - .tokenUri("mytokenuri").build(); + .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS) + .clientId("myclientid") + .tokenUri("mytokenuri") + .build(); OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(clientRegistration, "steve", accessToken); when(authorizedClientManager.authorize(any(OAuth2AuthorizeRequest.class))) - .thenReturn(Mono.just(authorizedClient)); + .thenReturn(Mono.just(authorizedClient)); OAuth2AuthenticationToken authenticationToken = new OAuth2AuthenticationToken(mock(OAuth2User.class), Collections.emptyList(), "myId"); @@ -161,13 +165,13 @@ public class TokenRelayGatewayFilterFactoryTests { Collections.singletonList("Bearer mytoken")); ArgumentCaptor authorizeRequestCaptor = ArgumentCaptor - .forClass(OAuth2AuthorizeRequest.class); + .forClass(OAuth2AuthorizeRequest.class); verify(authorizedClientManager).authorize(authorizeRequestCaptor.capture()); OAuth2AuthorizeRequest authorizeRequest = authorizeRequestCaptor.getValue(); assertThat(authorizeRequest.getClientRegistrationId()).isEqualTo(clientRegistration.getRegistrationId()); assertThat(authorizeRequest.getClientRegistrationId()) - .isNotEqualTo(authenticationToken.getAuthorizedClientRegistrationId()); + .isNotEqualTo(authenticationToken.getAuthorizedClientRegistrationId()); } @Test @@ -188,12 +192,14 @@ public class TokenRelayGatewayFilterFactoryTests { when(accessToken.getTokenValue()).thenReturn("mytoken"); ClientRegistration clientRegistration = ClientRegistration.withRegistrationId("myregistrationid") - .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS).clientId("myclientid") - .tokenUri("mytokenuri").build(); + .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS) + .clientId("myclientid") + .tokenUri("mytokenuri") + .build(); OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(clientRegistration, "steve", accessToken); when(authorizedClientManager.authorize(any(OAuth2AuthorizeRequest.class))) - .thenReturn(Mono.just(authorizedClient)); + .thenReturn(Mono.just(authorizedClient)); Authentication authenticationToken = new TestingAuthenticationToken("my", null); SecurityContextImpl securityContext = new SecurityContextImpl(authenticationToken); @@ -210,7 +216,7 @@ public class TokenRelayGatewayFilterFactoryTests { Collections.singletonList("Bearer mytoken")); ArgumentCaptor authorizeRequestCaptor = ArgumentCaptor - .forClass(OAuth2AuthorizeRequest.class); + .forClass(OAuth2AuthorizeRequest.class); verify(authorizedClientManager).authorize(authorizeRequestCaptor.capture()); OAuth2AuthorizeRequest authorizeRequest = authorizeRequestCaptor.getValue(); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/CachedResponseTest.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/CachedResponseTest.java index bf55d1cb..af2a6e32 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/CachedResponseTest.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/CachedResponseTest.java @@ -75,7 +75,9 @@ class CachedResponseTest { void bodyAsString_whenThereIsGZipContent() throws IOException { String body = "example"; CachedResponse cachedResponse = CachedResponse.create(HttpStatus.OK) - .header(HttpHeaders.CONTENT_ENCODING, "gzip").appendToBody(convertToGzip(body)).build(); + .header(HttpHeaders.CONTENT_ENCODING, "gzip") + .appendToBody(convertToGzip(body)) + .build(); String asString = cachedResponse.bodyAsString(); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheGatewayFilterFactoryTests.java index a161ec54..1803ae0b 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheGatewayFilterFactoryTests.java @@ -77,51 +77,92 @@ public class LocalResponseCacheGatewayFilterFactoryTests extends BaseWebClientTe void shouldNotCacheResponseWhenGetRequestHasBody() { String uri = "/" + UUID.randomUUID() + "/cache/headers"; - testClient.method(HttpMethod.GET).uri(uri).header("Host", "www.localresponsecache.org") - .header(CUSTOM_HEADER, "1").bodyValue("whatever").exchange().expectBody() - .jsonPath("$.headers." + CUSTOM_HEADER); + testClient.method(HttpMethod.GET) + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "1") + .bodyValue("whatever") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER); - testClient.method(HttpMethod.GET).uri(uri).header("Host", "www.localresponsecache.org") - .bodyValue("whatever").header(CUSTOM_HEADER, "2").exchange().expectBody() - .jsonPath("$.headers." + CUSTOM_HEADER).isEqualTo("2"); + testClient.method(HttpMethod.GET) + .uri(uri) + .header("Host", "www.localresponsecache.org") + .bodyValue("whatever") + .header(CUSTOM_HEADER, "2") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER) + .isEqualTo("2"); } @Test void shouldNotCacheResponseWhenPostRequestHasBody() { String uri = "/" + UUID.randomUUID() + "/cache/headers"; - testClient.method(HttpMethod.POST).uri(uri).header("Host", "www.localresponsecache.org") - .header(CUSTOM_HEADER, "1").bodyValue("whatever").exchange().expectBody() - .jsonPath("$.headers." + CUSTOM_HEADER); + testClient.method(HttpMethod.POST) + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "1") + .bodyValue("whatever") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER); - testClient.method(HttpMethod.POST).uri(uri).header("Host", "www.localresponsecache.org") - .bodyValue("whatever").header(CUSTOM_HEADER, "2").exchange().expectBody() - .jsonPath("$.headers." + CUSTOM_HEADER).isEqualTo("2"); + testClient.method(HttpMethod.POST) + .uri(uri) + .header("Host", "www.localresponsecache.org") + .bodyValue("whatever") + .header(CUSTOM_HEADER, "2") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER) + .isEqualTo("2"); } @Test void shouldNotCacheWhenCacheControlAsksToDoNotCache() { String uri = "/" + UUID.randomUUID() + "/cache/headers"; - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "1").exchange() - .expectBody().jsonPath("$.headers." + CUSTOM_HEADER); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "1") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER); - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "2") - // Cache-Control asks to not use the cached content and not store the - // response - .header(HttpHeaders.CACHE_CONTROL, CacheControl.noStore().getHeaderValue()).exchange().expectBody() - .jsonPath("$.headers." + CUSTOM_HEADER).isEqualTo("2"); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "2") + // Cache-Control asks to not use the cached content and not store the + // response + .header(HttpHeaders.CACHE_CONTROL, CacheControl.noStore().getHeaderValue()) + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER) + .isEqualTo("2"); } @Test void shouldNotIncludeMustRevalidateNoStoreAndNoCacheDirectivesWhenMaxAgeIsPositive() { String uri = "/" + UUID.randomUUID() + "/cache/headers"; - var response = testClient.get().uri(uri).header("Host", "www.localresponsecache.org").exchange() - .expectBody().returnResult(); - var maxAge = response.getResponseHeaders().get(HttpHeaders.CACHE_CONTROL).stream() - .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge).filter(Objects::nonNull).findAny() - .orElse(null); + var response = testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .exchange() + .expectBody() + .returnResult(); + var maxAge = response.getResponseHeaders() + .get(HttpHeaders.CACHE_CONTROL) + .stream() + .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge) + .filter(Objects::nonNull) + .findAny() + .orElse(null); assertThat(maxAge).isGreaterThan(0L); assertThat(response.getResponseHeaders().get(HttpHeaders.CACHE_CONTROL)).doesNotContain("no-store", @@ -132,11 +173,20 @@ public class LocalResponseCacheGatewayFilterFactoryTests extends BaseWebClientTe void shouldCacheResponseWhenOnlyNonVaryHeaderIsDifferent() { String uri = "/" + UUID.randomUUID() + "/cache/headers"; - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "1").exchange() - .expectBody().jsonPath("$.headers." + CUSTOM_HEADER) - .value(customHeaderFromReq1 -> testClient.get().uri(uri) - .header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "2").exchange() - .expectBody().jsonPath("$.headers." + CUSTOM_HEADER, customHeaderFromReq1)); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "1") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER) + .value(customHeaderFromReq1 -> testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "2") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER, customHeaderFromReq1)); } @Test @@ -154,10 +204,22 @@ public class LocalResponseCacheGatewayFilterFactoryTests extends BaseWebClientTe void shouldNotCacheResponseWhenResponseVaryIsWildcard() { String uri = "/" + UUID.randomUUID() + "/cache/vary-on-header"; // Vary: * - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "1") - .header("X-Request-Vary", "*").exchange().expectBody().jsonPath("$.headers." + CUSTOM_HEADER, "1"); - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "2") - .header("X-Request-Vary", "*").exchange().expectBody().jsonPath("$.headers." + CUSTOM_HEADER, "2"); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "1") + .header("X-Request-Vary", "*") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER, "1"); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "2") + .header("X-Request-Vary", "*") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER, "2"); } @Test @@ -165,25 +227,54 @@ public class LocalResponseCacheGatewayFilterFactoryTests extends BaseWebClientTe String uri = "/" + UUID.randomUUID() + "/cache/headers"; String uri2 = "/" + UUID.randomUUID() + "/cache/headers"; - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "1").exchange() - .expectBody().jsonPath("$.headers." + CUSTOM_HEADER); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "1") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER); - testClient.get().uri(uri2).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "2") - .exchange().expectBody().jsonPath("$.headers." + CUSTOM_HEADER).isEqualTo("2"); + testClient.get() + .uri(uri2) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "2") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER) + .isEqualTo("2"); } @Test void shouldDecreaseCacheControlMaxAgeTimeWhenResponseIsFromCache() throws InterruptedException { String uri = "/" + UUID.randomUUID() + "/cache/headers"; - Long maxAgeRequest1 = testClient.get().uri(uri).header("Host", "www.localresponsecache.org").exchange() - .expectBody().returnResult().getResponseHeaders().get(HttpHeaders.CACHE_CONTROL).stream() - .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge).filter(Objects::nonNull).findAny() - .orElse(null); + Long maxAgeRequest1 = testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .exchange() + .expectBody() + .returnResult() + .getResponseHeaders() + .get(HttpHeaders.CACHE_CONTROL) + .stream() + .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge) + .filter(Objects::nonNull) + .findAny() + .orElse(null); Thread.sleep(2000); - Long maxAgeRequest2 = testClient.get().uri(uri).header("Host", "www.localresponsecache.org").exchange() - .expectBody().returnResult().getResponseHeaders().get(HttpHeaders.CACHE_CONTROL).stream() - .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge).filter(Objects::nonNull).findAny() - .orElse(null); + Long maxAgeRequest2 = testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .exchange() + .expectBody() + .returnResult() + .getResponseHeaders() + .get(HttpHeaders.CACHE_CONTROL) + .stream() + .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge) + .filter(Objects::nonNull) + .findAny() + .orElse(null); assertThat(maxAgeRequest2).isLessThan(maxAgeRequest1); } @@ -191,54 +282,91 @@ public class LocalResponseCacheGatewayFilterFactoryTests extends BaseWebClientTe @Test void shouldNotCacheResponseWhenTimeToLiveIsReached() { String uri = "/" + UUID.randomUUID() + "/ephemeral-cache/headers"; - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "1").exchange() - .expectBody().jsonPath("$.headers." + CUSTOM_HEADER).value(customHeaderFromReq1 -> { - try { - Thread.sleep(100); // Min time to have entry expired - testClient.get().uri(uri).header("Host", "www.localresponsecache.org") - .header(CUSTOM_HEADER, "2").exchange().expectBody() - .jsonPath("$.headers." + CUSTOM_HEADER).isEqualTo("2"); - } - catch (InterruptedException e) { - throw new RuntimeException(e); - } - }); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "1") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER) + .value(customHeaderFromReq1 -> { + try { + Thread.sleep(100); // Min time to have entry expired + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "2") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER) + .isEqualTo("2"); + } + catch (InterruptedException e) { + throw new RuntimeException(e); + } + }); } @Test void shouldNotCacheWhenLocalResponseCacheSizeIsReached() { String uri = "/" + UUID.randomUUID() + "/one-byte-cache/headers"; - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "1").exchange() - .expectBody().jsonPath("$.headers." + CUSTOM_HEADER); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "1") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER); - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "2").exchange() - .expectBody().jsonPath("$.headers." + CUSTOM_HEADER, "2"); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "2") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER, "2"); } @Test void shouldNotCacheWhenAuthorizationHeaderIsDifferent() { String uri = "/" + UUID.randomUUID() + "/cache/headers"; - testClient.get().uri(uri).header("Host", "www.localresponsecache.org") - .header(HttpHeaders.AUTHORIZATION, "1").header(CUSTOM_HEADER, "1").exchange().expectBody() - .jsonPath("$.headers." + CUSTOM_HEADER); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(HttpHeaders.AUTHORIZATION, "1") + .header(CUSTOM_HEADER, "1") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER); - testClient.get().uri(uri).header("Host", "www.localresponsecache.org") - .header(HttpHeaders.AUTHORIZATION, "2").header(CUSTOM_HEADER, "2").exchange().expectBody() - .jsonPath("$.headers." + CUSTOM_HEADER, "2"); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(HttpHeaders.AUTHORIZATION, "2") + .header(CUSTOM_HEADER, "2") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER, "2"); } void assertNonVaryHeaderInContent(String uri, String varyHeader, String varyHeaderValue, String nonVaryHeader, String nonVaryHeaderValue, String expectedNonVaryResponse) { - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header("X-Request-Vary", varyHeader) - .header(varyHeader, varyHeaderValue).header(nonVaryHeader, nonVaryHeaderValue).exchange() - .expectBody(Map.class).consumeWith(response -> { - assertThat(response.getResponseHeaders()).hasEntrySatisfying("Vary", - o -> assertThat(o).contains(varyHeader)); - assertThat((Map) response.getResponseBody().get("headers")).containsEntry(nonVaryHeader, - expectedNonVaryResponse); - }); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header("X-Request-Vary", varyHeader) + .header(varyHeader, varyHeaderValue) + .header(nonVaryHeader, nonVaryHeaderValue) + .exchange() + .expectBody(Map.class) + .consumeWith(response -> { + assertThat(response.getResponseHeaders()).hasEntrySatisfying("Vary", + o -> assertThat(o).contains(varyHeader)); + assertThat((Map) response.getResponseBody().get("headers")).containsEntry(nonVaryHeader, + expectedNonVaryResponse); + }); } @EnableAutoConfiguration @@ -252,23 +380,31 @@ public class LocalResponseCacheGatewayFilterFactoryTests extends BaseWebClientTe @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("local_response_cache_java_test", - r -> r.path("/{namespace}/cache/**").and().host("{sub}.localresponsecache.org") - .filters(f -> f.stripPrefix(2).prefixPath("/httpbin") - .localResponseCache(Duration.ofMinutes(2), null)) - .uri(uri)) - .route("100_millisec_ephemeral_prefix_local_response_cache_java_test", - r -> r.path("/{namespace}/ephemeral-cache/**").and() - .host("{sub}.localresponsecache.org") - .filters(f -> f.stripPrefix(2).prefixPath("/httpbin") - .localResponseCache(Duration.ofMillis(100), null)) - .uri(uri)) - .route("min_sized_prefix_local_response_cache_java_test", - r -> r.path("/{namespace}/one-byte-cache/**").and().host("{sub}.localresponsecache.org") - .filters(f -> f.stripPrefix(2).prefixPath("/httpbin").localResponseCache(null, - DataSize.ofBytes(1L))) - .uri(uri)) - .build(); + .route("local_response_cache_java_test", + r -> r.path("/{namespace}/cache/**") + .and() + .host("{sub}.localresponsecache.org") + .filters(f -> f.stripPrefix(2) + .prefixPath("/httpbin") + .localResponseCache(Duration.ofMinutes(2), null)) + .uri(uri)) + .route("100_millisec_ephemeral_prefix_local_response_cache_java_test", + r -> r.path("/{namespace}/ephemeral-cache/**") + .and() + .host("{sub}.localresponsecache.org") + .filters(f -> f.stripPrefix(2) + .prefixPath("/httpbin") + .localResponseCache(Duration.ofMillis(100), null)) + .uri(uri)) + .route("min_sized_prefix_local_response_cache_java_test", + r -> r.path("/{namespace}/one-byte-cache/**") + .and() + .host("{sub}.localresponsecache.org") + .filters(f -> f.stripPrefix(2) + .prefixPath("/httpbin") + .localResponseCache(null, DataSize.ofBytes(1L))) + .uri(uri)) + .build(); } } @@ -285,18 +421,36 @@ public class LocalResponseCacheGatewayFilterFactoryTests extends BaseWebClientTe @Test void shouldApplyMaxAgeFromPropertiesWhenFilterHasNoParams() throws InterruptedException { String uri = "/" + UUID.randomUUID() + "/cache/headers"; - Long maxAgeRequest1 = testClient.get().uri(uri).header("Host", "www.localresponsecache.org").exchange() - .expectBody().returnResult().getResponseHeaders().get(HttpHeaders.CACHE_CONTROL).stream() - .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge).filter(Objects::nonNull).findAny() - .orElse(null); + Long maxAgeRequest1 = testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .exchange() + .expectBody() + .returnResult() + .getResponseHeaders() + .get(HttpHeaders.CACHE_CONTROL) + .stream() + .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge) + .filter(Objects::nonNull) + .findAny() + .orElse(null); assertThat(maxAgeRequest1).isLessThanOrEqualTo(20L); Thread.sleep(2000); - Long maxAgeRequest2 = testClient.get().uri(uri).header("Host", "www.localresponsecache.org").exchange() - .expectBody().returnResult().getResponseHeaders().get(HttpHeaders.CACHE_CONTROL).stream() - .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge).filter(Objects::nonNull).findAny() - .orElse(null); + Long maxAgeRequest2 = testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .exchange() + .expectBody() + .returnResult() + .getResponseHeaders() + .get(HttpHeaders.CACHE_CONTROL) + .stream() + .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge) + .filter(Objects::nonNull) + .findAny() + .orElse(null); assertThat(maxAgeRequest2).isLessThan(maxAgeRequest1); } @@ -307,23 +461,40 @@ public class LocalResponseCacheGatewayFilterFactoryTests extends BaseWebClientTe String uri = "/" + UUID.randomUUID() + "/cache/headers"; - testClient.get().uri(uri).header("Host", "www.localresponsecache.org") - .header(HttpHeaders.CACHE_CONTROL, CacheControl.noStore().getHeaderValue()) - .header(CUSTOM_HEADER, "1").exchange().expectBody().jsonPath("$.headers." + CUSTOM_HEADER); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(HttpHeaders.CACHE_CONTROL, CacheControl.noStore().getHeaderValue()) + .header(CUSTOM_HEADER, "1") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER); - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "2").exchange() - .expectBody().jsonPath("$.headers." + CUSTOM_HEADER).isEqualTo("2"); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "2") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER) + .isEqualTo("2"); - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "3") // second - // request - // cached - // "2" - // -> - // "3" - // will - // be - // ignored - .exchange().expectBody().jsonPath("$.headers." + CUSTOM_HEADER).isEqualTo("2"); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "3") // second + // request + // cached + // "2" + // -> + // "3" + // will + // be + // ignored + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER) + .isEqualTo("2"); } @EnableAutoConfiguration @@ -336,11 +507,14 @@ public class LocalResponseCacheGatewayFilterFactoryTests extends BaseWebClientTe @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("local_response_cache_java_test", - r -> r.path("/{namespace}/cache/**").and().host("{sub}.localresponsecache.org") + return builder.routes() + .route("local_response_cache_java_test", + r -> r.path("/{namespace}/cache/**") + .and() + .host("{sub}.localresponsecache.org") .filters(f -> f.stripPrefix(2).prefixPath("/httpbin").localResponseCache(null, null)) .uri(uri)) - .build(); + .build(); } } @@ -362,37 +536,67 @@ public class LocalResponseCacheGatewayFilterFactoryTests extends BaseWebClientTe // 1. Store in cache - max-age ~= 2m AND NOT // (must-revalidate,no-cache,no-store) final Instant when1stRequest = Instant.now(); - var firstResponse = testClient.get().uri(uri).header("Host", "www.localresponsecache.org") - .header(CUSTOM_HEADER, "1").exchange().expectBody().jsonPath("$.headers." + CUSTOM_HEADER) - .isEqualTo("1").returnResult(); - var maxAge1st = firstResponse.getResponseHeaders().get(HttpHeaders.CACHE_CONTROL).stream() - .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge).filter(Objects::nonNull).findAny() - .orElse(null); + var firstResponse = testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "1") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER) + .isEqualTo("1") + .returnResult(); + var maxAge1st = firstResponse.getResponseHeaders() + .get(HttpHeaders.CACHE_CONTROL) + .stream() + .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge) + .filter(Objects::nonNull) + .findAny() + .orElse(null); assertThat(maxAge1st).isCloseTo(Duration.ofMinutes(2).toSeconds(), offset(10L)); assertThat(firstResponse.getResponseHeaders().getCacheControl()).doesNotContain("must-revalidate", "no-cache", "no-store"); // 2. "no-cache" should return max-age=0 & must-revalidate,no-cache,no-store - var secondResponse = testClient.get().uri(uri).header("Host", "www.localresponsecache.org") - .header(CUSTOM_HEADER, "2") - // Cache-Control asks to not use the cached content - .header(HttpHeaders.CACHE_CONTROL, CacheControl.noCache().getHeaderValue()).exchange().expectBody() - .jsonPath("$.headers." + CUSTOM_HEADER).isEqualTo("2").returnResult(); - var maxAge2nd = secondResponse.getResponseHeaders().get(HttpHeaders.CACHE_CONTROL).stream() - .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge).filter(Objects::nonNull).findAny() - .orElse(null); + var secondResponse = testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "2") + // Cache-Control asks to not use the cached content + .header(HttpHeaders.CACHE_CONTROL, CacheControl.noCache().getHeaderValue()) + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER) + .isEqualTo("2") + .returnResult(); + var maxAge2nd = secondResponse.getResponseHeaders() + .get(HttpHeaders.CACHE_CONTROL) + .stream() + .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge) + .filter(Objects::nonNull) + .findAny() + .orElse(null); assertThat(maxAge2nd).isZero(); // 3. After 2s, max-age = (when1stRequest) - 1s - offset_delay var waitDuration = Duration.ofSeconds(1); Thread.sleep(waitDuration.toMillis()); // Wait 2s to check max-age renewed final Instant when3rdRequest = Instant.now(); - var thirdResponseCached = testClient.get().uri(uri).header("Host", "www.localresponsecache.org") - .header(CUSTOM_HEADER, "3").exchange().expectBody().jsonPath("$.headers." + CUSTOM_HEADER) - .isEqualTo("1").returnResult(); - var maxAge3rd = thirdResponseCached.getResponseHeaders().get(HttpHeaders.CACHE_CONTROL).stream() - .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge).filter(Objects::nonNull).findAny() - .orElse(null); + var thirdResponseCached = testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "3") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER) + .isEqualTo("1") + .returnResult(); + var maxAge3rd = thirdResponseCached.getResponseHeaders() + .get(HttpHeaders.CACHE_CONTROL) + .stream() + .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge) + .filter(Objects::nonNull) + .findAny() + .orElse(null); assertThat(maxAge3rd).isCloseTo( Duration.ofMinutes(2).minus(Duration.between(when1stRequest, when3rdRequest)).getSeconds(), offset(10L)); @@ -409,11 +613,14 @@ public class LocalResponseCacheGatewayFilterFactoryTests extends BaseWebClientTe @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("local_response_cache_java_test", - r -> r.path("/{namespace}/cache/**").and().host("{sub}.localresponsecache.org") + return builder.routes() + .route("local_response_cache_java_test", + r -> r.path("/{namespace}/cache/**") + .and() + .host("{sub}.localresponsecache.org") .filters(f -> f.stripPrefix(2).prefixPath("/httpbin").localResponseCache(null, null)) .uri(uri)) - .build(); + .build(); } } @@ -435,29 +642,56 @@ public class LocalResponseCacheGatewayFilterFactoryTests extends BaseWebClientTe String uri = "/" + UUID.randomUUID() + "/cache/headers"; // First request -> cache miss final Instant when1stRequest = Instant.now(); - Long maxAgeRequest1 = testClient.get().uri(uri).header("Host", "www.localresponsecache.org").exchange() - .expectBody().returnResult().getResponseHeaders().get(HttpHeaders.CACHE_CONTROL).stream() - .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge).filter(Objects::nonNull).findAny() - .orElse(null); + Long maxAgeRequest1 = testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .exchange() + .expectBody() + .returnResult() + .getResponseHeaders() + .get(HttpHeaders.CACHE_CONTROL) + .stream() + .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge) + .filter(Objects::nonNull) + .findAny() + .orElse(null); assertThat(maxAgeRequest1).isCloseTo(Duration.ofMinutes(2).toSeconds(), offset(10L)); // Second request + no-cache -> skip cache and ignore update Thread.sleep(1000); final Duration between1stAnd2ndRequest = Duration.between(when1stRequest, Instant.now()); - Long maxAgeRequest2 = testClient.get().uri(uri).header("Host", "www.localresponsecache.org") - .header(HttpHeaders.CACHE_CONTROL, CacheControl.noCache().getHeaderValue()).exchange().expectBody() - .returnResult().getResponseHeaders().get(HttpHeaders.CACHE_CONTROL).stream() - .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge).filter(Objects::nonNull).findAny() - .orElse(null); + Long maxAgeRequest2 = testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(HttpHeaders.CACHE_CONTROL, CacheControl.noCache().getHeaderValue()) + .exchange() + .expectBody() + .returnResult() + .getResponseHeaders() + .get(HttpHeaders.CACHE_CONTROL) + .stream() + .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge) + .filter(Objects::nonNull) + .findAny() + .orElse(null); assertThat(maxAgeRequest2).isCloseTo(Duration.ofMinutes(2).minus(between1stAnd2ndRequest).getSeconds(), offset(10L)); // Third request -> cache hit -> entry (and max-age) is updated Thread.sleep(1000); - Long maxAgeRequest3 = testClient.get().uri(uri).header("Host", "www.localresponsecache.org").exchange() - .expectBody().returnResult().getResponseHeaders().get(HttpHeaders.CACHE_CONTROL).stream() - .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge).filter(Objects::nonNull).findAny() - .orElse(null); + Long maxAgeRequest3 = testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .exchange() + .expectBody() + .returnResult() + .getResponseHeaders() + .get(HttpHeaders.CACHE_CONTROL) + .stream() + .map(LocalResponseCacheGatewayFilterFactoryTests::parseMaxAge) + .filter(Objects::nonNull) + .findAny() + .orElse(null); assertThat(maxAgeRequest3).isCloseTo(Duration.ofMinutes(2).toSeconds(), offset(10L)); } @@ -471,11 +705,14 @@ public class LocalResponseCacheGatewayFilterFactoryTests extends BaseWebClientTe @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("local_response_cache_java_test", - r -> r.path("/{namespace}/cache/**").and().host("{sub}.localresponsecache.org") + return builder.routes() + .route("local_response_cache_java_test", + r -> r.path("/{namespace}/cache/**") + .and() + .host("{sub}.localresponsecache.org") .filters(f -> f.stripPrefix(2).prefixPath("/httpbin").localResponseCache(null, null)) .uri(uri)) - .build(); + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheGlobalFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheGlobalFilterTests.java index 98a7d7dd..54ebd154 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheGlobalFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheGlobalFilterTests.java @@ -54,11 +54,22 @@ public class LocalResponseCacheGlobalFilterTests { void shouldNotCacheResponseWhenGlobalIsNotEnabled() { String uri = "/" + UUID.randomUUID() + "/global-cache-deactivated/headers"; - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "1").exchange() - .expectBody().jsonPath("$.headers." + CUSTOM_HEADER); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "1") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER); - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "2").exchange() - .expectBody().jsonPath("$.headers." + CUSTOM_HEADER).isEqualTo("2"); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "2") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER) + .isEqualTo("2"); } @EnableAutoConfiguration @@ -72,11 +83,13 @@ public class LocalResponseCacheGlobalFilterTests { @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("global_local_response_cache_deactivated_java_test", - r -> r.path("/{namespace}/global-cache-deactivated/**").and() - .host("{sub}.localresponsecache.org") - .filters(f -> f.stripPrefix(2).prefixPath("/httpbin")).uri(uri)) - .build(); + .route("global_local_response_cache_deactivated_java_test", + r -> r.path("/{namespace}/global-cache-deactivated/**") + .and() + .host("{sub}.localresponsecache.org") + .filters(f -> f.stripPrefix(2).prefixPath("/httpbin")) + .uri(uri)) + .build(); } } @@ -92,11 +105,22 @@ public class LocalResponseCacheGlobalFilterTests { void shouldGlobalCacheResponseWhenRouteDoesNotHaveFilter() { String uri = "/" + UUID.randomUUID() + "/global-cache/headers"; - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "1").exchange() - .expectBody().jsonPath("$.headers." + CUSTOM_HEADER); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "1") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER); - testClient.get().uri(uri).header("Host", "www.localresponsecache.org").header(CUSTOM_HEADER, "2").exchange() - .expectBody().jsonPath("$.headers." + CUSTOM_HEADER).isEqualTo("1"); + testClient.get() + .uri(uri) + .header("Host", "www.localresponsecache.org") + .header(CUSTOM_HEADER, "2") + .exchange() + .expectBody() + .jsonPath("$.headers." + CUSTOM_HEADER) + .isEqualTo("1"); } @EnableAutoConfiguration @@ -110,10 +134,13 @@ public class LocalResponseCacheGlobalFilterTests { @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("global_local_response_cache_java_test", - r -> r.path("/{namespace}/global-cache/**").and().host("{sub}.localresponsecache.org") - .filters(f -> f.stripPrefix(2).prefixPath("/httpbin")).uri(uri)) - .build(); + .route("global_local_response_cache_java_test", + r -> r.path("/{namespace}/global-cache/**") + .and() + .host("{sub}.localresponsecache.org") + .filters(f -> f.stripPrefix(2).prefixPath("/httpbin")) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheUtilsTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheUtilsTests.java index 711672b8..6f5f3fdd 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheUtilsTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheUtilsTests.java @@ -29,7 +29,8 @@ class LocalResponseCacheUtilsTests { @ValueSource(strings = { "", "no-store", "no-store, wrong-no-cache", "s-no-cache" }) void shouldNotIdentifyRequestAsNoCacheRequest(String cacheControl) { MockServerHttpRequest httpRequest = MockServerHttpRequest.get("https://this") - .header("Cache-Control", cacheControl).build(); + .header("Cache-Control", cacheControl) + .build(); boolean result = LocalResponseCacheUtils.isNoCacheRequest(httpRequest); @@ -40,7 +41,8 @@ class LocalResponseCacheUtilsTests { @ValueSource(strings = { "no-cache", "s-no-cache, no-cache", "private,no-cache", " no-cache", "no-cache " }) void shouldIdentifyRequestAsNoCacheRequest(String cacheControl) { MockServerHttpRequest httpRequest = MockServerHttpRequest.get("https://this") - .header("Cache-Control", cacheControl).build(); + .header("Cache-Control", cacheControl) + .build(); boolean result = LocalResponseCacheUtils.isNoCacheRequest(httpRequest); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/DefaultKeyValueGeneratorTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/DefaultKeyValueGeneratorTests.java index f22a5cee..ce507d40 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/DefaultKeyValueGeneratorTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/DefaultKeyValueGeneratorTests.java @@ -73,8 +73,9 @@ class DefaultKeyValueGeneratorTests { } public String apply(ServerHttpRequest request) { - return CacheKeyGenerator.DEFAULT_KEY_VALUE_GENERATORS.stream().map(generator -> generator.apply(request)) - .collect(Collectors.joining(CacheKeyGenerator.KEY_SEPARATOR)); + return CacheKeyGenerator.DEFAULT_KEY_VALUE_GENERATORS.stream() + .map(generator -> generator.apply(request)) + .collect(Collectors.joining(CacheKeyGenerator.KEY_SEPARATOR)); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/HeaderKeyValueGeneratorTest.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/HeaderKeyValueGeneratorTest.java index 38f2cdde..b1b4dab8 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/HeaderKeyValueGeneratorTest.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/HeaderKeyValueGeneratorTest.java @@ -44,7 +44,7 @@ class HeaderKeyValueGeneratorTest { @Test void exceptionIsThrown_whenConstructorHeaderIsNull() { assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> new HeaderKeyValueGenerator(null, SEPARATOR)); + .isThrownBy(() -> new HeaderKeyValueGenerator(null, SEPARATOR)); } @Test diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetCacheDirectivesByMaxAgeAfterCacheExchangeMutatorTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetCacheDirectivesByMaxAgeAfterCacheExchangeMutatorTests.java index 2911a213..672ae07d 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetCacheDirectivesByMaxAgeAfterCacheExchangeMutatorTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetCacheDirectivesByMaxAgeAfterCacheExchangeMutatorTests.java @@ -68,7 +68,9 @@ class SetCacheDirectivesByMaxAgeAfterCacheExchangeMutatorTests { toTest.accept(inputExchange, null); assertThat(inputExchange.getResponse().getHeaders().getCacheControl()).doesNotContainPattern(",\\s*,") - .contains("max-age=0").contains("must-revalidate").contains("no-cache"); + .contains("max-age=0") + .contains("must-revalidate") + .contains("no-cache"); } @ParameterizedTest @@ -82,8 +84,10 @@ class SetCacheDirectivesByMaxAgeAfterCacheExchangeMutatorTests { toTest.accept(inputExchange, null); assertThat(inputExchange.getResponse().getHeaders().getCacheControl()).contains("max-age=10") - .doesNotContainPattern(",\\s*,").doesNotContain("no-store").doesNotContain("must-revalidate") - .doesNotContain("no-cache"); + .doesNotContainPattern(",\\s*,") + .doesNotContain("no-store") + .doesNotContain("must-revalidate") + .doesNotContain("no-cache"); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetMaxAgeHeaderAfterCacheExchangeMutatorTest.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetMaxAgeHeaderAfterCacheExchangeMutatorTest.java index fab93d26..c304b89c 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetMaxAgeHeaderAfterCacheExchangeMutatorTest.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetMaxAgeHeaderAfterCacheExchangeMutatorTest.java @@ -144,7 +144,7 @@ class SetMaxAgeHeaderAfterCacheExchangeMutatorTest { toTest.accept(inputExchange, inputCachedResponse); String[] cacheControlValues = StringUtils - .tokenizeToStringArray(inputExchange.getResponse().getHeaders().getCacheControl(), ","); + .tokenizeToStringArray(inputExchange.getResponse().getHeaders().getCacheControl(), ","); assertThat(cacheControlValues).contains("max-stale=12", "min-stale=1"); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetResponseHeadersAfterCacheExchangeMutatorTest.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetResponseHeadersAfterCacheExchangeMutatorTest.java index 735271ad..0ec76889 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetResponseHeadersAfterCacheExchangeMutatorTest.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/postprocessor/SetResponseHeadersAfterCacheExchangeMutatorTest.java @@ -53,12 +53,12 @@ class SetResponseHeadersAfterCacheExchangeMutatorTest { SetResponseHeadersAfterCacheExchangeMutator toTest = new SetResponseHeadersAfterCacheExchangeMutator(); inputExchange.getResponse().getHeaders().set("X-Header-1", "Value-original"); CachedResponse cachedResponse = new CachedResponse.Builder(HttpStatus.OK).header("X-Header-1", "Value-cached") - .build(); + .build(); toTest.accept(inputExchange, cachedResponse); - Assertions.assertThat(inputExchange.getResponse().getHeaders()).containsEntry("X-Header-1", - List.of("Value-cached")); + Assertions.assertThat(inputExchange.getResponse().getHeaders()) + .containsEntry("X-Header-1", List.of("Value-cached")); } @Test diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactorySslTimeoutTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactorySslTimeoutTests.java index 2cb27a89..8ffc9794 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactorySslTimeoutTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactorySslTimeoutTests.java @@ -73,8 +73,9 @@ class ModifyRequestBodyGatewayFilterFactorySslTimeoutTests extends BaseWebClient public void setup() { try { System.err.println("in github = " + System.getenv("GITHUB_ACTIONS")); - SslContext sslContext = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE) - .build(); + SslContext sslContext = SslContextBuilder.forClient() + .trustManager(InsecureTrustManagerFactory.INSTANCE) + .build(); HttpClient httpClient = HttpClient.create().secure(ssl -> ssl.sslContext(sslContext)); setup(new ReactorClientHttpConnector(httpClient), "https://localhost:" + port); } @@ -86,11 +87,17 @@ class ModifyRequestBodyGatewayFilterFactorySslTimeoutTests extends BaseWebClient @Test @DisabledIfEnvironmentVariable(named = "GITHUB_ACTIONS", matches = "true") void modifyRequestBodySSLTimeout() { - testClient.post().uri("/post").header("Host", "www.modifyrequestbodyssltimeout.org") - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE) - .body(BodyInserters.fromValue("request")).exchange().expectStatus() - .isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR).expectBody().jsonPath("message") - .isEqualTo("handshake timed out after 1ms"); + testClient.post() + .uri("/post") + .header("Host", "www.modifyrequestbodyssltimeout.org") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE) + .body(BodyInserters.fromValue("request")) + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR) + .expectBody() + .jsonPath("message") + .isEqualTo("handshake timed out after 1ms"); } @DisabledIfEnvironmentVariable(named = "GITHUB_ACTIONS", matches = "true") @@ -99,10 +106,14 @@ class ModifyRequestBodyGatewayFilterFactorySslTimeoutTests extends BaseWebClient releaseCount.set(0); // long initialUsedDirectMemory = PlatformDependent.usedDirectMemory(); for (int i = 0; i < 10; i++) { - testClient.post().uri("/post").header("Host", "www.modifyrequestbodyssltimeout.org") - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE) - .body(BodyInserters.fromValue("request")).exchange().expectStatus() - .isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); + testClient.post() + .uri("/post") + .header("Host", "www.modifyrequestbodyssltimeout.org") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE) + .body(BodyInserters.fromValue("request")) + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); long usedDirectMemory = PlatformDependent.usedDirectMemory(); // Assert.assertTrue(usedDirectMemory - initialUsedDirectMemory < 2 * 10 * 10 // * 1024 * 1024); @@ -113,11 +124,17 @@ class ModifyRequestBodyGatewayFilterFactorySslTimeoutTests extends BaseWebClient @Test @DisabledIfEnvironmentVariable(named = "GITHUB_ACTIONS", matches = "true") void modifyRequestBodyHappenedError() { - testClient.post().uri("/post").header("Host", "www.modifyrequestbodyexception.org") - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE) - .body(BodyInserters.fromValue("request")).exchange().expectStatus() - .isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR).expectBody().jsonPath("message") - .isEqualTo("modify body exception"); + testClient.post() + .uri("/post") + .header("Host", "www.modifyrequestbodyexception.org") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE) + .body(BodyInserters.fromValue("request")) + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR) + .expectBody() + .jsonPath("message") + .isEqualTo("modify body exception"); } @EnableAutoConfiguration @@ -132,22 +149,24 @@ class ModifyRequestBodyGatewayFilterFactorySslTimeoutTests extends BaseWebClient @DependsOn("testModifyRequestBodyGatewayFilterFactory") RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("test_modify_request_body_ssl_timeout", - r -> r.order(-1).host("**.modifyrequestbodyssltimeout.org") - .filters(f -> f.modifyRequestBody(String.class, String.class, - MediaType.APPLICATION_JSON_VALUE, (serverWebExchange, aVoid) -> { - byte[] largeBody = new byte[10 * 1024 * 1024]; - return Mono.just(new String(largeBody)); - })) - .uri(uri)) - .route("test_modify_request_body_exception", - r -> r.order(-1).host("**.modifyrequestbodyexception.org") - .filters(f -> f.modifyRequestBody(String.class, String.class, - MediaType.APPLICATION_JSON_VALUE, (serverWebExchange, body) -> { - return Mono.error(new Exception("modify body exception")); - })) - .uri(uri)) - .build(); + .route("test_modify_request_body_ssl_timeout", + r -> r.order(-1) + .host("**.modifyrequestbodyssltimeout.org") + .filters(f -> f.modifyRequestBody(String.class, String.class, + MediaType.APPLICATION_JSON_VALUE, (serverWebExchange, aVoid) -> { + byte[] largeBody = new byte[10 * 1024 * 1024]; + return Mono.just(new String(largeBody)); + })) + .uri(uri)) + .route("test_modify_request_body_exception", + r -> r.order(-1) + .host("**.modifyrequestbodyexception.org") + .filters(f -> f.modifyRequestBody(String.class, String.class, + MediaType.APPLICATION_JSON_VALUE, (serverWebExchange, body) -> { + return Mono.error(new Exception("modify body exception")); + })) + .uri(uri)) + .build(); } @Bean diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactoryTests.java index 4d216a44..d4440c9b 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactoryTests.java @@ -46,36 +46,65 @@ public class ModifyRequestBodyGatewayFilterFactoryTests extends BaseWebClientTes @Test public void modifyRequestBody() { - testClient.post().uri("/post").header("Host", "www.modifyrequestbody.org") - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE) - .body(BodyInserters.fromValue("request")).exchange().expectStatus().isEqualTo(HttpStatus.OK) - .expectBody().jsonPath("headers.Content-Type").isEqualTo(MediaType.APPLICATION_JSON_VALUE) - .jsonPath("data").isEqualTo("modifyrequest"); + testClient.post() + .uri("/post") + .header("Host", "www.modifyrequestbody.org") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE) + .body(BodyInserters.fromValue("request")) + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.OK) + .expectBody() + .jsonPath("headers.Content-Type") + .isEqualTo(MediaType.APPLICATION_JSON_VALUE) + .jsonPath("data") + .isEqualTo("modifyrequest"); } @Test public void upstreamRequestBodyIsEmpty() { - testClient.post().uri("/post").header("Host", "www.modifyrequestbodyempty.org") - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).exchange().expectStatus() - .isEqualTo(HttpStatus.OK).expectBody().jsonPath("headers.Content-Type") - .isEqualTo(MediaType.APPLICATION_JSON_VALUE).jsonPath("data").isEqualTo("modifyrequest"); + testClient.post() + .uri("/post") + .header("Host", "www.modifyrequestbodyempty.org") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.OK) + .expectBody() + .jsonPath("headers.Content-Type") + .isEqualTo(MediaType.APPLICATION_JSON_VALUE) + .jsonPath("data") + .isEqualTo("modifyrequest"); } @Test public void modifyRequestBodyToLarge() { - testClient.post().uri("/post").header("Host", "www.modifyrequestbodyemptytolarge.org") - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE) - .body(BodyInserters.fromValue("request")).exchange().expectStatus() - .isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR).expectBody().jsonPath("message") - .isEqualTo("Exceeded limit on max bytes to buffer : 13"); + testClient.post() + .uri("/post") + .header("Host", "www.modifyrequestbodyemptytolarge.org") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE) + .body(BodyInserters.fromValue("request")) + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR) + .expectBody() + .jsonPath("message") + .isEqualTo("Exceeded limit on max bytes to buffer : 13"); } @Test public void modifyRequestBodyParameterizedTypeReference() { - testClient.post().uri("/post").header("Host", "www.modifyrequestbodyspacetounderscore.org") - .header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE) - .body(BodyInserters.fromValue("foo bar baz")).exchange().expectStatus().isEqualTo(HttpStatus.OK) - .expectBody().jsonPath("data").isEqualTo("FOO_BAR_BAZ"); + testClient.post() + .uri("/post") + .header("Host", "www.modifyrequestbodyspacetounderscore.org") + .header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE) + .body(BodyInserters.fromValue("foo bar baz")) + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.OK) + .expectBody() + .jsonPath("data") + .isEqualTo("FOO_BAR_BAZ"); } @EnableAutoConfiguration @@ -88,37 +117,45 @@ public class ModifyRequestBodyGatewayFilterFactoryTests extends BaseWebClientTes @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("test_modify_request_body", - r -> r.order(-1).host("**.modifyrequestbody.org").filters(f -> f.modifyRequestBody(String.class, - String.class, MediaType.APPLICATION_JSON_VALUE, (serverWebExchange, aVoid) -> { - return Mono.just("modifyrequest"); - })).uri(uri)) - .route("test_modify_request_body_empty", - r -> r.order(-1).host("**.modifyrequestbodyempty.org") - .filters(f -> f.modifyRequestBody(String.class, String.class, - MediaType.APPLICATION_JSON_VALUE, (serverWebExchange, body) -> { - if (body == null) { - return Mono.just("modifyrequest"); - } - return Mono.just(body.toUpperCase()); - })) - .uri(uri)) - .route("test_modify_request_body_to_large", - r -> r.order(-1).host("**.modifyrequestbodyemptytolarge.org") - .filters(f -> f.modifyRequestBody(String.class, String.class, - MediaType.APPLICATION_JSON_VALUE, (serverWebExchange, body) -> { - return Mono.just( - "tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge"); - })) - .uri(uri)) - .route("test_modify_request_body_with_parameterizedtypereference", - r -> r.order(-1).host("**.modifyrequestbodyspacetounderscore.org") - .filters(f -> f.modifyRequestBody(new ParameterizedTypeReference() { - }, new ParameterizedTypeReference() { - }, (swe, body) -> { - return Mono.just(body.replaceAll(" ", "_").toUpperCase()); - })).uri(uri)) - .build(); + return builder.routes() + .route("test_modify_request_body", + r -> r.order(-1) + .host("**.modifyrequestbody.org") + .filters(f -> f.modifyRequestBody(String.class, String.class, + MediaType.APPLICATION_JSON_VALUE, (serverWebExchange, aVoid) -> { + return Mono.just("modifyrequest"); + })) + .uri(uri)) + .route("test_modify_request_body_empty", + r -> r.order(-1) + .host("**.modifyrequestbodyempty.org") + .filters(f -> f.modifyRequestBody(String.class, String.class, + MediaType.APPLICATION_JSON_VALUE, (serverWebExchange, body) -> { + if (body == null) { + return Mono.just("modifyrequest"); + } + return Mono.just(body.toUpperCase()); + })) + .uri(uri)) + .route("test_modify_request_body_to_large", + r -> r.order(-1) + .host("**.modifyrequestbodyemptytolarge.org") + .filters(f -> f.modifyRequestBody(String.class, String.class, + MediaType.APPLICATION_JSON_VALUE, (serverWebExchange, body) -> { + return Mono.just( + "tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge-tolarge"); + })) + .uri(uri)) + .route("test_modify_request_body_with_parameterizedtypereference", + r -> r.order(-1) + .host("**.modifyrequestbodyspacetounderscore.org") + .filters(f -> f.modifyRequestBody(new ParameterizedTypeReference() { + }, new ParameterizedTypeReference() { + }, (swe, body) -> { + return Mono.just(body.replaceAll(" ", "_").toUpperCase()); + })) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactoryGzipTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactoryGzipTests.java index 6c871771..e2df791c 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactoryGzipTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactoryGzipTests.java @@ -46,8 +46,13 @@ class ModifyResponseBodyGatewayFilterFactoryGzipTests extends BaseWebClientTests void testModificationOfResponseBody() { URI uri = UriComponentsBuilder.fromUriString(this.baseUri + "/gzip").build(true).toUri(); - testClient.get().uri(uri).header("Host", "www.modifyresponsebodyjava.org").accept(MediaType.APPLICATION_JSON) - .exchange().expectBody().json("{\"length\":25,\"value\":\"\\\"httpbin compatible home\\\"\"}"); + testClient.get() + .uri(uri) + .header("Host", "www.modifyresponsebodyjava.org") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectBody() + .json("{\"length\":25,\"value\":\"\\\"httpbin compatible home\\\"\"}"); } @EnableAutoConfiguration @@ -60,14 +65,18 @@ class ModifyResponseBodyGatewayFilterFactoryGzipTests extends BaseWebClientTests @Bean RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("modify_response_java_test_gzip", r -> r.path("/gzip").and() + return builder.routes() + .route("modify_response_java_test_gzip", r -> r.path("/gzip") + .and() .host("www.modifyresponsebodyjava.org") .filters(f -> f.modifyResponseBody(String.class, Map.class, (webExchange, originalResponse) -> { Map modifiedResponse = new HashMap<>(); modifiedResponse.put("value", originalResponse); modifiedResponse.put("length", originalResponse.length()); return Mono.just(modifiedResponse); - })).uri(uri)).build(); + })) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactoryTests.java index 8fc21607..ee87983f 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactoryTests.java @@ -61,27 +61,44 @@ public class ModifyResponseBodyGatewayFilterFactoryTests extends BaseWebClientTe public void testModificationOfResponseBody() { URI uri = UriComponentsBuilder.fromUriString(this.baseUri + "/").build(true).toUri(); - testClient.get().uri(uri).header("Host", "www.modifyresponsebodyjava.org").accept(MediaType.APPLICATION_JSON) - .exchange().expectBody().json("{\"value\": \"httpbin compatible home\", \"length\": 23}"); + testClient.get() + .uri(uri) + .header("Host", "www.modifyresponsebodyjava.org") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectBody() + .json("{\"value\": \"httpbin compatible home\", \"length\": 23}"); } @Test public void testModificationOfContentType() { URI uri = UriComponentsBuilder.fromUriString(this.baseUri + "/").build(true).toUri(); - testClient.get().uri(uri).header("Host", "www.modifyresponsebodyjavacontenttype.org").accept(MediaType.ALL) - .exchange().expectHeader().valueEquals(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE) - .expectBody().consumeWith(result -> assertThat(new String(result.getResponseBody(), UTF_8)) - .isEqualTo("Modified response")); + testClient.get() + .uri(uri) + .header("Host", "www.modifyresponsebodyjavacontenttype.org") + .accept(MediaType.ALL) + .exchange() + .expectHeader() + .valueEquals(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE) + .expectBody() + .consumeWith( + result -> assertThat(new String(result.getResponseBody(), UTF_8)).isEqualTo("Modified response")); } @Test public void modifyResponeBodyToLarge() { - testClient.post().uri("/post").header("Host", "www.modifyresponsebodyjavatoolarge.org") - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .body(BodyInserters.fromValue(toLarge)).exchange().expectStatus() - .isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR).expectBody().jsonPath("message") - .isEqualTo("Exceeded limit on max bytes to buffer : 40"); + testClient.post() + .uri("/post") + .header("Host", "www.modifyresponsebodyjavatoolarge.org") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .body(BodyInserters.fromValue(toLarge)) + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR) + .expectBody() + .jsonPath("message") + .isEqualTo("Exceeded limit on max bytes to buffer : 40"); } @EnableAutoConfiguration @@ -94,30 +111,39 @@ public class ModifyResponseBodyGatewayFilterFactoryTests extends BaseWebClientTe @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("modify_response_java_test", - r -> r.path("/").and().host("www.modifyresponsebodyjava.org").filters(f -> f.prefixPath("/httpbin") - .modifyResponseBody(String.class, Map.class, (webExchange, originalResponse) -> { - Map modifiedResponse = new HashMap<>(); - modifiedResponse.put("value", originalResponse); - modifiedResponse.put("length", originalResponse.length()); - return Mono.just(modifiedResponse); - })).uri(uri)) - .route("modify_response_java_test_to_large", - r -> r.path("/").and().host("www.modifyresponsebodyjavatoolarge.org") - .filters(f -> f.prefixPath("/httpbin").modifyResponseBody(String.class, - String.class, (webExchange, originalResponse) -> { - return Mono.just(toLarge); - })) - .uri(uri)) - .route("modify_response_java_test_content_type", - r -> r.path("/").and().host("www.modifyresponsebodyjavacontenttype.org") - .filters( - f -> f.prefixPath("/httpbin").modifyResponseBody(String.class, String.class, - MediaType.TEXT_PLAIN_VALUE, (webExchange, originalResponse) -> { - return Mono.just("Modified response"); - })) - .uri(uri)) - .build(); + return builder.routes() + .route("modify_response_java_test", + r -> r.path("/") + .and() + .host("www.modifyresponsebodyjava.org") + .filters(f -> f.prefixPath("/httpbin") + .modifyResponseBody(String.class, Map.class, (webExchange, originalResponse) -> { + Map modifiedResponse = new HashMap<>(); + modifiedResponse.put("value", originalResponse); + modifiedResponse.put("length", originalResponse.length()); + return Mono.just(modifiedResponse); + })) + .uri(uri)) + .route("modify_response_java_test_to_large", + r -> r.path("/") + .and() + .host("www.modifyresponsebodyjavatoolarge.org") + .filters(f -> f.prefixPath("/httpbin") + .modifyResponseBody(String.class, String.class, (webExchange, originalResponse) -> { + return Mono.just(toLarge); + })) + .uri(uri)) + .route("modify_response_java_test_content_type", + r -> r.path("/") + .and() + .host("www.modifyresponsebodyjavacontenttype.org") + .filters(f -> f.prefixPath("/httpbin") + .modifyResponseBody(String.class, String.class, MediaType.TEXT_PLAIN_VALUE, + (webExchange, originalResponse) -> { + return Mono.just("Modified response"); + })) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactoryUnitTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactoryUnitTests.java index a6bd9d7b..6ee99369 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactoryUnitTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactoryUnitTests.java @@ -34,7 +34,8 @@ public class ModifyResponseBodyGatewayFilterFactoryUnitTests { config.setOutClass(Integer.class); config.setNewContentType("mycontenttype"); GatewayFilter filter = new ModifyResponseBodyGatewayFilterFactory( - new DefaultServerCodecConfigurer().getReaders(), emptySet(), emptySet()).apply(config); + new DefaultServerCodecConfigurer().getReaders(), emptySet(), emptySet()) + .apply(config); assertThat(filter.toString()).contains("String").contains("Integer").contains("mycontenttype"); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilterTests.java index 152b536b..73cb0003 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilterTests.java @@ -55,8 +55,9 @@ public class ForwardedHeadersFilterTests { @Test public void forwardedHeaderDoesNotExist() throws UnknownHostException { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost/get") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) - .header(HttpHeaders.HOST, "myhost").build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .header(HttpHeaders.HOST, "myhost") + .build(); ForwardedHeadersFilter filter = new ForwardedHeadersFilter(); @@ -69,15 +70,17 @@ public class ForwardedHeadersFilterTests { assertThat(forwardeds).hasSize(1); Forwarded forwarded = forwardeds.get(0); - assertThat(forwarded.getValues()).containsEntry("host", "myhost").containsEntry("proto", "http") - .containsEntry("for", "\"10.0.0.1:80\""); + assertThat(forwarded.getValues()).containsEntry("host", "myhost") + .containsEntry("proto", "http") + .containsEntry("for", "\"10.0.0.1:80\""); } @Test public void forwardedHeaderExists() throws UnknownHostException { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost/get") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) - .header(FORWARDED_HEADER, "for=12.34.56.78;host=example.com;proto=https; for=23.45.67.89").build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .header(FORWARDED_HEADER, "for=12.34.56.78;host=example.com;proto=https; for=23.45.67.89") + .build(); ForwardedHeadersFilter filter = new ForwardedHeadersFilter(); @@ -91,17 +94,18 @@ public class ForwardedHeadersFilterTests { Forwarded addedForwardedHeader = forwardeds.get(0); Forwarded existingForwardedHeader = forwardeds.get(1); - assertThat(existingForwardedHeader.getValues()).containsEntry("proto", "http").containsEntry("for", - "\"10.0.0.1:80\""); + assertThat(existingForwardedHeader.getValues()).containsEntry("proto", "http") + .containsEntry("for", "\"10.0.0.1:80\""); - assertThat(addedForwardedHeader.getValues()).containsEntry("proto", "https").containsEntry("for", - "23.45.67.89"); + assertThat(addedForwardedHeader.getValues()).containsEntry("proto", "https") + .containsEntry("for", "23.45.67.89"); } @Test public void noHostHeader() throws UnknownHostException { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost/get") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)).build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .build(); ForwardedHeadersFilter filter = new ForwardedHeadersFilter(); @@ -120,8 +124,9 @@ public class ForwardedHeadersFilterTests { @Test public void correctIPv6RemoteAddressMapping() throws UnknownHostException { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost/get") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("2001:db8:cafe:0:0:0:0:17"), 80)) - .header(HttpHeaders.HOST, "myhost").build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("2001:db8:cafe:0:0:0:0:17"), 80)) + .header(HttpHeaders.HOST, "myhost") + .build(); ForwardedHeadersFilter filter = new ForwardedHeadersFilter(); @@ -140,7 +145,8 @@ public class ForwardedHeadersFilterTests { @Test public void unresolvedRemoteAddressFallsBackToHostName() throws UnknownHostException { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost/get") - .remoteAddress(InetSocketAddress.createUnresolved("unresolvable-hostname", 80)).build(); + .remoteAddress(InetSocketAddress.createUnresolved("unresolvable-hostname", 80)) + .build(); ForwardedHeadersFilter filter = new ForwardedHeadersFilter(); @@ -153,8 +159,8 @@ public class ForwardedHeadersFilterTests { assertThat(forwardeds).hasSize(1); Forwarded forwarded = forwardeds.get(0); - assertThat(forwarded.getValues()).containsEntry("proto", "http").containsEntry("for", - "\"unresolvable-hostname:80\""); + assertThat(forwarded.getValues()).containsEntry("proto", "http") + .containsEntry("for", "\"unresolvable-hostname:80\""); } @Test diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/GRPCRequestHeadersFilterTest.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/GRPCRequestHeadersFilterTest.java index ad8d3dd3..ea23db6b 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/GRPCRequestHeadersFilterTest.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/GRPCRequestHeadersFilterTest.java @@ -32,7 +32,8 @@ public class GRPCRequestHeadersFilterTest { @Test public void shouldIncludeTrailersHeaderIfGRPC() { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost:8080/get") - .header(HttpHeaders.CONTENT_TYPE, "application/grpc").build(); + .header(HttpHeaders.CONTENT_TYPE, "application/grpc") + .build(); GRPCRequestHeadersFilter filter = new GRPCRequestHeadersFilter(); @@ -46,7 +47,8 @@ public class GRPCRequestHeadersFilterTest { @Test public void shouldNotIncludeTrailersHeaderIfNotGRPC() { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost:8080/get") - .header(HttpHeaders.CONTENT_TYPE, "application/json").build(); + .header(HttpHeaders.CONTENT_TYPE, "application/json") + .build(); GRPCRequestHeadersFilter filter = new GRPCRequestHeadersFilter(); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/HttpHeadersFilterMixedTypeTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/HttpHeadersFilterMixedTypeTests.java index c04e7af3..1ee3cb38 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/HttpHeadersFilterMixedTypeTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/HttpHeadersFilterMixedTypeTests.java @@ -37,8 +37,11 @@ public class HttpHeadersFilterMixedTypeTests { @Test public void relevantDownstreamFiltersShouldActOnHeaders() { - MockServerHttpRequest mockRequest = MockServerHttpRequest.get("/get").header("header1", "value1") - .header("header2", "value2").header("header3", "value3").build(); + MockServerHttpRequest mockRequest = MockServerHttpRequest.get("/get") + .header("header1", "value1") + .header("header2", "value2") + .header("header3", "value3") + .build(); HttpHeadersFilter filter1 = filterRemovingHeaders(Type.RESPONSE, "header1"); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/HttpHeadersFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/HttpHeadersFilterTests.java index 049c8e6a..9940d035 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/HttpHeadersFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/HttpHeadersFilterTests.java @@ -35,8 +35,11 @@ public class HttpHeadersFilterTests { @Test public void httpHeadersFilterTests() { - MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost:8080/get").header("X-A", "aValue") - .header("X-B", "bValue").header("X-C", "cValue").build(); + MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost:8080/get") + .header("X-A", "aValue") + .header("X-B", "bValue") + .header("X-C", "cValue") + .build(); List filters = Arrays.asList((h, e) -> HttpHeadersFilterTests.this.filter(h, "X-A"), (h, e) -> HttpHeadersFilterTests.this.filter(h, "X-B")); @@ -49,8 +52,10 @@ public class HttpHeadersFilterTests { private HttpHeaders filter(HttpHeaders input, String keyToFilter) { HttpHeaders filtered = new HttpHeaders(); - input.entrySet().stream().filter(entry -> !entry.getKey().equals(keyToFilter)) - .forEach(entry -> filtered.addAll(entry.getKey(), entry.getValue())); + input.entrySet() + .stream() + .filter(entry -> !entry.getKey().equals(keyToFilter)) + .forEach(entry -> filtered.addAll(entry.getKey(), entry.getValue())); return filtered; } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/NonStandardHeadersInResponseTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/NonStandardHeadersInResponseTests.java index 42cdb6cc..8fc9ffcf 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/NonStandardHeadersInResponseTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/NonStandardHeadersInResponseTests.java @@ -52,9 +52,14 @@ public class NonStandardHeadersInResponseTests extends BaseWebClientTests { public void nonStandardHeadersInResponse() { URI uri = UriComponentsBuilder.fromUriString(this.baseUri + "/get-image").build(true).toUri(); - String contentType = WebClient.builder().baseUrl(baseUri).build().get().uri(uri).exchangeToMono(Mono::just) - .map(clientResponse -> clientResponse.headers().asHttpHeaders().getFirst(HttpHeaders.CONTENT_TYPE)) - .block(); + String contentType = WebClient.builder() + .baseUrl(baseUri) + .build() + .get() + .uri(uri) + .exchangeToMono(Mono::just) + .map(clientResponse -> clientResponse.headers().asHttpHeaders().getFirst(HttpHeaders.CONTENT_TYPE)) + .block(); assertThat(contentType).isEqualTo(CONTENT_TYPE_IMAGE); } @@ -86,11 +91,12 @@ public class NonStandardHeadersInResponseTests extends BaseWebClientTests { @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("non_standard_header_route", r -> r.path("/get-image/**") + return builder.routes() + .route("non_standard_header_route", r -> r.path("/get-image/**") .filters(f -> f.addRequestHeader(HttpHeaders.HOST, "www.addrequestparameter.org").stripPrefix(1)) .uri("http://localhost:" + port + "/get")) - .route("internal_route", r -> r.path("/get/**").filters(f -> f.prefixPath("/httpbin")).uri(uri)) - .build(); + .route("internal_route", r -> r.path("/get/**").filters(f -> f.prefixPath("/httpbin")).uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/RemoveHopByHopHeadersFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/RemoveHopByHopHeadersFilterTests.java index 08e6e211..0a5445fa 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/RemoveHopByHopHeadersFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/RemoveHopByHopHeadersFilterTests.java @@ -60,7 +60,7 @@ public class RemoveHopByHopHeadersFilterTests { MockServerHttpRequest.BaseBuilder builder = MockServerHttpRequest.get("http://localhost/get"); HEADERS_REMOVED_ON_REQUEST - .forEach(header -> builder.header(StringUtils.capitalize(header.toLowerCase()), header + "1")); + .forEach(header -> builder.header(StringUtils.capitalize(header.toLowerCase()), header + "1")); LinkedHashSet customHeaders = new LinkedHashSet<>(); HEADERS_REMOVED_ON_REQUEST.forEach(header -> { diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/TransferEncodingNormalizationHeadersFilterIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/TransferEncodingNormalizationHeadersFilterIntegrationTests.java index 5307f2e1..6f5b8d5f 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/TransferEncodingNormalizationHeadersFilterIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/TransferEncodingNormalizationHeadersFilterIntegrationTests.java @@ -112,8 +112,8 @@ public class TransferEncodingNormalizationHeadersFilterIntegrationTests { @Bean public RouteLocator routeLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("echo", r -> r.path("/route/echo").filters(f -> f.stripPrefix(1)).uri("lb://xferenc")) - .build(); + .route("echo", r -> r.path("/route/echo").filters(f -> f.stripPrefix(1)).uri("lb://xferenc")) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/TransferEncodingNormalizationHeadersFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/TransferEncodingNormalizationHeadersFilterTests.java index 129ed58f..68e223a0 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/TransferEncodingNormalizationHeadersFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/TransferEncodingNormalizationHeadersFilterTests.java @@ -32,7 +32,7 @@ public class TransferEncodingNormalizationHeadersFilterTests { @Test public void noTransferEncodingWithContentLength() { MockServerHttpRequest.BaseBuilder builder = MockServerHttpRequest.post("http://localhost/post") - .header(HttpHeaders.CONTENT_LENGTH, "6"); + .header(HttpHeaders.CONTENT_LENGTH, "6"); HttpHeaders headers = testFilter(MockServerWebExchange.from(builder)); assertThat(headers).containsKey(HttpHeaders.CONTENT_LENGTH).doesNotContainKey(HttpHeaders.TRANSFER_ENCODING); @@ -41,7 +41,8 @@ public class TransferEncodingNormalizationHeadersFilterTests { @Test public void transferEncodingWithContentLength() { MockServerHttpRequest.BaseBuilder builder = MockServerHttpRequest.post("http://localhost/post") - .header(HttpHeaders.CONTENT_LENGTH, "6").header(HttpHeaders.TRANSFER_ENCODING, "chunked"); + .header(HttpHeaders.CONTENT_LENGTH, "6") + .header(HttpHeaders.TRANSFER_ENCODING, "chunked"); HttpHeaders headers = testFilter(MockServerWebExchange.from(builder)); assertThat(headers).doesNotContainKey(HttpHeaders.CONTENT_LENGTH).containsKey(HttpHeaders.TRANSFER_ENCODING); @@ -50,7 +51,8 @@ public class TransferEncodingNormalizationHeadersFilterTests { @Test public void transferEncodingCaseInsensitiveWithContentLength() { MockServerHttpRequest.BaseBuilder builder = MockServerHttpRequest.post("http://localhost/post") - .header(HttpHeaders.CONTENT_LENGTH, "6").header(HttpHeaders.TRANSFER_ENCODING, "Chunked "); + .header(HttpHeaders.CONTENT_LENGTH, "6") + .header(HttpHeaders.TRANSFER_ENCODING, "Chunked "); HttpHeaders headers = testFilter(MockServerWebExchange.from(builder)); assertThat(headers).doesNotContainKey(HttpHeaders.CONTENT_LENGTH).containsKey(HttpHeaders.TRANSFER_ENCODING); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilterTests.java index 04459e46..5bfcd7e8 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilterTests.java @@ -46,7 +46,8 @@ public class XForwardedHeadersFilterTests { @Test public void remoteAddressIsNull() throws Exception { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost:8080/get") - .header(HttpHeaders.HOST, "myhost").build(); + .header(HttpHeaders.HOST, "myhost") + .build(); XForwardedHeadersFilter filter = new XForwardedHeadersFilter(); @@ -62,8 +63,9 @@ public class XForwardedHeadersFilterTests { @Test public void xForwardedHeadersDoNotExist() throws Exception { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost:8080/get") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) - .header(HttpHeaders.HOST, "myhost").build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .header(HttpHeaders.HOST, "myhost") + .build(); XForwardedHeadersFilter filter = new XForwardedHeadersFilter(); @@ -81,8 +83,9 @@ public class XForwardedHeadersFilterTests { @Test public void defaultPort() throws Exception { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost/get") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) - .header(HttpHeaders.HOST, "myhost").build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .header(HttpHeaders.HOST, "myhost") + .build(); XForwardedHeadersFilter filter = new XForwardedHeadersFilter(); @@ -100,9 +103,12 @@ public class XForwardedHeadersFilterTests { @Test public void appendsValues() throws Exception { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost:8080/get") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) - .header(X_FORWARDED_FOR_HEADER, "192.168.0.2").header(X_FORWARDED_HOST_HEADER, "example.com") - .header(X_FORWARDED_PORT_HEADER, "443").header(X_FORWARDED_PROTO_HEADER, "https").build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .header(X_FORWARDED_FOR_HEADER, "192.168.0.2") + .header(X_FORWARDED_HOST_HEADER, "example.com") + .header(X_FORWARDED_PORT_HEADER, "443") + .header(X_FORWARDED_PROTO_HEADER, "https") + .build(); XForwardedHeadersFilter filter = new XForwardedHeadersFilter(); @@ -120,10 +126,13 @@ public class XForwardedHeadersFilterTests { @Test public void appendDisabled() throws Exception { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost:8080/get") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) - .header(X_FORWARDED_FOR_HEADER, "192.168.0.2").header(X_FORWARDED_HOST_HEADER, "example.com") - .header(X_FORWARDED_PORT_HEADER, "443").header(X_FORWARDED_PROTO_HEADER, "https") - .header(X_FORWARDED_PREFIX_HEADER, "/prefix").build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .header(X_FORWARDED_FOR_HEADER, "192.168.0.2") + .header(X_FORWARDED_HOST_HEADER, "example.com") + .header(X_FORWARDED_PORT_HEADER, "443") + .header(X_FORWARDED_PROTO_HEADER, "https") + .header(X_FORWARDED_PREFIX_HEADER, "/prefix") + .build(); XForwardedHeadersFilter filter = new XForwardedHeadersFilter(); filter.setForAppend(false); @@ -147,7 +156,8 @@ public class XForwardedHeadersFilterTests { @Test public void prefixToInfer() throws Exception { MockServerHttpRequest request = MockServerHttpRequest.get("https://originalhost:8080/prefix/get") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)).build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .build(); XForwardedHeadersFilter filter = new XForwardedHeadersFilter(); filter.setPrefixAppend(true); @@ -171,7 +181,8 @@ public class XForwardedHeadersFilterTests { @Test public void prefixToInferWhenEqualsResource() throws Exception { MockServerHttpRequest request = MockServerHttpRequest.get("https://originalhost:8080/resource/resource/") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)).build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .build(); XForwardedHeadersFilter filter = new XForwardedHeadersFilter(); filter.setPrefixAppend(true); @@ -179,8 +190,8 @@ public class XForwardedHeadersFilterTests { ServerWebExchange exchange = MockServerWebExchange.from(request); LinkedHashSet originalUris = new LinkedHashSet<>(); - originalUris.add( - UriComponentsBuilder.fromUriString("https://originalhost:8080/resource/resource/").build().toUri()); // trailing + originalUris + .add(UriComponentsBuilder.fromUriString("https://originalhost:8080/resource/resource/").build().toUri()); // trailing // slash exchange.getAttributes().put(GATEWAY_ORIGINAL_REQUEST_URL_ATTR, originalUris); URI requestUri = UriComponentsBuilder.fromUriString("https://routedservice:8090/resource").build().toUri(); @@ -196,7 +207,8 @@ public class XForwardedHeadersFilterTests { @Test public void prefixAddedWithoutTrailingSlash() throws Exception { MockServerHttpRequest request = MockServerHttpRequest.get("https://originalhost:8080/foo/bar") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)).build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .build(); XForwardedHeadersFilter filter = new XForwardedHeadersFilter(); filter.setPrefixAppend(true); @@ -217,7 +229,8 @@ public class XForwardedHeadersFilterTests { @Test public void noPrefixToInfer() throws Exception { MockServerHttpRequest request = MockServerHttpRequest.get("https://originalhost:8080/get") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)).build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .build(); XForwardedHeadersFilter filter = new XForwardedHeadersFilter(); filter.setPrefixAppend(true); @@ -242,7 +255,8 @@ public class XForwardedHeadersFilterTests { @Test public void routedPathInRequestPathButNotPrefix() throws Exception { MockServerHttpRequest request = MockServerHttpRequest.get("https://originalhost:8080/get") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)).build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .build(); XForwardedHeadersFilter filter = new XForwardedHeadersFilter(); filter.setPrefixAppend(true); @@ -267,7 +281,8 @@ public class XForwardedHeadersFilterTests { @Test public void allDisabled() throws Exception { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost:8080/get") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)).build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .build(); XForwardedHeadersFilter filter = new XForwardedHeadersFilter(); filter.setForEnabled(false); @@ -284,8 +299,9 @@ public class XForwardedHeadersFilterTests { @Test public void allowDuplicateEntriesInXForwardedForHeader() throws Exception { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost:8080/get") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) - .header(X_FORWARDED_FOR_HEADER, "10.0.0.1").build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .header(X_FORWARDED_FOR_HEADER, "10.0.0.1") + .build(); XForwardedHeadersFilter filter = new XForwardedHeadersFilter(); @@ -299,8 +315,9 @@ public class XForwardedHeadersFilterTests { @Test public void nullValuesSkipped() throws Exception { MockServerHttpRequest request = MockServerHttpRequest.get("/get") - .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) - .header(X_FORWARDED_FOR_HEADER, "10.0.0.1").build(); + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .header(X_FORWARDED_FOR_HEADER, "10.0.0.1") + .build(); XForwardedHeadersFilter filter = new XForwardedHeadersFilter(); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/B3BraveObservedHttpHeadersFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/B3BraveObservedHttpHeadersFilterTests.java index b8a8636d..bdd1fcd6 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/B3BraveObservedHttpHeadersFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/B3BraveObservedHttpHeadersFilterTests.java @@ -57,8 +57,10 @@ class B3BraveObservedHttpHeadersFilterTests { TestSpanHandler testSpanHandler = new TestSpanHandler(); Tracing tracing = Tracing.newBuilder() - .propagationFactory(B3Propagation.newFactoryBuilder().injectFormat(B3Propagation.Format.SINGLE).build()) - .addSpanHandler(testSpanHandler).sampler(Sampler.ALWAYS_SAMPLE).build(); + .propagationFactory(B3Propagation.newFactoryBuilder().injectFormat(B3Propagation.Format.SINGLE).build()) + .addSpanHandler(testSpanHandler) + .sampler(Sampler.ALWAYS_SAMPLE) + .build(); Tracer tracer = new BraveTracer(tracing.tracer(), new BraveCurrentTraceContext(tracing.currentTraceContext()), new BraveBaggageManager()); @@ -69,16 +71,16 @@ class B3BraveObservedHttpHeadersFilterTests { void shouldWorkWithB3SingleHeader() { TestObservationRegistry observationRegistry = TestObservationRegistry.create(); observationRegistry.observationConfig() - .observationHandler( - new ObservationHandler.FirstMatchingCompositeObservationHandler( - new GatewayPropagatingSenderTracingObservationHandler(tracer, propagator, - Collections.singletonList("X-A")), - new DefaultTracingObservationHandler(tracer))); + .observationHandler(new ObservationHandler.FirstMatchingCompositeObservationHandler( + new GatewayPropagatingSenderTracingObservationHandler(tracer, propagator, + Collections.singletonList("X-A")), + new DefaultTracingObservationHandler(tracer))); Observation.createNotStarted("parent", observationRegistry).observe(() -> { // given MockServerHttpRequest.BaseBuilder builder = MockServerHttpRequest - .get("http://localhost:8080/{foo}", "get").header("X-A", "aValue"); + .get("http://localhost:8080/{foo}", "get") + .header("X-A", "aValue"); TraceContext context = tracer.currentTraceContext().context(); propagator.inject(context, builder, (b, k, v) -> b.header(k, v)); @@ -87,12 +89,16 @@ class B3BraveObservedHttpHeadersFilterTests { MockServerWebExchange exchange = MockServerWebExchange.from(request); ServerWebExchangeUtils.putUriTemplateVariables(exchange, Map.of("foo", "get")); exchange.getResponse().setStatusCode(HttpStatusCode.valueOf(200)); - Route route = Route.async().id("foo").uri("http://localhost:8080/").order(1) - .predicate(serverWebExchange -> true).build(); + Route route = Route.async() + .id("foo") + .uri("http://localhost:8080/") + .order(1) + .predicate(serverWebExchange -> true) + .build(); exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR, route); // Parent observation Context ctx = Context - .of(Map.of(ObservationThreadLocalAccessor.KEY, observationRegistry.getCurrentObservation())); + .of(Map.of(ObservationThreadLocalAccessor.KEY, observationRegistry.getCurrentObservation())); exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REACTOR_CONTEXT_ATTR, ctx); // and @@ -107,10 +113,14 @@ class B3BraveObservedHttpHeadersFilterTests { // then assertThat(headers).containsOnlyKeys("X-A", "b3").doesNotContainEntry("b3", request.getHeaders().get("b3")); assertThat(headers.get("b3").get(0)).matches("^" + context.traceId() + "-(.*)-1-" + context.spanId() + "$"); - List finishedSpans = testSpanHandler.spans().stream().map(BraveFinishedSpan::new) - .collect(Collectors.toList()); - SpansAssert.then(finishedSpans).hasASpanWithName("HTTP GET", - spanAssert -> spanAssert.hasTag("spring.cloud.gateway.route.id", "foo").hasTag("http.method", "GET") + List finishedSpans = testSpanHandler.spans() + .stream() + .map(BraveFinishedSpan::new) + .collect(Collectors.toList()); + SpansAssert.then(finishedSpans) + .hasASpanWithName("HTTP GET", + spanAssert -> spanAssert.hasTag("spring.cloud.gateway.route.id", "foo") + .hasTag("http.method", "GET") .hasTag("http.status_code", "200") .hasTag("spring.cloud.gateway.route.uri", "http://localhost:8080/") .hasTag("http.uri", "http://localhost:8080/get")); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/GatewayPropagatingSenderTracingObservationHandlerTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/GatewayPropagatingSenderTracingObservationHandlerTests.java index 54b8054a..6187080f 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/GatewayPropagatingSenderTracingObservationHandlerTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/GatewayPropagatingSenderTracingObservationHandlerTests.java @@ -70,8 +70,9 @@ class GatewayPropagatingSenderTracingObservationHandlerTests { handler.onStart(gatewayContext); - then(headers).doesNotContainKeys("foo", "bar").containsEntry("baz", Collections.singletonList("baz value")) - .containsEntry("remote", Collections.singletonList("remote value")); + then(headers).doesNotContainKeys("foo", "bar") + .containsEntry("baz", Collections.singletonList("baz value")) + .containsEntry("remote", Collections.singletonList("remote value")); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/ObservationClosingWebExceptionHandlerTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/ObservationClosingWebExceptionHandlerTests.java index d3ff9b47..427b5481 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/ObservationClosingWebExceptionHandlerTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/ObservationClosingWebExceptionHandlerTests.java @@ -38,8 +38,9 @@ class ObservationClosingWebExceptionHandlerTests { @Test void shouldDoNothingWhenObservationAlreadyStopped() { exchange.getAttributes().put(ObservedResponseHttpHeadersFilter.OBSERVATION_STOPPED, "true"); - exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_OBSERVATION_ATTR, - "if this attribute will be attempted to be retrieved ClassCast will be thrown"); + exchange.getAttributes() + .put(ServerWebExchangeUtils.GATEWAY_OBSERVATION_ATTR, + "if this attribute will be attempted to be retrieved ClassCast will be thrown"); assertThatNoException().isThrownBy(() -> handler.handle(exchange, new RuntimeException())); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/ObservedHttpHeadersFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/ObservedHttpHeadersFilterTests.java index 88539034..9b223964 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/ObservedHttpHeadersFilterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/observation/ObservedHttpHeadersFilterTests.java @@ -58,52 +58,60 @@ public class ObservedHttpHeadersFilterTests extends SampleTestRunner { // We assume that there has already been a trace MockServerHttpRequest.BaseBuilder builder = MockServerHttpRequest - .get("http://localhost:8080/{foo}", "get").header("X-A", "aValue"); + .get("http://localhost:8080/{foo}", "get") + .header("X-A", "aValue"); TraceContext context = bb.getTracer().currentTraceContext().context(); bb.getPropagator().inject(context, builder, (b, k, v) -> b.header(k, v)); MockServerHttpRequest request = builder.build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); ServerWebExchangeUtils.putUriTemplateVariables(exchange, Map.of("foo", "get")); - Route route = Route.async().id("foo").uri("http://localhost:8080/").order(1) - .predicate(serverWebExchange -> true).build(); + Route route = Route.async() + .id("foo") + .uri("http://localhost:8080/") + .order(1) + .predicate(serverWebExchange -> true) + .build(); exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR, route); // Parent observation Context ctx = Context - .of(Map.of(ObservationThreadLocalAccessor.KEY, getObservationRegistry().getCurrentObservation())); + .of(Map.of(ObservationThreadLocalAccessor.KEY, getObservationRegistry().getCurrentObservation())); exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REACTOR_CONTEXT_ATTR, ctx); exchange.getResponse().setStatusCode(HttpStatusCode.valueOf(200)); // when HttpHeaders headers = new ObservedRequestHttpHeadersFilter(getObservationRegistry()) - .filter(request.getHeaders(), exchange); + .filter(request.getHeaders(), exchange); headers = new ObservedResponseHttpHeadersFilter().filter(headers, exchange); // then assertThat((String) exchange.getAttribute(ObservedResponseHttpHeadersFilter.OBSERVATION_STOPPED)) - .isNotNull(); + .isNotNull(); assertThat(headers).containsEntry("X-A", Collections.singletonList("aValue")) - .containsEntry("X-B3-Sampled", Collections.singletonList("1")) - .containsEntry("X-B3-TraceId", Collections.singletonList(context.traceId())) - .doesNotContainEntry("X-B3-SpanId", Collections.singletonList(context.spanId())) - .containsKey("X-B3-SpanId"); - SpansAssert.then(bb.getFinishedSpans()).hasASpanWithName("HTTP GET", - spanAssert -> spanAssert.hasTag("http.method", "GET").hasTag("http.status_code", "200") + .containsEntry("X-B3-Sampled", Collections.singletonList("1")) + .containsEntry("X-B3-TraceId", Collections.singletonList(context.traceId())) + .doesNotContainEntry("X-B3-SpanId", Collections.singletonList(context.spanId())) + .containsKey("X-B3-SpanId"); + SpansAssert.then(bb.getFinishedSpans()) + .hasASpanWithName("HTTP GET", + spanAssert -> spanAssert.hasTag("http.method", "GET") + .hasTag("http.status_code", "200") .hasTag("http.uri", "http://localhost:8080/get") .hasTag("spring.cloud.gateway.route.uri", "http://localhost:8080/") .hasTag("spring.cloud.gateway.route.id", "foo")); - MeterRegistryAssert.then(meterRegistry).hasTimerWithNameAndTags("http.client.requests", - Tags.of("spring.cloud.gateway.route.id", "foo", "error", "none", "http.method", "GET", - "http.status_code", "200", "spring.cloud.gateway.route.uri", "http://localhost:8080/")) - .hasMeterWithNameAndTags("http.client.requests.active", Tags.of("spring.cloud.gateway.route.id", - "foo", "http.method", "GET", "spring.cloud.gateway.route.uri", "http://localhost:8080/")); + MeterRegistryAssert.then(meterRegistry) + .hasTimerWithNameAndTags("http.client.requests", + Tags.of("spring.cloud.gateway.route.id", "foo", "error", "none", "http.method", "GET", + "http.status_code", "200", "spring.cloud.gateway.route.uri", "http://localhost:8080/")) + .hasMeterWithNameAndTags("http.client.requests.active", Tags.of("spring.cloud.gateway.route.id", "foo", + "http.method", "GET", "spring.cloud.gateway.route.uri", "http://localhost:8080/")); }; } @Override public BiConsumer>> customizeObservationHandlers() { return (bb, observationHandlers) -> observationHandlers - .addFirst(new GatewayPropagatingSenderTracingObservationHandler(bb.getTracer(), bb.getPropagator(), - Collections.emptyList())); + .addFirst(new GatewayPropagatingSenderTracingObservationHandler(bb.getTracer(), bb.getPropagator(), + Collections.emptyList())); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/PrincipalNameKeyResolverIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/PrincipalNameKeyResolverIntegrationTests.java index 2447d573..9e81dade 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/PrincipalNameKeyResolverIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/PrincipalNameKeyResolverIntegrationTests.java @@ -80,8 +80,16 @@ public class PrincipalNameKeyResolverIntegrationTests { @Test public void keyResolverWorks() { - this.client.mutate().filter(basicAuthentication("user", "password")).build().get().uri("/myapi/1").exchange() - .expectStatus().isOk().expectBody().json("{\"user\":\"1\"}"); + this.client.mutate() + .filter(basicAuthentication("user", "password")) + .build() + .get() + .uri("/myapi/1") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .json("{\"user\":\"1\"}"); } @RestController @@ -101,10 +109,11 @@ public class PrincipalNameKeyResolverIntegrationTests { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route(r -> r.path("/myapi/**").filters( + .route(r -> r.path("/myapi/**") + .filters( f -> f.requestRateLimiter(c -> c.setRateLimiter(myRateLimiter())).prefixPath("/downstream")) - .uri("http://localhost:" + port)) - .build(); + .uri("http://localhost:" + port)) + .build(); } @Bean @@ -115,8 +124,15 @@ public class PrincipalNameKeyResolverIntegrationTests { @Bean SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http) { - return http.httpBasic().and().authorizeExchange().pathMatchers("/myapi/**").authenticated().anyExchange() - .permitAll().and().build(); + return http.httpBasic() + .and() + .authorizeExchange() + .pathMatchers("/myapi/**") + .authenticated() + .anyExchange() + .permitAll() + .and() + .build(); } class MyRateLimiter implements RateLimiter { diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiterConfigTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiterConfigTests.java index 59b993d1..708c0397 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiterConfigTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiterConfigTests.java @@ -105,17 +105,19 @@ public class RedisRateLimiterConfigTests { @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("custom_redis_rate_limiter", r -> r.path("/custom") - .filters(f -> f.requestRateLimiter() - .rateLimiter(RedisRateLimiter.class, - rl -> rl.setBurstCapacity(40).setReplenishRate(20).setRequestedTokens(10)) - .and()) - .uri("http://localhost")) - .route("alt_custom_redis_rate_limiter", - r -> r.path("/custom") - .filters(f -> f.requestRateLimiter(c -> c.setRateLimiter(myRateLimiter()))) - .uri("http://localhost")) - .build(); + return builder.routes() + .route("custom_redis_rate_limiter", + r -> r.path("/custom") + .filters(f -> f.requestRateLimiter() + .rateLimiter(RedisRateLimiter.class, + rl -> rl.setBurstCapacity(40).setReplenishRate(20).setRequestedTokens(10)) + .and()) + .uri("http://localhost")) + .route("alt_custom_redis_rate_limiter", + r -> r.path("/custom") + .filters(f -> f.requestRateLimiter(c -> c.setRateLimiter(myRateLimiter()))) + .uri("http://localhost")) + .build(); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiterTests.java index 6c7abaad..b052d724 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiterTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiterTests.java @@ -89,8 +89,11 @@ public class RedisRateLimiterTests extends BaseWebClientTests { int requestedTokens = 1; String routeId = "myroute"; - rateLimiter.getConfig().put(routeId, new RedisRateLimiter.Config().setBurstCapacity(burstCapacity) - .setReplenishRate(replenishRate).setRequestedTokens(requestedTokens)); + rateLimiter.getConfig() + .put(routeId, + new RedisRateLimiter.Config().setBurstCapacity(burstCapacity) + .setReplenishRate(replenishRate) + .setRequestedTokens(requestedTokens)); checkLimitEnforced(id, replenishRate, burstCapacity, requestedTokens, routeId); } @@ -104,8 +107,11 @@ public class RedisRateLimiterTests extends BaseWebClientTests { int requestedTokens = 3; String routeId = "low_rate_route"; - rateLimiter.getConfig().put(routeId, new RedisRateLimiter.Config().setBurstCapacity(burstCapacity) - .setReplenishRate(replenishRate).setRequestedTokens(requestedTokens)); + rateLimiter.getConfig() + .put(routeId, + new RedisRateLimiter.Config().setBurstCapacity(burstCapacity) + .setReplenishRate(replenishRate) + .setRequestedTokens(requestedTokens)); checkLimitEnforced(id, replenishRate, burstCapacity, requestedTokens, routeId); } @@ -119,8 +125,11 @@ public class RedisRateLimiterTests extends BaseWebClientTests { int requestedTokens = 1; String routeId = "zero_burst_capacity_route"; - rateLimiter.getConfig().put(routeId, new RedisRateLimiter.Config().setBurstCapacity(burstCapacity) - .setReplenishRate(replenishRate).setRequestedTokens(requestedTokens)); + rateLimiter.getConfig() + .put(routeId, + new RedisRateLimiter.Config().setBurstCapacity(burstCapacity) + .setReplenishRate(replenishRate) + .setRequestedTokens(requestedTokens)); Response response = rateLimiter.isAllowed(routeId, id).block(); assertThat(response.isAllowed()).isFalse(); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiterUnitTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiterUnitTests.java index ed5c52d6..f2fd7b70 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiterUnitTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/RedisRateLimiterUnitTests.java @@ -67,7 +67,7 @@ public class RedisRateLimiterUnitTests { public void setUp() { when(applicationContext.getBean(ReactiveStringRedisTemplate.class)).thenReturn(redisTemplate); when(applicationContext.getBeanNamesForType(ConfigurationService.class)) - .thenReturn(CONFIGURATION_SERVICE_BEANS); + .thenReturn(CONFIGURATION_SERVICE_BEANS); redisRateLimiter = new RedisRateLimiter(DEFAULT_REPLENISH_RATE, DEFAULT_BURST_CAPACITY); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingIntegrationTests.java index 67179d1a..403ef423 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingIntegrationTests.java @@ -56,15 +56,28 @@ public class RoutePredicateHandlerMappingIntegrationTests extends BaseWebClientT @Test public void requestsToManagementPortReturn404() { - testClient.mutate().baseUrl("http://localhost:" + managementPort).build().get().uri("/get").exchange() - .expectStatus().isNotFound(); + testClient.mutate() + .baseUrl("http://localhost:" + managementPort) + .build() + .get() + .uri("/get") + .exchange() + .expectStatus() + .isNotFound(); } @Test public void requestsToManagementPortAndHostHeaderReturn404() { String host = "example.com:8888"; - testClient.mutate().baseUrl("http://localhost:" + managementPort).build().get().uri("/get").header("host", host) - .exchange().expectStatus().isNotFound(); + testClient.mutate() + .baseUrl("http://localhost:" + managementPort) + .build() + .get() + .uri("/get") + .header("host", host) + .exchange() + .expectStatus() + .isNotFound(); } @Test @@ -74,8 +87,11 @@ public class RoutePredicateHandlerMappingIntegrationTests extends BaseWebClientT @Test public void andNotWorksWithParameter() { - testClient.get().uri("/andnotquery?myquery=shouldnotsee").exchange().expectBody(String.class) - .isEqualTo("hasquery"); + testClient.get() + .uri("/andnotquery?myquery=shouldnotsee") + .exchange() + .expectBody(String.class) + .isEqualTo("hasquery"); } @EnableAutoConfiguration @@ -100,12 +116,19 @@ public class RoutePredicateHandlerMappingIntegrationTests extends BaseWebClientT @Bean RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("and_not_missing_myquery", - r -> r.path("/andnotquery").and().not(p -> p.query("myquery")) - .filters(f -> f.prefixPath("/httpbin")).uri(uri)) - .route("and_not_has_myquery", r -> r.path("/andnotquery").and().query("myquery") - .filters(f -> f.setPath("/httpbin/hasquery")).uri(uri)) - .build(); + .route("and_not_missing_myquery", + r -> r.path("/andnotquery") + .and() + .not(p -> p.query("myquery")) + .filters(f -> f.prefixPath("/httpbin")) + .uri(uri)) + .route("and_not_has_myquery", + r -> r.path("/andnotquery") + .and() + .query("myquery") + .filters(f -> f.setPath("/httpbin/hasquery")) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingSameManagementPortIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingSameManagementPortIntegrationTests.java index b6dfbb62..d80fe3fa 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingSameManagementPortIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingSameManagementPortIntegrationTests.java @@ -51,8 +51,14 @@ public class RoutePredicateHandlerMappingSameManagementPortIntegrationTests exte @Test public void requestsToGatewaySucceed() { - testClient.mutate().baseUrl("http://localhost:" + samePort).build().get().uri("/get").exchange().expectStatus() - .isOk(); + testClient.mutate() + .baseUrl("http://localhost:" + samePort) + .build() + .get() + .uri("/get") + .exchange() + .expectStatus() + .isOk(); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingTests.java index 151e3c26..cee04bdb 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingTests.java @@ -63,15 +63,24 @@ public class RoutePredicateHandlerMappingTests { @Test public void lookupRouteFromAsyncPredicates(CapturedOutput capturedOutput) { - Route routeFalse = Route.async().id("routeFalse").uri("http://localhost") - .asyncPredicate(swe -> Mono.just(false)).build(); - Route routeError = Route.async().id("routeError").uri("http://localhost") - .asyncPredicate(swe -> Mono.error(new IllegalStateException("boom1"))).build(); + Route routeFalse = Route.async() + .id("routeFalse") + .uri("http://localhost") + .asyncPredicate(swe -> Mono.just(false)) + .build(); + Route routeError = Route.async() + .id("routeError") + .uri("http://localhost") + .asyncPredicate(swe -> Mono.error(new IllegalStateException("boom1"))) + .build(); Route routeFail = Route.async().id("routeFail").uri("http://localhost").asyncPredicate(swe -> { throw new IllegalStateException("boom2"); }).build(); - Route routeTrue = Route.async().id("routeTrue").uri("http://localhost").asyncPredicate(swe -> Mono.just(true)) - .build(); + Route routeTrue = Route.async() + .id("routeTrue") + .uri("http://localhost") + .asyncPredicate(swe -> Mono.just(true)) + .build(); RouteLocator routeLocator = () -> Flux.just(routeFalse, routeError, routeFail, routeTrue).hide(); RoutePredicateHandlerMapping mapping = new RoutePredicateHandlerMapping(null, routeLocator, new GlobalCorsProperties(), new MockEnvironment()); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicateFactoryTests.java index efde1586..eb64a4f6 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicateFactoryTests.java @@ -77,7 +77,7 @@ public class AfterRoutePredicateFactoryTests { @Test public void testPredicates() { boolean result = new AfterRoutePredicateFactory().apply(c -> c.setDatetime(ZonedDateTime.now().minusHours(2))) - .test(getExchange()); + .test(getExchange()); assertThat(result).isTrue(); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateFactoryTests.java index 7f981da9..585ef49d 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateFactoryTests.java @@ -75,7 +75,7 @@ public class BeforeRoutePredicateFactoryTests { @Test public void testPredicates() { boolean result = new BeforeRoutePredicateFactory().apply(c -> c.setDatetime(ZonedDateTime.now().minusHours(2))) - .test(getExchange()); + .test(getExchange()); assertThat(result).isFalse(); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactoryIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactoryIntegrationTests.java index f312f65d..6f6f8822 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactoryIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactoryIntegrationTests.java @@ -41,17 +41,31 @@ public class BetweenRoutePredicateFactoryIntegrationTests extends BaseWebClientT @Test public void betweenPredicateWithValidDates() { - testClient.get().uri("/get").header(HttpHeaders.HOST, "www.betweenvalid.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) - .expectHeader().valueEquals(ROUTE_ID_HEADER, "test_between_valid"); + testClient.get() + .uri("/get") + .header(HttpHeaders.HOST, "www.betweenvalid.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "test_between_valid"); } @Test public void notBetweenPredicateWorks() { - testClient.get().uri("/get").header(HttpHeaders.HOST, "www.notbetween.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) - // should NOT be not_between_test because Between dates are in the past - .expectHeader().valueEquals(ROUTE_ID_HEADER, "default_path_to_httpbin"); + testClient.get() + .uri("/get") + .header(HttpHeaders.HOST, "www.notbetween.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) + // should NOT be not_between_test because Between dates are in the past + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "default_path_to_httpbin"); } @EnableAutoConfiguration @@ -65,11 +79,13 @@ public class BetweenRoutePredicateFactoryIntegrationTests extends BaseWebClientT @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("test_between_valid", - r -> r.host("**.betweenvalid.org").and() - .between(ZonedDateTime.now().minusDays(1), ZonedDateTime.now().plusDays(1)) - .filters(f -> f.prefixPath("/httpbin")).uri(uri)) - .build(); + .route("test_between_valid", + r -> r.host("**.betweenvalid.org") + .and() + .between(ZonedDateTime.now().minusDays(1), ZonedDateTime.now().plusDays(1)) + .filters(f -> f.prefixPath("/httpbin")) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactoryTests.java index b18c8e64..18913c13 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactoryTests.java @@ -141,7 +141,7 @@ public class BetweenRoutePredicateFactoryTests { public void testPredicates() { boolean result = new BetweenRoutePredicateFactory().apply( c -> c.setDatetime1(ZonedDateTime.now().minusHours(2)).setDatetime2(ZonedDateTime.now().plusHours(1))) - .test(getExchange()); + .test(getExchange()); assertThat(result).isTrue(); } @@ -164,7 +164,7 @@ public class BetweenRoutePredicateFactoryTests { config.setDatetime2(ZonedDateTime.now().plusHours(1)); Predicate predicate = new BetweenRoutePredicateFactory().apply(config); assertThat(predicate.toString()) - .contains("Between: " + config.getDatetime1() + " and " + config.getDatetime2()); + .contains("Between: " + config.getDatetime1() + " and " + config.getDatetime2()); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServiceRoutePredicateFactoryIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServiceRoutePredicateFactoryIntegrationTests.java index 803e770d..baddf7a9 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServiceRoutePredicateFactoryIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServiceRoutePredicateFactoryIntegrationTests.java @@ -45,26 +45,42 @@ public class CloudFoundryRouteServiceRoutePredicateFactoryIntegrationTests exten @Test public void predicateWorkWithProperties() { - testClient.get().uri("/").header("Host", "props.routeservice.example.com") - .header("X-CF-Forwarded-Url", "http://localhost:" + port + "/actuator/health") - .header("X-CF-Proxy-Signature", "foo").header("X-CF-Proxy-Metadata", "bar").exchange() - .expectBody(JsonNode.class).consumeWith(r -> assertThat(r.getResponseBody().has("status")).isTrue()); + testClient.get() + .uri("/") + .header("Host", "props.routeservice.example.com") + .header("X-CF-Forwarded-Url", "http://localhost:" + port + "/actuator/health") + .header("X-CF-Proxy-Signature", "foo") + .header("X-CF-Proxy-Metadata", "bar") + .exchange() + .expectBody(JsonNode.class) + .consumeWith(r -> assertThat(r.getResponseBody().has("status")).isTrue()); } @Test public void predicateWillNotWorkUnlessHeadersAreEnough() { - testClient.get().uri("/").header("Host", "props.routeservice.example.com") - .header("X-CF-Forwarded-Url", "http://localhost:" + port + "/actuator/health") - .header("X-CF-Proxy-Metadata", "bar").exchange().expectStatus().isOk().expectHeader() - .valueEquals(ROUTE_ID_HEADER, "default_path_to_httpbin"); + testClient.get() + .uri("/") + .header("Host", "props.routeservice.example.com") + .header("X-CF-Forwarded-Url", "http://localhost:" + port + "/actuator/health") + .header("X-CF-Proxy-Metadata", "bar") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "default_path_to_httpbin"); } @Test public void predicateWorkWithDsl() { - testClient.get().uri("/").header("Host", "dsl.routeservice.example.com") - .header("X-CF-Forwarded-Url", "http://localhost:" + port + "/actuator/health") - .header("X-CF-Proxy-Signature", "foo").header("X-CF-Proxy-Metadata", "bar").exchange() - .expectBody(JsonNode.class).consumeWith(r -> assertThat(r.getResponseBody().has("status")).isTrue()); + testClient.get() + .uri("/") + .header("Host", "dsl.routeservice.example.com") + .header("X-CF-Forwarded-Url", "http://localhost:" + port + "/actuator/health") + .header("X-CF-Proxy-Signature", "foo") + .header("X-CF-Proxy-Metadata", "bar") + .exchange() + .expectBody(JsonNode.class) + .consumeWith(r -> assertThat(r.getResponseBody().has("status")).isTrue()); } @EnableAutoConfiguration @@ -75,9 +91,12 @@ public class CloudFoundryRouteServiceRoutePredicateFactoryIntegrationTests exten @Bean public RouteLocator routeLocator(RouteLocatorBuilder builder) { return builder.routes() - .route(r -> r.cloudFoundryRouteService().and().header("Host", "dsl.routeservice.example.com") - .filters(f -> f.requestHeaderToRequestUri("X-CF-Forwarded-Url")).uri("https://example.com")) - .build(); + .route(r -> r.cloudFoundryRouteService() + .and() + .header("Host", "dsl.routeservice.example.com") + .filters(f -> f.requestHeaderToRequestUri("X-CF-Forwarded-Url")) + .uri("https://example.com")) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServiceRoutePredicateFactoryTest.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServiceRoutePredicateFactoryTest.java index 1b217582..2f4ea26d 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServiceRoutePredicateFactoryTest.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServiceRoutePredicateFactoryTest.java @@ -43,9 +43,10 @@ public class CloudFoundryRouteServiceRoutePredicateFactoryTest { @Test public void itReturnsTrueWithAllHeadersPresent() { MockServerHttpRequest request = MockServerHttpRequest.get("someurl") - .header(CloudFoundryRouteServiceRoutePredicateFactory.X_CF_FORWARDED_URL, "url") - .header(CloudFoundryRouteServiceRoutePredicateFactory.X_CF_PROXY_METADATA, "metadata") - .header(CloudFoundryRouteServiceRoutePredicateFactory.X_CF_PROXY_SIGNATURE, "signature").build(); + .header(CloudFoundryRouteServiceRoutePredicateFactory.X_CF_FORWARDED_URL, "url") + .header(CloudFoundryRouteServiceRoutePredicateFactory.X_CF_PROXY_METADATA, "metadata") + .header(CloudFoundryRouteServiceRoutePredicateFactory.X_CF_PROXY_SIGNATURE, "signature") + .build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); assertThat(predicate.test(exchange)).isTrue(); @@ -54,8 +55,9 @@ public class CloudFoundryRouteServiceRoutePredicateFactoryTest { @Test public void itReturnsFalseWithAHeadersMissing() { MockServerHttpRequest request = MockServerHttpRequest.get("someurl") - .header(CloudFoundryRouteServiceRoutePredicateFactory.X_CF_FORWARDED_URL, "url") - .header(CloudFoundryRouteServiceRoutePredicateFactory.X_CF_PROXY_METADATA, "metadata").build(); + .header(CloudFoundryRouteServiceRoutePredicateFactory.X_CF_FORWARDED_URL, "url") + .header(CloudFoundryRouteServiceRoutePredicateFactory.X_CF_PROXY_METADATA, "metadata") + .build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); assertThat(predicate.test(exchange)).isFalse(); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactoryIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactoryIntegrationTests.java index 36ff2fa1..8dac30e5 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactoryIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactoryIntegrationTests.java @@ -41,9 +41,17 @@ class CookieRoutePredicateFactoryIntegrationTests extends BaseWebClientTests { } private void assertCookieValue(String value) { - testClient.get().uri("/cookie").header(HttpHeaders.HOST, "www.cookieregex.org").cookie("mycookie", value) - .exchange().expectStatus().isOk().expectHeader().valueEquals(ROUTE_ID_HEADER, "cookie_regex_test") - .expectBody(String.class).isEqualTo(value); + testClient.get() + .uri("/cookie") + .header(HttpHeaders.HOST, "www.cookieregex.org") + .cookie("mycookie", value) + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "cookie_regex_test") + .expectBody(String.class) + .isEqualTo(value); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactoryTests.java index 94e80fd7..07d79a5e 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactoryTests.java @@ -37,7 +37,7 @@ public class CookieRoutePredicateFactoryTests extends BaseWebClientTests { MockServerWebExchange exchange = MockServerWebExchange.from(request); Predicate predicate = new CookieRoutePredicateFactory() - .apply(new Config().setName("mycookie").setRegexp("ch.p")); + .apply(new Config().setName("mycookie").setRegexp("ch.p")); assertThat(predicate.test(exchange)).isFalse(); } @@ -45,11 +45,12 @@ public class CookieRoutePredicateFactoryTests extends BaseWebClientTests { @Test public void okOneCookieForYou() { MockServerHttpRequest request = MockServerHttpRequest.get("https://example.com") - .cookie(new HttpCookie("yourcookie", "sugar"), new HttpCookie("mycookie", "chip")).build(); + .cookie(new HttpCookie("yourcookie", "sugar"), new HttpCookie("mycookie", "chip")) + .build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); Predicate predicate = new CookieRoutePredicateFactory() - .apply(new Config().setName("mycookie").setRegexp("ch.p")); + .apply(new Config().setName("mycookie").setRegexp("ch.p")); assertThat(predicate.test(exchange)).isTrue(); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/GatewayPredicateVisitorTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/GatewayPredicateVisitorTests.java index 8785657c..bb5c0d12 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/GatewayPredicateVisitorTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/GatewayPredicateVisitorTests.java @@ -39,18 +39,18 @@ public class GatewayPredicateVisitorTests { ReadBodyRoutePredicateFactory readBodyRoutePredicateFactory1 = new ReadBodyRoutePredicateFactory(); ReadBodyRoutePredicateFactory readBodyRoutePredicateFactory2 = new ReadBodyRoutePredicateFactory(); AsyncPredicate predicate = AsyncPredicate - .from(pathRoutePredicateFactory.apply(pathRoutePredicateFactory.newConfig())) - .and(AsyncPredicate.from(hostRoutePredicateFactory.apply(hostRoutePredicateFactory.newConfig()))) - .and(readBodyRoutePredicateFactory1.applyAsync(readBodyRoutePredicateFactory1.newConfig())) - .and(readBodyRoutePredicateFactory2.applyAsync(readBodyRoutePredicateFactory2.newConfig())); + .from(pathRoutePredicateFactory.apply(pathRoutePredicateFactory.newConfig())) + .and(AsyncPredicate.from(hostRoutePredicateFactory.apply(hostRoutePredicateFactory.newConfig()))) + .and(readBodyRoutePredicateFactory1.applyAsync(readBodyRoutePredicateFactory1.newConfig())) + .and(readBodyRoutePredicateFactory2.applyAsync(readBodyRoutePredicateFactory2.newConfig())); Route route = Route.async().id("git").uri("http://myuri").asyncPredicate(predicate).build(); ArrayList configs = new ArrayList<>(); route.getPredicate().accept(p -> configs.add(p.getConfig())); - assertThat(configs).hasSize(4).hasExactlyElementsOfTypes(PathRoutePredicateFactory.Config.class, - HostRoutePredicateFactory.Config.class, ReadBodyRoutePredicateFactory.Config.class, - ReadBodyRoutePredicateFactory.Config.class); + assertThat(configs).hasSize(4) + .hasExactlyElementsOfTypes(PathRoutePredicateFactory.Config.class, HostRoutePredicateFactory.Config.class, + ReadBodyRoutePredicateFactory.Config.class, ReadBodyRoutePredicateFactory.Config.class); } @Test @@ -58,14 +58,14 @@ public class GatewayPredicateVisitorTests { PathRoutePredicateFactory pathRoutePredicateFactory = new PathRoutePredicateFactory(); HostRoutePredicateFactory hostRoutePredicateFactory = new HostRoutePredicateFactory(); Predicate predicate = pathRoutePredicateFactory.apply(pathRoutePredicateFactory.newConfig()) - .and(hostRoutePredicateFactory.apply(hostRoutePredicateFactory.newConfig())); + .and(hostRoutePredicateFactory.apply(hostRoutePredicateFactory.newConfig())); Route route = Route.async().id("git").uri("http://myuri").predicate(predicate).build(); ArrayList configs = new ArrayList<>(); route.getPredicate().accept(p -> configs.add(p.getConfig())); - assertThat(configs).hasSize(2).hasExactlyElementsOfTypes(PathRoutePredicateFactory.Config.class, - HostRoutePredicateFactory.Config.class); + assertThat(configs).hasSize(2) + .hasExactlyElementsOfTypes(PathRoutePredicateFactory.Config.class, HostRoutePredicateFactory.Config.class); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactoryTests.java index 525db877..92be2a3a 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactoryTests.java @@ -42,26 +42,45 @@ public class HeaderRoutePredicateFactoryTests extends BaseWebClientTests { @Test public void headerRouteWorks() { - testClient.get().uri("/get").header("Foo", "bar").exchange().expectStatus().isOk().expectHeader() - .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()).expectHeader() - .valueEquals(ROUTE_ID_HEADER, "header_test"); + testClient.get() + .uri("/get") + .header("Foo", "bar") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "header_test"); } @Test @SuppressWarnings("Duplicates") public void headerRouteIgnoredWhenHeaderMissing() { - testClient.get().uri("/get") - // no headers set. Test used to throw a null pointer exception. - .exchange().expectStatus().isOk().expectHeader() - .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()).expectHeader() - .valueEquals(ROUTE_ID_HEADER, "default_path_to_httpbin"); + testClient.get() + .uri("/get") + // no headers set. Test used to throw a null pointer exception. + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "default_path_to_httpbin"); } @Test public void headerExistsWorksWithDsl() { - testClient.get().uri("/get").header("X-Foo", "bar").exchange().expectStatus().isOk().expectHeader() - .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()).expectHeader() - .valueEquals(ROUTE_ID_HEADER, "header_exists_dsl"); + testClient.get() + .uri("/get") + .header("X-Foo", "bar") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "header_exists_dsl"); } @Test @@ -84,8 +103,8 @@ public class HeaderRoutePredicateFactoryTests extends BaseWebClientTests { @Bean RouteLocator queryRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("header_exists_dsl", r -> r.header("X-Foo").filters(f -> f.prefixPath("/httpbin")).uri(uri)) - .build(); + .route("header_exists_dsl", r -> r.header("X-Foo").filters(f -> f.prefixPath("/httpbin")).uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactoryTests.java index e70b34dd..277b2009 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactoryTests.java @@ -51,9 +51,16 @@ public class HostRoutePredicateFactoryTests extends BaseWebClientTests { } public void expectHostRoute(String host, String routeId) { - testClient.get().uri("/get").header("Host", host).exchange().expectStatus().isOk().expectHeader() - .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()).expectHeader() - .valueEquals(ROUTE_ID_HEADER, routeId); + testClient.get() + .uri("/get") + .header("Host", host) + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, routeId); } @Test @@ -104,8 +111,12 @@ public class HostRoutePredicateFactoryTests extends BaseWebClientTests { @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("host_multi_dsl", r -> r.host("**.hostmultidsl1.org", "**.hostmultidsl2.org") - .filters(f -> f.prefixPath("/httpbin")).uri(uri)).build(); + return builder.routes() + .route("host_multi_dsl", + r -> r.host("**.hostmultidsl1.org", "**.hostmultidsl2.org") + .filters(f -> f.prefixPath("/httpbin")) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/MethodRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/MethodRoutePredicateFactoryTests.java index 4f195c8a..cb38e042 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/MethodRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/MethodRoutePredicateFactoryTests.java @@ -44,32 +44,59 @@ public class MethodRoutePredicateFactoryTests extends BaseWebClientTests { @Test public void methodRouteWorks() { - testClient.get().uri("/get").header("Host", "www.method.org").exchange().expectStatus().isOk().expectHeader() - .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()).expectHeader() - .valueEquals(ROUTE_ID_HEADER, "method_test_get"); + testClient.get() + .uri("/get") + .header("Host", "www.method.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "method_test_get"); } @Test public void methodGetAndPostRouteWorks() { - testClient.post().uri("/multivalueheaders").header("Host", "www.method.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) - .expectHeader().valueEquals(ROUTE_ID_HEADER, "method_test_get_and_post"); + testClient.post() + .uri("/multivalueheaders") + .header("Host", "www.method.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "method_test_get_and_post"); - testClient.get().uri("/multivalueheaders").header("Host", "www.method.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) - .expectHeader().valueEquals(ROUTE_ID_HEADER, "method_test_get_and_post"); + testClient.get() + .uri("/multivalueheaders") + .header("Host", "www.method.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "method_test_get_and_post"); } @Test public void methodRouteNotMatching() { - testClient.delete().uri("/multivalueheaders").header("Host", "www.method.org").exchange().expectStatus() - .value(integer -> integer.equals(HttpStatus.METHOD_NOT_ALLOWED)).expectHeader() - .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()).expectHeader() - /* - * Fallback to route with '/**' path predicate matches, see - * application.yml in test resources - */ - .valueEquals(ROUTE_ID_HEADER, "default_path_to_httpbin"); + testClient.delete() + .uri("/multivalueheaders") + .header("Host", "www.method.org") + .exchange() + .expectStatus() + .value(integer -> integer.equals(HttpStatus.METHOD_NOT_ALLOWED)) + .expectHeader() + .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) + .expectHeader() + /* + * Fallback to route with '/**' path predicate matches, see application.yml in + * test resources + */ + .valueEquals(ROUTE_ID_HEADER, "default_path_to_httpbin"); } @Test @@ -99,11 +126,15 @@ public class MethodRoutePredicateFactoryTests extends BaseWebClientTests { @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("method_test_get", - r -> r.method("GET").and().path("/get").filters(f -> f.prefixPath("/httpbin")).uri(uri)) - .route("method_test_get_and_post", r -> r.method("GET", "POST").and().path("/multivalueheaders") - .filters(f -> f.prefixPath("/httpbin")).uri(uri)) - .build(); + .route("method_test_get", + r -> r.method("GET").and().path("/get").filters(f -> f.prefixPath("/httpbin")).uri(uri)) + .route("method_test_get_and_post", + r -> r.method("GET", "POST") + .and() + .path("/multivalueheaders") + .filters(f -> f.prefixPath("/httpbin")) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactoryTests.java index e2b4ddca..d986e0e9 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactoryTests.java @@ -51,8 +51,12 @@ public class PathRoutePredicateFactoryTests extends BaseWebClientTests { @Test public void trailingSlashReturns404() { // since the configuration does not allow the trailing / to match this should fail - testClient.get().uri("/abc/123/function/").header(HttpHeaders.HOST, "www.path.org").exchange().expectStatus() - .isNotFound(); + testClient.get() + .uri("/abc/123/function/") + .header(HttpHeaders.HOST, "www.path.org") + .exchange() + .expectStatus() + .isNotFound(); } @Test @@ -61,9 +65,16 @@ public class PathRoutePredicateFactoryTests extends BaseWebClientTests { } private void expectPathRoute(String uri, String host, String routeId) { - testClient.get().uri(uri).header(HttpHeaders.HOST, host).exchange().expectStatus().isOk().expectHeader() - .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()).expectHeader() - .valueEquals(ROUTE_ID_HEADER, routeId); + testClient.get() + .uri(uri) + .header(HttpHeaders.HOST, host) + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, routeId); } @Test @@ -82,18 +93,30 @@ public class PathRoutePredicateFactoryTests extends BaseWebClientTests { @Test public void pathRouteWorksWithPercent() { - testClient.get().uri("/abc/123%/function").header(HttpHeaders.HOST, "www.path.org").exchange().expectStatus() - .isOk().expectHeader() - .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()).expectHeader() - .valueEquals(ROUTE_ID_HEADER, "path_test"); + testClient.get() + .uri("/abc/123%/function") + .header(HttpHeaders.HOST, "www.path.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "path_test"); } @Test public void pathRouteWorksWithRegex() { - testClient.get().uri("/regex/123").header(HttpHeaders.HOST, "www.pathregex.org").exchange().expectStatus() - .isOk().expectHeader() - .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()).expectHeader() - .valueEquals(ROUTE_ID_HEADER, "path_regex"); + testClient.get() + .uri("/regex/123") + .header(HttpHeaders.HOST, "www.pathregex.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "path_regex"); } @Test @@ -127,11 +150,13 @@ public class PathRoutePredicateFactoryTests extends BaseWebClientTests { @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("path_multi_dsl", - r -> r.host("**.pathmultidsl.org").and() - .path(false, "/anything/multidsl1", "/anything/multidsl3") - .filters(f -> f.prefixPath("/httpbin")).uri(uri)) - .build(); + .route("path_multi_dsl", + r -> r.host("**.pathmultidsl.org") + .and() + .path(false, "/anything/multidsl1", "/anything/multidsl3") + .filters(f -> f.prefixPath("/httpbin")) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicatePathContainerAttrBenchMarkTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicatePathContainerAttrBenchMarkTests.java index 92032d0e..e7f47220 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicatePathContainerAttrBenchMarkTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicatePathContainerAttrBenchMarkTests.java @@ -51,7 +51,8 @@ public class PathRoutePredicatePathContainerAttrBenchMarkTests { RandomStringUtils.random(10, true, false)); for (int i = 0; i < ROUTES_NUM; i++) { PathRoutePredicateFactory.Config config = new PathRoutePredicateFactory.Config() - .setPatterns(Collections.singletonList(PATH_PATTERN_PREFIX + i)).setMatchTrailingSlash(true); + .setPatterns(Collections.singletonList(PATH_PATTERN_PREFIX + i)) + .setMatchTrailingSlash(true); Predicate predicate = new PathRoutePredicateFactory().apply(config); predicates.add(predicate); } @@ -66,7 +67,8 @@ public class PathRoutePredicatePathContainerAttrBenchMarkTests { public void testPathContainerAttr() { Random random = new Random(); MockServerHttpRequest request = MockServerHttpRequest - .get(HOST + PATH_PATTERN_PREFIX + random.nextInt(ROUTES_NUM)).build(); + .get(HOST + PATH_PATTERN_PREFIX + random.nextInt(ROUTES_NUM)) + .build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); for (Predicate predicate : predicates) { if (predicate.test(exchange)) { diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicateFactoryTests.java index 48892642..270a1a50 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicateFactoryTests.java @@ -45,21 +45,36 @@ public class QueryRoutePredicateFactoryTests extends BaseWebClientTests { @Test public void noQueryParamWorks(CapturedOutput output) { - testClient.get().uri("/get").exchange().expectStatus().isOk().expectHeader().valueEquals(ROUTE_ID_HEADER, - "default_path_to_httpbin"); + testClient.get() + .uri("/get") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "default_path_to_httpbin"); assertThat(output).doesNotContain("Error applying predicate for route: foo_query_param"); } @Test public void queryParamWorks() { - testClient.get().uri("/get?foo=bar").exchange().expectStatus().isOk().expectHeader() - .valueEquals(ROUTE_ID_HEADER, "foo_query_param"); + testClient.get() + .uri("/get?foo=bar") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "foo_query_param"); } @Test public void emptyQueryParamWorks(CapturedOutput output) { - testClient.get().uri("/get?foo").exchange().expectStatus().isOk().expectHeader().valueEquals(ROUTE_ID_HEADER, - "default_path_to_httpbin"); + testClient.get() + .uri("/get?foo") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "default_path_to_httpbin"); assertThat(output).doesNotContain("Error applying predicate for route: foo_query_param"); } @@ -82,8 +97,9 @@ public class QueryRoutePredicateFactoryTests extends BaseWebClientTests { @Bean RouteLocator queryRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("foo_query_param", - r -> r.query("foo", "bar").filters(f -> f.prefixPath("/httpbin")).uri(uri)).build(); + return builder.routes() + .route("foo_query_param", r -> r.query("foo", "bar").filters(f -> f.prefixPath("/httpbin")).uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/ReadBodyRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/ReadBodyRoutePredicateFactoryTests.java index 6921ca88..4b5c2b8d 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/ReadBodyRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/ReadBodyRoutePredicateFactoryTests.java @@ -63,11 +63,25 @@ public class ReadBodyRoutePredicateFactoryTests { Event messageEvent = new Event("message", "bar"); Event messageChannelEvent = new Event("message.channels", "bar"); - webClient.post().uri("/events").body(BodyInserters.fromValue(messageEvent)).exchange().expectStatus().isOk() - .expectBody().jsonPath("$.headers.Hello").isEqualTo("World"); + webClient.post() + .uri("/events") + .body(BodyInserters.fromValue(messageEvent)) + .exchange() + .expectStatus() + .isOk() + .expectBody() + .jsonPath("$.headers.Hello") + .isEqualTo("World"); - webClient.post().uri("/events").body(BodyInserters.fromValue(messageChannelEvent)).exchange().expectStatus() - .isOk().expectBody().jsonPath("$.headers.World").isEqualTo("Hello"); + webClient.post() + .uri("/events") + .body(BodyInserters.fromValue(messageChannelEvent)) + .exchange() + .expectStatus() + .isOk() + .expectBody() + .jsonPath("$.headers.World") + .isEqualTo("Hello"); } @@ -90,13 +104,21 @@ public class ReadBodyRoutePredicateFactoryTests { @Bean public RouteLocator routeLocator(RouteLocatorBuilder builder) { return builder.routes() - .route(p -> p.path("/events").and().method(HttpMethod.POST).and() - .readBody(Event.class, eventPredicate("message.channels")) - .filters(f -> f.setPath("/messageChannel/events")).uri("lb://messageChannel")) - .route(p -> p.path("/events").and().method(HttpMethod.POST).and() - .readBody(Event.class, eventPredicate("message")).filters(f -> f.setPath("/message/events")) - .uri("lb://message")) - .build(); + .route(p -> p.path("/events") + .and() + .method(HttpMethod.POST) + .and() + .readBody(Event.class, eventPredicate("message.channels")) + .filters(f -> f.setPath("/messageChannel/events")) + .uri("lb://messageChannel")) + .route(p -> p.path("/events") + .and() + .method(HttpMethod.POST) + .and() + .readBody(Event.class, eventPredicate("message")) + .filters(f -> f.setPath("/message/events")) + .uri("lb://message")) + .build(); } private Predicate eventPredicate(String type) { diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicateFactoryTests.java index aacb7ebe..2599d34c 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicateFactoryTests.java @@ -52,25 +52,33 @@ public class RemoteAddrRoutePredicateFactoryTests extends BaseWebClientTests { public void remoteAddrWorks() { Mono result = webClient.get().uri("/ok/httpbin/").exchangeToMono(Mono::just); - StepVerifier.create(result).consumeNextWith(response -> assertStatus(response, HttpStatus.OK)).expectComplete() - .verify(DURATION); + StepVerifier.create(result) + .consumeNextWith(response -> assertStatus(response, HttpStatus.OK)) + .expectComplete() + .verify(DURATION); } @Test public void remoteAddrRejects() { Mono result = webClient.get().uri("/nok/httpbin/").exchangeToMono(Mono::just); - StepVerifier.create(result).consumeNextWith(response -> assertStatus(response, HttpStatus.NOT_FOUND)) - .expectComplete().verify(DURATION); + StepVerifier.create(result) + .consumeNextWith(response -> assertStatus(response, HttpStatus.NOT_FOUND)) + .expectComplete() + .verify(DURATION); } @Test public void remoteAddrWorksWithXForwardedRemoteAddress() { - Mono result = webClient.get().uri("/xforwardfor").header("X-Forwarded-For", "12.34.56.78") - .exchangeToMono(Mono::just); + Mono result = webClient.get() + .uri("/xforwardfor") + .header("X-Forwarded-For", "12.34.56.78") + .exchangeToMono(Mono::just); - StepVerifier.create(result).consumeNextWith(response -> assertStatus(response, HttpStatus.OK)).expectComplete() - .verify(Duration.ofSeconds(20)); + StepVerifier.create(result) + .consumeNextWith(response -> assertStatus(response, HttpStatus.OK)) + .expectComplete() + .verify(Duration.ofSeconds(20)); } @Test @@ -92,11 +100,13 @@ public class RemoteAddrRoutePredicateFactoryTests extends BaseWebClientTests { @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() - .route("x_forwarded_for_test", - r -> r.path("/xforwardfor").and() - .remoteAddr(XForwardedRemoteAddressResolver.maxTrustedIndex(1), "12.34.56.78") - .filters(f -> f.setStatus(200)).uri(uri)) - .build(); + .route("x_forwarded_for_test", + r -> r.path("/xforwardfor") + .and() + .remoteAddr(XForwardedRemoteAddressResolver.maxTrustedIndex(1), "12.34.56.78") + .filters(f -> f.setStatus(200)) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/WeightRoutePredicateFactoryIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/WeightRoutePredicateFactoryIntegrationTests.java index a4289bfb..6fb4c6de 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/WeightRoutePredicateFactoryIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/WeightRoutePredicateFactoryIntegrationTests.java @@ -58,16 +58,28 @@ public class WeightRoutePredicateFactoryIntegrationTests extends BaseWebClientTe public void highWeight() { filter.setRandomSupplier(getRandom(0.9)); - testClient.get().uri("/get").header(HttpHeaders.HOST, "www.weighthigh.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals(ROUTE_ID_HEADER, "weight_high_test"); + testClient.get() + .uri("/get") + .header(HttpHeaders.HOST, "www.weighthigh.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "weight_high_test"); } @Test public void lowWeight() { filter.setRandomSupplier(getRandom(0.1)); - testClient.get().uri("/get").header(HttpHeaders.HOST, "www.weightlow.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals(ROUTE_ID_HEADER, "weight_low_test"); + testClient.get() + .uri("/get") + .header(HttpHeaders.HOST, "www.weightlow.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "weight_low_test"); } @Test @@ -93,8 +105,14 @@ public class WeightRoutePredicateFactoryIntegrationTests extends BaseWebClientTe @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("weight_low_test", r -> r.weight("group1", 2).and().host("**.weightlow.org") - .filters(f -> f.prefixPath("/httpbin")).uri(this.uri)).build(); + return builder.routes() + .route("weight_low_test", + r -> r.weight("group1", 2) + .and() + .host("**.weightlow.org") + .filters(f -> f.prefixPath("/httpbin")) + .uri(this.uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/WeightRoutePredicateFactoryYaml404Tests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/WeightRoutePredicateFactoryYaml404Tests.java index c4ff253e..08b9849b 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/WeightRoutePredicateFactoryYaml404Tests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/WeightRoutePredicateFactoryYaml404Tests.java @@ -53,8 +53,14 @@ class WeightRoutePredicateFactoryYaml404Tests extends BaseWebClientTests { void weightsFromYamlNot404() { filter.setRandomSupplier(getRandom(0.5)); - testClient.get().uri("/get").header(HttpHeaders.HOST, "www.weight4041.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals(ROUTE_ID_HEADER, "weight_first_404_test_1"); + testClient.get() + .uri("/get") + .header(HttpHeaders.HOST, "www.weight4041.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "weight_first_404_test_1"); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/XForwardedRemoteAddrRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/XForwardedRemoteAddrRoutePredicateFactoryTests.java index 7f2c28c7..d91aa75d 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/XForwardedRemoteAddrRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/XForwardedRemoteAddrRoutePredicateFactoryTests.java @@ -46,29 +46,41 @@ public class XForwardedRemoteAddrRoutePredicateFactoryTests extends BaseWebClien @Test public void xForwardedRemoteAddrWorks() { - Mono result = webClient.get().uri("/xforwardfor").header("X-Forwarded-For", "12.34.56.78") - .exchangeToMono(Mono::just); + Mono result = webClient.get() + .uri("/xforwardfor") + .header("X-Forwarded-For", "12.34.56.78") + .exchangeToMono(Mono::just); - StepVerifier.create(result).consumeNextWith(response -> assertStatus(response, HttpStatus.OK)).expectComplete() - .verify(Duration.ofSeconds(20)); + StepVerifier.create(result) + .consumeNextWith(response -> assertStatus(response, HttpStatus.OK)) + .expectComplete() + .verify(Duration.ofSeconds(20)); } @Test public void xForwardedRemoteAddrWorksUsingRightMostValueByDefault() { - Mono result = webClient.get().uri("/xforwardfor") - .header("X-Forwarded-For", "99.99.99.99,12.34.56.78").exchangeToMono(Mono::just); + Mono result = webClient.get() + .uri("/xforwardfor") + .header("X-Forwarded-For", "99.99.99.99,12.34.56.78") + .exchangeToMono(Mono::just); - StepVerifier.create(result).consumeNextWith(response -> assertStatus(response, HttpStatus.OK)).expectComplete() - .verify(Duration.ofSeconds(20)); + StepVerifier.create(result) + .consumeNextWith(response -> assertStatus(response, HttpStatus.OK)) + .expectComplete() + .verify(Duration.ofSeconds(20)); } @Test public void xForwardedRemoteAddrRejects() { - Mono result = webClient.get().uri("/xforwardfor").header("X-Forwarded-For", "99.99.99.99") - .exchangeToMono(Mono::just); + Mono result = webClient.get() + .uri("/xforwardfor") + .header("X-Forwarded-For", "99.99.99.99") + .exchangeToMono(Mono::just); - StepVerifier.create(result).consumeNextWith(response -> assertStatus(response, HttpStatus.NOT_FOUND)) - .expectComplete().verify(Duration.ofSeconds(20)); + StepVerifier.create(result) + .consumeNextWith(response -> assertStatus(response, HttpStatus.NOT_FOUND)) + .expectComplete() + .verify(Duration.ofSeconds(20)); } @EnableAutoConfiguration @@ -81,8 +93,14 @@ public class XForwardedRemoteAddrRoutePredicateFactoryTests extends BaseWebClien @Bean public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("x_forwarded_for_test", r -> r.path("/xforwardfor").and() - .xForwardedRemoteAddr("12.34.56.78").filters(f -> f.setStatus(200)).uri(uri)).build(); + return builder.routes() + .route("x_forwarded_for_test", + r -> r.path("/xforwardfor") + .and() + .xForwardedRemoteAddr("12.34.56.78") + .filters(f -> f.setStatus(200)) + .uri(uri)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/CachingRouteLocatorTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/CachingRouteLocatorTests.java index da36cdeb..d5609ea8 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/CachingRouteLocatorTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/CachingRouteLocatorTests.java @@ -130,8 +130,12 @@ public class CachingRouteLocatorTests { } Route route(int id) { - return Route.async().id(String.valueOf(id)).uri("http://localhost/" + id).order(id).predicate(exchange -> true) - .build(); + return Route.async() + .id(String.valueOf(id)) + .uri("http://localhost/" + id) + .order(id) + .predicate(exchange -> true) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/InMemoryRouteDefinitionRepositoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/InMemoryRouteDefinitionRepositoryTests.java index 6bc6117d..517fb5a0 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/InMemoryRouteDefinitionRepositoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/InMemoryRouteDefinitionRepositoryTests.java @@ -38,17 +38,22 @@ public class InMemoryRouteDefinitionRepositoryTests { @Test public void shouldProtectRoutesAgainstConcurrentModificationException() { Flux createRoutes = Flux.just(createRoute("foo1"), createRoute("foo2"), createRoute("foo3")) - .flatMap(repository::save); + .flatMap(repository::save); StepVerifier.create(createRoutes).verifyComplete(); Flux readRoutesWithDelay = repository.getRouteDefinitions() - .delayElements(Duration.ofMillis(100)); + .delayElements(Duration.ofMillis(100)); Mono createAnotherRoute = repository.save(createRoute("bar")); - StepVerifier.withVirtualTime(() -> readRoutesWithDelay).expectSubscription().expectNextCount(1) - .then(createAnotherRoute::subscribe).thenAwait().expectNextCount(2).verifyComplete(); + StepVerifier.withVirtualTime(() -> readRoutesWithDelay) + .expectSubscription() + .expectNextCount(1) + .then(createAnotherRoute::subscribe) + .thenAwait() + .expectNextCount(2) + .verifyComplete(); } @Test @@ -67,7 +72,7 @@ public class InMemoryRouteDefinitionRepositoryTests { @Test public void shouldDeleteRoute() { Flux createRoutes = Flux.just(createRoute("foo1"), createRoute("foo2"), createRoute("foo3")) - .flatMap(repository::save); + .flatMap(repository::save); StepVerifier.create(createRoutes).verifyComplete(); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepositoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepositoryTests.java index d54c5109..a11c5bd1 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepositoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepositoryTests.java @@ -80,8 +80,9 @@ public class RedisRouteDefinitionRepositoryTests { redisRouteDefinitionRepository.save(Mono.just(testRouteDefinition)).block(); - List routeDefinitions = redisRouteDefinitionRepository.getRouteDefinitions().collectList() - .block(); + List routeDefinitions = redisRouteDefinitionRepository.getRouteDefinitions() + .collectList() + .block(); assertThat(routeDefinitions.size()).isEqualTo(1); assertThat(routeDefinitions.get(0)).isEqualTo(testRouteDefinition); @@ -94,8 +95,9 @@ public class RedisRouteDefinitionRepositoryTests { redisRouteDefinitionRepository.save(Mono.just(testRouteDefinition)).block(); - List routeDefinitions = redisRouteDefinitionRepository.getRouteDefinitions().collectList() - .block(); + List routeDefinitions = redisRouteDefinitionRepository.getRouteDefinitions() + .collectList() + .block(); String routeId = routeDefinitions.get(0).getId(); // Assert that route has been added. @@ -117,8 +119,8 @@ public class RedisRouteDefinitionRepositoryTests { FilterDefinition redirectToFilterDefinition = new FilterDefinition("RemoveResponseHeader=Sensitive-Header"); FilterDefinition testFilterDefinition = new FilterDefinition(); testFilterDefinition.setName("Test"); - testRouteDefinition.setFilters( - Arrays.asList(prefixPathFilterDefinition, redirectToFilterDefinition, testFilterDefinition)); + testRouteDefinition + .setFilters(Arrays.asList(prefixPathFilterDefinition, redirectToFilterDefinition, testFilterDefinition)); PredicateDefinition hostRoutePredicateDefinition = new PredicateDefinition("Host=myhost.org"); PredicateDefinition methodRoutePredicateDefinition = new PredicateDefinition("Method=GET"); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocatorTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocatorTests.java index 280108d0..65aa6730 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocatorTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocatorTests.java @@ -78,7 +78,7 @@ public class RouteDefinitionRouteLocatorTests { assertThat(getFilterClassName(filters.get(0))).contains("RemoveResponseHeader"); assertThat(getFilterClassName(filters.get(1))).contains("AddResponseHeader"); assertThat(getFilterClassName(filters.get(2))) - .contains("RouteDefinitionRouteLocatorTests$TestOrderedGateway"); + .contains("RouteDefinitionRouteLocatorTests$TestOrderedGateway"); }).expectComplete().verify(); } @@ -135,7 +135,7 @@ public class RouteDefinitionRouteLocatorTests { assertThat(getFilterClassName(filters.get(0))).contains("RemoveResponseHeader"); assertThat(getFilterClassName(filters.get(1))).contains("AddResponseHeader"); assertThat(getFilterClassName(filters.get(2))) - .contains("RouteDefinitionRouteLocatorTests$TestOrderedGateway"); + .contains("RouteDefinitionRouteLocatorTests$TestOrderedGateway"); }).expectComplete().verify(); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionTest.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionTest.java index 69d230ca..2ce9c443 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionTest.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionTest.java @@ -37,8 +37,9 @@ public class RouteDefinitionTest { routeDefinition.setMetadata(originalMetadata); routeDefinition.getMetadata().putAll(newMetadata); - assertThat(routeDefinition.getMetadata()).hasSize(2).containsAllEntriesOf(originalMetadata) - .containsAllEntriesOf(newMetadata); + assertThat(routeDefinition.getMetadata()).hasSize(2) + .containsAllEntriesOf(originalMetadata) + .containsAllEntriesOf(newMetadata); } @Test @@ -61,8 +62,9 @@ public class RouteDefinitionTest { routeDefinition.setMetadata(originalMetadata); routeDefinition.getMetadata().put("key2", "value2"); - assertThat(routeDefinition.getMetadata()).hasSize(2).containsAllEntriesOf(originalMetadata) - .containsEntry("key2", "value2"); + assertThat(routeDefinition.getMetadata()).hasSize(2) + .containsAllEntriesOf(originalMetadata) + .containsEntry("key2", "value2"); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteTests.java index bca56902..d9dfbdce 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteTests.java @@ -51,13 +51,13 @@ public class RouteTests { @Test public void nullScheme() { assertThatThrownBy(() -> Route.async().id("1").predicate(exchange -> true).uri("/pathonly")) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @Test public void localhostNoSchemeFails() { assertThatThrownBy(() -> Route.async().id("1").predicate(exchange -> true).uri("localhost:8080")) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @Test @@ -83,8 +83,13 @@ public class RouteTests { @Test public void isAbleToAddMetadata() { - Route route = Route.async().id("1").predicate(exchange -> true).uri("http://acme.com:8080") - .metadata(Maps.newHashMap("key", "value")).metadata("key2", "value2").build(); + Route route = Route.async() + .id("1") + .predicate(exchange -> true) + .uri("http://acme.com:8080") + .metadata(Maps.newHashMap("key", "value")) + .metadata("key2", "value2") + .build(); assertThat(route.getMetadata()).hasSize(2).containsEntry("key", "value").containsEntry("key2", "value2"); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpecTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpecTests.java index ac06d7f1..8ab6a2fe 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpecTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpecTests.java @@ -109,9 +109,9 @@ public class GatewayFilterSpecTests { ConfigurableApplicationContext context = mock(ConfigurableApplicationContext.class); Route.AsyncBuilder routeBuilder = Route.async().id("123").uri("abc:123").predicate(exchange -> true); - when(context.getBean(ModifyResponseBodyGatewayFilterFactory.class)).thenReturn( - new ModifyResponseBodyGatewayFilterFactory(HandlerStrategies.withDefaults().messageReaders(), - Collections.emptySet(), Collections.emptySet())); + when(context.getBean(ModifyResponseBodyGatewayFilterFactory.class)) + .thenReturn(new ModifyResponseBodyGatewayFilterFactory(HandlerStrategies.withDefaults().messageReaders(), + Collections.emptySet(), Collections.emptySet())); RouteLocatorBuilder.Builder routes = new RouteLocatorBuilder(context).routes(); GatewayFilterSpec spec = new GatewayFilterSpec(routeBuilder, routes); @@ -130,9 +130,9 @@ public class GatewayFilterSpecTests { ConfigurableApplicationContext context = mock(ConfigurableApplicationContext.class); Route.AsyncBuilder routeBuilder = Route.async().id("123").uri("abc:123").predicate(exchange -> true); - when(context.getBean(ModifyResponseBodyGatewayFilterFactory.class)).thenReturn( - new ModifyResponseBodyGatewayFilterFactory(HandlerStrategies.withDefaults().messageReaders(), - Collections.emptySet(), Collections.emptySet())); + when(context.getBean(ModifyResponseBodyGatewayFilterFactory.class)) + .thenReturn(new ModifyResponseBodyGatewayFilterFactory(HandlerStrategies.withDefaults().messageReaders(), + Collections.emptySet(), Collections.emptySet())); RouteLocatorBuilder.Builder routes = new RouteLocatorBuilder(context).routes(); GatewayFilterSpec spec = new GatewayFilterSpec(routeBuilder, routes); @@ -151,9 +151,9 @@ public class GatewayFilterSpecTests { ConfigurableApplicationContext context = mock(ConfigurableApplicationContext.class); Route.AsyncBuilder routeBuilder = Route.async().id("123").uri("abc:123").predicate(exchange -> true); - when(context.getBean(ModifyResponseBodyGatewayFilterFactory.class)).thenReturn( - new ModifyResponseBodyGatewayFilterFactory(HandlerStrategies.withDefaults().messageReaders(), - Collections.emptySet(), Collections.emptySet())); + when(context.getBean(ModifyResponseBodyGatewayFilterFactory.class)) + .thenReturn(new ModifyResponseBodyGatewayFilterFactory(HandlerStrategies.withDefaults().messageReaders(), + Collections.emptySet(), Collections.emptySet())); RouteLocatorBuilder.Builder routes = new RouteLocatorBuilder(context).routes(); GatewayFilterSpec spec = new GatewayFilterSpec(routeBuilder, routes); @@ -173,14 +173,14 @@ public class GatewayFilterSpecTests { ConfigurableApplicationContext context = mock(ConfigurableApplicationContext.class); Route.AsyncBuilder routeBuilder = Route.async().id("123").uri("abc:123").predicate(exchange -> true); - when(context.getBean(ModifyResponseBodyGatewayFilterFactory.class)).thenReturn( - new ModifyResponseBodyGatewayFilterFactory(HandlerStrategies.withDefaults().messageReaders(), - Collections.emptySet(), Collections.emptySet())); + when(context.getBean(ModifyResponseBodyGatewayFilterFactory.class)) + .thenReturn(new ModifyResponseBodyGatewayFilterFactory(HandlerStrategies.withDefaults().messageReaders(), + Collections.emptySet(), Collections.emptySet())); RouteLocatorBuilder.Builder routes = new RouteLocatorBuilder(context).routes(); GatewayFilterSpec spec = new GatewayFilterSpec(routeBuilder, routes); spec.modifyResponseBody((smth) -> new ModifyResponseBodyGatewayFilterFactory.Config() - .setRewriteFunction(String.class, String.class, (exchange, s) -> Mono.just(s))); + .setRewriteFunction(String.class, String.class, (exchange, s) -> Mono.just(s))); Route route = routeBuilder.build(); assertThat(route.getFilters()).hasSize(1); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/builder/RouteBuilderTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/builder/RouteBuilderTests.java index 88d0c881..80af11d3 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/builder/RouteBuilderTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/builder/RouteBuilderTests.java @@ -45,65 +45,79 @@ public class RouteBuilderTests { @Test public void testASetOfRoutes() { RouteLocator routeLocator = this.routeLocatorBuilder.routes() - .route("test1", - r -> r.host("*.somehost.org").and().path("/somepath") - .filters(f -> f.addRequestHeader("header1", "header-value-1")).uri("http://someuri")) - .route("test2", - r -> r.host("*.somehost2.org") - .filters(f -> f.addResponseHeader("header-response-1", "header-response-1")) - .uri("https://httpbin.org:9090")) - .build(); + .route("test1", + r -> r.host("*.somehost.org") + .and() + .path("/somepath") + .filters(f -> f.addRequestHeader("header1", "header-value-1")) + .uri("http://someuri")) + .route("test2", + r -> r.host("*.somehost2.org") + .filters(f -> f.addResponseHeader("header-response-1", "header-response-1")) + .uri("https://httpbin.org:9090")) + .build(); StepVerifier.create(routeLocator.getRoutes()) - .expectNextMatches(r -> r.getId().equals("test1") && r.getFilters().size() == 1 - && r.getUri().equals(URI.create("http://someuri:80"))) - .expectNextMatches(r -> r.getId().equals("test2") && r.getFilters().size() == 1 - && r.getUri().equals(URI.create("https://httpbin.org:9090"))) - .expectComplete().verify(); + .expectNextMatches(r -> r.getId().equals("test1") && r.getFilters().size() == 1 + && r.getUri().equals(URI.create("http://someuri:80"))) + .expectNextMatches(r -> r.getId().equals("test2") && r.getFilters().size() == 1 + && r.getUri().equals(URI.create("https://httpbin.org:9090"))) + .expectComplete() + .verify(); } @Test public void testRouteOptionsPropagatedToRoute() { Map routeMetadata = Maps.newHashMap("key", "value"); RouteLocator routeLocator = this.routeLocatorBuilder.routes() - .route("test1", - r -> r.host("*.somehost.org").and().path("/somepath") - .filters(f -> f.addRequestHeader("header1", "header-value-1")).metadata("key", "value") - .uri("http://someuri")) - .route("test2", - r -> r.host("*.somehost2.org") - .filters(f -> f.addResponseHeader("header-response-1", "header-response-1")) - .uri("https://httpbin.org:9090")) - .build(); + .route("test1", + r -> r.host("*.somehost.org") + .and() + .path("/somepath") + .filters(f -> f.addRequestHeader("header1", "header-value-1")) + .metadata("key", "value") + .uri("http://someuri")) + .route("test2", + r -> r.host("*.somehost2.org") + .filters(f -> f.addResponseHeader("header-response-1", "header-response-1")) + .uri("https://httpbin.org:9090")) + .build(); StepVerifier.create(routeLocator.getRoutes()) - .expectNextMatches(r -> r.getId().equals("test1") && r.getFilters().size() == 1 - && r.getUri().equals(URI.create("http://someuri:80")) && r.getMetadata().equals(routeMetadata)) - .expectNextMatches(r -> r.getId().equals("test2") && r.getFilters().size() == 1 - && r.getUri().equals(URI.create("https://httpbin.org:9090")) && r.getMetadata().isEmpty()) - .expectComplete().verify(); + .expectNextMatches(r -> r.getId().equals("test1") && r.getFilters().size() == 1 + && r.getUri().equals(URI.create("http://someuri:80")) && r.getMetadata().equals(routeMetadata)) + .expectNextMatches(r -> r.getId().equals("test2") && r.getFilters().size() == 1 + && r.getUri().equals(URI.create("https://httpbin.org:9090")) && r.getMetadata().isEmpty()) + .expectComplete() + .verify(); } @Test public void testRoutesWithTimeout() { RouteLocator routeLocator = this.routeLocatorBuilder.routes().route("test1", r -> { - return r.host("*.somehost.org").and().path("/somepath") - .filters(f -> f.addRequestHeader("header1", "header-value-1")).metadata(RESPONSE_TIMEOUT_ATTR, 1) - .metadata(CONNECT_TIMEOUT_ATTR, 1).uri("http://someuri"); - }).route("test2", - r -> r.host("*.somehost2.org") + return r.host("*.somehost.org") + .and() + .path("/somepath") + .filters(f -> f.addRequestHeader("header1", "header-value-1")) + .metadata(RESPONSE_TIMEOUT_ATTR, 1) + .metadata(CONNECT_TIMEOUT_ATTR, 1) + .uri("http://someuri"); + }) + .route("test2", + r -> r.host("*.somehost2.org") .filters(f -> f.addResponseHeader("header-response-1", "header-response-1")) .uri("https://httpbin.org:9090")) - .build(); + .build(); StepVerifier.create(routeLocator.getRoutes()) - .expectNextMatches(r -> r.getId().equals("test1") && r.getFilters().size() == 1 - && r.getUri().equals(URI.create("http://someuri:80")) - && r.getMetadata().get(RESPONSE_TIMEOUT_ATTR).equals(1) - && r.getMetadata().get(CONNECT_TIMEOUT_ATTR).equals(1)) - .expectNextMatches(r -> r.getId().equals("test2") && r.getFilters().size() == 1 - && r.getUri().equals(URI.create("https://httpbin.org:9090"))) - .expectComplete().verify(); + .expectNextMatches(r -> r.getId().equals("test1") && r.getFilters().size() == 1 + && r.getUri().equals(URI.create("http://someuri:80")) + && r.getMetadata().get(RESPONSE_TIMEOUT_ATTR).equals(1) + && r.getMetadata().get(CONNECT_TIMEOUT_ATTR).equals(1)) + .expectNextMatches(r -> r.getId().equals("test2") && r.getFilters().size() == 1 + && r.getUri().equals(URI.create("https://httpbin.org:9090"))) + .expectComplete() + .verify(); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ConfigurationServiceTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ConfigurationServiceTests.java index b84de453..e4c8db84 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ConfigurationServiceTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ConfigurationServiceTests.java @@ -38,7 +38,7 @@ public class ConfigurationServiceTests { Map map = Collections.singletonMap("config.value", 11); Assertions.assertThrows(BindException.class, () -> ConfigurationService - .bindOrCreate(Bindable.of(ValidatedConfig.class), map, "config", getValidator(), null)); + .bindOrCreate(Bindable.of(ValidatedConfig.class), map, "config", getValidator(), null)); } @Test @@ -58,7 +58,7 @@ public class ConfigurationServiceTests { ValidatedConfig config = new ValidatedConfig(); Assertions.assertThrows(BindException.class, () -> ConfigurationService - .bindOrCreate(Bindable.ofInstance(config), map, "config", getValidator(), null)); + .bindOrCreate(Bindable.ofInstance(config), map, "config", getValidator(), null)); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/NameUtilsTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/NameUtilsTests.java index bb4a987c..3a7ea0ff 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/NameUtilsTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/NameUtilsTests.java @@ -49,8 +49,9 @@ class NameUtilsTests { CloudFoundryRouteServiceRoutePredicateFactory.class, ReadBodyRoutePredicateFactory.class, RemoteAddrRoutePredicateFactory.class); - List resultNames = predicates.stream().map(NameUtils::normalizeRoutePredicateName) - .collect(Collectors.toList()); + List resultNames = predicates.stream() + .map(NameUtils::normalizeRoutePredicateName) + .collect(Collectors.toList()); List expectedNames = Arrays.asList("After", "CloudFoundryRouteService", "ReadBody", "RemoteAddr"); @@ -63,8 +64,9 @@ class NameUtilsTests { CloudFoundryRouteServiceRoutePredicateFactory.class, ReadBodyRoutePredicateFactory.class, RemoteAddrRoutePredicateFactory.class); - List resultNames = predicates.stream().map(NameUtils::normalizeRoutePredicateNameAsProperty) - .collect(Collectors.toList()); + List resultNames = predicates.stream() + .map(NameUtils::normalizeRoutePredicateNameAsProperty) + .collect(Collectors.toList()); List expectedNames = Arrays.asList("after", "cloud-foundry-route-service", "read-body", "remote-addr"); @@ -77,8 +79,9 @@ class NameUtilsTests { AddRequestHeaderGatewayFilterFactory.class, DedupeResponseHeaderGatewayFilterFactory.class, FallbackHeadersGatewayFilterFactory.class, MapRequestHeaderGatewayFilterFactory.class); - List resultNames = predicates.stream().map(NameUtils::normalizeFilterFactoryName) - .collect(Collectors.toList()); + List resultNames = predicates.stream() + .map(NameUtils::normalizeFilterFactoryName) + .collect(Collectors.toList()); List expectedNames = Arrays.asList("AddRequestHeader", "DedupeResponseHeader", "FallbackHeaders", "MapRequestHeader"); @@ -93,8 +96,9 @@ class NameUtilsTests { FallbackHeadersGatewayFilterFactory.class, MapRequestHeaderGatewayFilterFactory.class, JsonToGrpcGatewayFilterFactory.class, LocalResponseCacheGatewayFilterFactory.class); - List resultNames = predicates.stream().map(NameUtils::normalizeFilterFactoryNameAsProperty) - .collect(Collectors.toList()); + List resultNames = predicates.stream() + .map(NameUtils::normalizeFilterFactoryNameAsProperty) + .collect(Collectors.toList()); List expectedNames = Arrays.asList("add-request-header", "dedupe-response-header", "fallback-headers", "map-request-header", "json-to-grpc", "local-response-cache"); @@ -107,8 +111,9 @@ class NameUtilsTests { List> predicates = Arrays.asList(ForwardPathFilter.class, AdaptCachedBodyGlobalFilter.class, WebsocketRoutingFilter.class); - List resultNames = predicates.stream().map(NameUtils::normalizeGlobalFilterName) - .collect(Collectors.toList()); + List resultNames = predicates.stream() + .map(NameUtils::normalizeGlobalFilterName) + .collect(Collectors.toList()); List expectedNames = Arrays.asList("ForwardPath", "AdaptCachedBody", "WebsocketRouting"); @@ -120,8 +125,9 @@ class NameUtilsTests { List> predicates = Arrays.asList(ForwardPathFilter.class, AdaptCachedBodyGlobalFilter.class, WebsocketRoutingFilter.class); - List resultNames = predicates.stream().map(NameUtils::normalizeGlobalFilterNameAsProperty) - .collect(Collectors.toList()); + List resultNames = predicates.stream() + .map(NameUtils::normalizeGlobalFilterNameAsProperty) + .collect(Collectors.toList()); List expectedNames = Arrays.asList("forward-path", "adapt-cached-body", "websocket-routing"); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtilsTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtilsTests.java index e50b840c..a4f818c0 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtilsTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtilsTests.java @@ -66,7 +66,7 @@ public class ServerWebExchangeUtilsTests { public void missingVarThrowsException() { MockServerWebExchange exchange = mockExchange(Collections.emptyMap()); Assertions.assertThatThrownBy(() -> expand(exchange, "my-{foo}-{baz}")) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @Test @@ -75,28 +75,27 @@ public class ServerWebExchangeUtilsTests { exchange.getAttributes().put(CACHED_REQUEST_BODY_ATTR, "foo"); ServerWebExchangeUtils - .cacheRequestBodyAndRequest(exchange, - (serverHttpRequest) -> ServerRequest - .create(exchange.mutate().request(serverHttpRequest).build(), - HandlerStrategies.withDefaults().messageReaders()) - .bodyToMono(DefaultDataBuffer.class)) - .block(); + .cacheRequestBodyAndRequest(exchange, + (serverHttpRequest) -> ServerRequest.create(exchange.mutate().request(serverHttpRequest).build(), + HandlerStrategies.withDefaults().messageReaders()) + .bodyToMono(DefaultDataBuffer.class)) + .block(); } @Test public void duplicatedCachingDataBufferHandling() { MockServerWebExchange exchange = mockExchange(HttpMethod.POST, Collections.emptyMap()); - DataBuffer dataBufferBeforeCaching = exchange.getResponse().bufferFactory() - .wrap("Cached buffer".getBytes(StandardCharsets.UTF_8)); + DataBuffer dataBufferBeforeCaching = exchange.getResponse() + .bufferFactory() + .wrap("Cached buffer".getBytes(StandardCharsets.UTF_8)); exchange.getAttributes().put(CACHED_REQUEST_BODY_ATTR, dataBufferBeforeCaching); ServerWebExchangeUtils - .cacheRequestBodyAndRequest(exchange, - (serverHttpRequest) -> ServerRequest - .create(exchange.mutate().request(serverHttpRequest).build(), - HandlerStrategies.withDefaults().messageReaders()) - .bodyToMono(DefaultDataBuffer.class)) - .block(); + .cacheRequestBodyAndRequest(exchange, + (serverHttpRequest) -> ServerRequest.create(exchange.mutate().request(serverHttpRequest).build(), + HandlerStrategies.withDefaults().messageReaders()) + .bodyToMono(DefaultDataBuffer.class)) + .block(); DataBuffer dataBufferAfterCached = exchange.getAttribute(CACHED_REQUEST_BODY_ATTR); @@ -109,17 +108,20 @@ public class ServerWebExchangeUtilsTests { Mockito.when(handler.handle(any(ServerWebExchange.class))).thenReturn(Mono.empty()); ServerWebExchange originalExchange = mockExchange(Map.of()).mutate() - .request(request -> request.headers(headers -> headers.setOrigin("https://example.com"))).build(); + .request(request -> request.headers(headers -> headers.setOrigin("https://example.com"))) + .build(); originalExchange.getAttributes().put(GATEWAY_PREDICATE_PATH_CONTAINER_ATTR, parsePath("/example/path")); ServerWebExchangeUtils.handle(handler, originalExchange).block(); Mockito.verify(handler).handle(assertArg(exchange -> { - Assertions.assertThat(exchange.getAttributes()).as("exchange attributes") - .doesNotContainKey(GATEWAY_PREDICATE_PATH_CONTAINER_ATTR); + Assertions.assertThat(exchange.getAttributes()) + .as("exchange attributes") + .doesNotContainKey(GATEWAY_PREDICATE_PATH_CONTAINER_ATTR); - Assertions.assertThat(exchange.getRequest().getHeaders()).as("request headers") - .doesNotContainKey(HttpHeaders.ORIGIN); + Assertions.assertThat(exchange.getRequest().getHeaders()) + .as("request headers") + .doesNotContainKey(HttpHeaders.ORIGIN); })); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ipresolver/XForwardedRemoteAddressResolverTest.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ipresolver/XForwardedRemoteAddressResolverTest.java index 8b3d41a9..c36edd34 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ipresolver/XForwardedRemoteAddressResolverTest.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ipresolver/XForwardedRemoteAddressResolverTest.java @@ -137,8 +137,9 @@ public class XForwardedRemoteAddressResolverTest { } private MockServerHttpRequest.BaseBuilder oneTwoThreeBuilder() { - return MockServerHttpRequest.get("someUrl").remoteAddress(remote0000Address).header("X-Forwarded-For", - "0.0.0.1,0.0.0.2, 0.0.0.3"); + return MockServerHttpRequest.get("someUrl") + .remoteAddress(remote0000Address) + .header("X-Forwarded-For", "0.0.0.1,0.0.0.2, 0.0.0.3"); } private ServerWebExchange buildExchange(MockServerHttpRequest.BaseBuilder requestBuilder) { diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/tagsprovider/GatewayHttpTagsProviderTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/tagsprovider/GatewayHttpTagsProviderTests.java index 1faae05c..70dc7ac6 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/tagsprovider/GatewayHttpTagsProviderTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/tagsprovider/GatewayHttpTagsProviderTests.java @@ -56,8 +56,8 @@ public class GatewayHttpTagsProviderTests { ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(ROUTE_URI).build()); Tags tags = tagsProvider.apply(exchange); - assertThat(tags).isEqualTo( - Tags.of("outcome", "CUSTOM", "status", "CUSTOM", "httpStatusCode", "NA", "httpMethod", "GET")); + assertThat(tags) + .isEqualTo(Tags.of("outcome", "CUSTOM", "status", "CUSTOM", "httpStatusCode", "NA", "httpMethod", "GET")); } @Test diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/tagsprovider/GatewayPathTagsProviderTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/tagsprovider/GatewayPathTagsProviderTests.java index 0b8f550d..bb058821 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/tagsprovider/GatewayPathTagsProviderTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/tagsprovider/GatewayPathTagsProviderTests.java @@ -52,9 +52,13 @@ public class GatewayPathTagsProviderTests { PathRoutePredicateFactory.Config pathConfig = new PathRoutePredicateFactory.Config().setPatterns(pathList); HostRoutePredicateFactory.Config hostConfig = new HostRoutePredicateFactory.Config() - .setPatterns(Collections.singletonList("**.myhost.com")); - Route route = Route.async().id("git").uri(ROUTE_URI).predicate(new PathRoutePredicateFactory().apply(pathConfig) - .and(new HostRoutePredicateFactory().apply(hostConfig))).build(); + .setPatterns(Collections.singletonList("**.myhost.com")); + Route route = Route.async() + .id("git") + .uri(ROUTE_URI) + .predicate(new PathRoutePredicateFactory().apply(pathConfig) + .and(new HostRoutePredicateFactory().apply(hostConfig))) + .build(); ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(ROUTE_URI).build()); exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, route); @@ -64,7 +68,7 @@ public class GatewayPathTagsProviderTests { Tags tags = pathTagsProvider.apply(exchange); assertThat(tags.stream().count()).isEqualTo(1); assertThat(tags.stream().anyMatch(tag -> "path".equals(tag.getKey()) && tag.getValue().equals(pathList.get(0)))) - .isEqualTo(true); + .isEqualTo(true); } @Test @@ -74,8 +78,12 @@ public class GatewayPathTagsProviderTests { PathRoutePredicateFactory.Config pathConfig = new PathRoutePredicateFactory.Config().setPatterns(pathList); PathRoutePredicateFactory.Config pathConfig2 = new PathRoutePredicateFactory.Config().setPatterns(pathList2); - Route route = Route.async().id("git").uri(ROUTE_URI).predicate(new PathRoutePredicateFactory().apply(pathConfig) - .or(new PathRoutePredicateFactory().apply(pathConfig2))).build(); + Route route = Route.async() + .id("git") + .uri(ROUTE_URI) + .predicate(new PathRoutePredicateFactory().apply(pathConfig) + .or(new PathRoutePredicateFactory().apply(pathConfig2))) + .build(); ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(ROUTE_URI).build()); exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, route); @@ -86,15 +94,18 @@ public class GatewayPathTagsProviderTests { assertThat(tags.stream().count()).isEqualTo(1); assertThat( tags.stream().anyMatch(tag -> "path".equals(tag.getKey()) && tag.getValue().equals(pathList2.get(0)))) - .isEqualTo(true); + .isEqualTo(true); } @Test void ignoreRoutesWithoutPath() { MethodRoutePredicateFactory.Config config = new MethodRoutePredicateFactory.Config(); config.setMethods(HttpMethod.GET); - Route route = Route.async().id("empty").uri(ROUTE_URI) - .predicate(new MethodRoutePredicateFactory().apply(config)).build(); + Route route = Route.async() + .id("empty") + .uri(ROUTE_URI) + .predicate(new MethodRoutePredicateFactory().apply(config)) + .build(); ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(ROUTE_URI).build()); exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, route); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/tagsprovider/PropertiesTagsProviderTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/tagsprovider/PropertiesTagsProviderTests.java index 6af386c1..922b43f4 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/tagsprovider/PropertiesTagsProviderTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/tagsprovider/PropertiesTagsProviderTests.java @@ -37,13 +37,13 @@ public class PropertiesTagsProviderTests { @Test public void test() { contextRunner.withConfiguration(AutoConfigurations.of(GatewayMetricsAutoConfiguration.class)) - .withPropertyValues("spring.cloud.gateway.metrics.tags.foo1=bar1", - "spring.cloud.gateway.metrics.tags.foo2=bar2") - .run(context -> { - PropertiesTagsProvider provider = context.getBean(PropertiesTagsProvider.class); - Tags tags = provider.apply(MockServerWebExchange.from(MockServerHttpRequest.get("").build())); - assertThat(tags).isEqualTo(Tags.of("foo1", "bar1", "foo2", "bar2")); - }); + .withPropertyValues("spring.cloud.gateway.metrics.tags.foo1=bar1", + "spring.cloud.gateway.metrics.tags.foo2=bar2") + .run(context -> { + PropertiesTagsProvider provider = context.getBean(PropertiesTagsProvider.class); + Tags tags = provider.apply(MockServerWebExchange.from(MockServerHttpRequest.get("").build())); + assertThat(tags).isEqualTo(Tags.of("foo1", "bar1", "foo2", "bar2")); + }); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/ForwardTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/ForwardTests.java index 8e169961..7cb25cd8 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/ForwardTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/ForwardTests.java @@ -53,14 +53,26 @@ public class ForwardTests { @Test public void forwardWorks() { - this.client.get().uri("/localcontroller").header(HttpHeaders.HOST, "www.forward.org").exchange().expectStatus() - .isOk().expectBody().json("{\"from\":\"localcontroller\"}"); + this.client.get() + .uri("/localcontroller") + .header(HttpHeaders.HOST, "www.forward.org") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .json("{\"from\":\"localcontroller\"}"); } @Test public void forwardWithCorrectPath() { - this.client.get().uri("/foo").header(HttpHeaders.HOST, "www.forward.org").exchange().expectStatus().isOk() - .expectBody().json("{\"from\":\"localcontroller\"}"); + this.client.get() + .uri("/foo") + .header(HttpHeaders.HOST, "www.forward.org") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .json("{\"from\":\"localcontroller\"}"); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/GatewayIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/GatewayIntegrationTests.java index 711f916c..30bade58 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/GatewayIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/GatewayIntegrationTests.java @@ -77,17 +77,24 @@ class GatewayIntegrationTests extends BaseWebClientTests { int weightFilterIndex = applicationListeners.indexOf(context.getBean(WeightCalculatorWebFilter.class)); int routeLocatorIndex = applicationListeners.indexOf(context.getBean(CachingRouteLocator.class)); assertThat(weightFilterIndex > routeLocatorIndex).as("CachingRouteLocator is after WeightCalculatorWebFilter") - .isTrue(); + .isTrue(); } @Test void complexContentTypeWorks() { - testClient.post().uri("/headers").contentType(MediaType.APPLICATION_JSON).bodyValue("testdata") - .header("Host", "www.complexcontenttype.org").exchange().expectStatus().isOk().expectBody(Map.class) - .consumeWith(result -> { - Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsEntry(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); - }); + testClient.post() + .uri("/headers") + .contentType(MediaType.APPLICATION_JSON) + .bodyValue("testdata") + .header("Host", "www.complexcontenttype.org") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), "headers"); + assertThat(headers).containsEntry(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); + }); } @Test @@ -97,61 +104,89 @@ class GatewayIntegrationTests extends BaseWebClientTests { assertThat(headers).containsKeys(ForwardedHeadersFilter.FORWARDED_HEADER, XForwardedHeadersFilter.X_FORWARDED_FOR_HEADER, XForwardedHeadersFilter.X_FORWARDED_HOST_HEADER, XForwardedHeadersFilter.X_FORWARDED_PORT_HEADER, XForwardedHeadersFilter.X_FORWARDED_PROTO_HEADER); - assertThat(headers.get(ForwardedHeadersFilter.FORWARDED_HEADER)).asString().contains("proto=http") - .contains("host=\"localhost:").contains("for=\"127.0.0.1:"); + assertThat(headers.get(ForwardedHeadersFilter.FORWARDED_HEADER)).asString() + .contains("proto=http") + .contains("host=\"localhost:") + .contains("for=\"127.0.0.1:"); assertThat(headers.get(XForwardedHeadersFilter.X_FORWARDED_HOST_HEADER)).asString() - .isEqualTo("localhost:" + this.port); + .isEqualTo("localhost:" + this.port); assertThat(headers.get(XForwardedHeadersFilter.X_FORWARDED_PORT_HEADER)).asString() - .isEqualTo("" + this.port); + .isEqualTo("" + this.port); assertThat(headers.get(XForwardedHeadersFilter.X_FORWARDED_PROTO_HEADER)).asString().isEqualTo("http"); }); } @Test void compositeRouteWorks() { - testClient.get().uri("/headers?foo=bar&baz").header("Host", "www.foo.org").header("X-Request-Id", "123") - .cookie("chocolate", "chip").exchange().expectStatus().isOk().expectHeader() - .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()).expectHeader() - .valueEquals(ROUTE_ID_HEADER, "host_foo_path_headers_to_httpbin").expectHeader() - .valueEquals("X-Response-Foo", "Bar"); + testClient.get() + .uri("/headers?foo=bar&baz") + .header("Host", "www.foo.org") + .header("X-Request-Id", "123") + .cookie("chocolate", "chip") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "host_foo_path_headers_to_httpbin") + .expectHeader() + .valueEquals("X-Response-Foo", "Bar"); } @Test void defaultFiltersWorks() { assertThat(this.properties.getDefaultFilters()).isNotEmpty(); - testClient.get().uri("/headers").header("Host", "www.addresponseheader.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals("X-Response-Default-Foo", "Default-Bar").returnResult(Object.class) - .consumeWith(result -> { - HttpHeaders httpHeaders = result.getResponseHeaders(); - assertThat(httpHeaders.get("X-Response-Default-Foo")).hasSize(1); - }); + testClient.get() + .uri("/headers") + .header("Host", "www.addresponseheader.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals("X-Response-Default-Foo", "Default-Bar") + .returnResult(Object.class) + .consumeWith(result -> { + HttpHeaders httpHeaders = result.getResponseHeaders(); + assertThat(httpHeaders.get("X-Response-Default-Foo")).hasSize(1); + }); } @Test void loadBalancerFilterWorks() { - testClient.get().uri("/get").header("Host", "www.loadbalancerclient.org").exchange().expectStatus().isOk() - .expectHeader().valueEquals(ROUTE_ID_HEADER, "load_balancer_client_test"); + testClient.get() + .uri("/get") + .header("Host", "www.loadbalancerclient.org") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "load_balancer_client_test"); } @Test void loadBalancerFilterNoClientWorks() { - testClient.get().uri("/get").header("Host", "www.loadbalancerclientempty.org").exchange().expectStatus() - .value(new BaseMatcher() { - @Override - public boolean matches(Object item) { - if (Integer.class.isInstance(item)) { - Integer toMatch = (Integer) item; - return toMatch.intValue() == 503; - } - return false; + testClient.get() + .uri("/get") + .header("Host", "www.loadbalancerclientempty.org") + .exchange() + .expectStatus() + .value(new BaseMatcher() { + @Override + public boolean matches(Object item) { + if (Integer.class.isInstance(item)) { + Integer toMatch = (Integer) item; + return toMatch.intValue() == 503; } + return false; + } - @Override - public void describeTo(Description description) { - description.appendText("Expected 503"); - } - }); + @Override + public void describeTo(Description description) { + description.appendText("Expected 503"); + } + }); } @Test diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/HttpBinCompatibleController.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/HttpBinCompatibleController.java index 7c6ff443..dbf7dd24 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/HttpBinCompatibleController.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/HttpBinCompatibleController.java @@ -129,14 +129,18 @@ public class HttpBinCompatibleController { produces = MediaType.APPLICATION_JSON_VALUE) public Mono> postFormData(@RequestBody Mono> parts) { // StringDecoder decoder = StringDecoder.allMimeTypes(true); - return parts.flux().flatMap(map -> Flux.fromIterable(map.values())).flatMap(Flux::fromIterable) - .filter(part -> part instanceof FilePart).reduce(new HashMap(), (files, part) -> { - MediaType contentType = part.headers().getContentType(); - long contentLength = part.headers().getContentLength(); - // TODO: get part data - files.put(part.name(), "data:" + contentType + ";base64," + contentLength); - return files; - }).map(files -> Collections.singletonMap("files", files)); + return parts.flux() + .flatMap(map -> Flux.fromIterable(map.values())) + .flatMap(Flux::fromIterable) + .filter(part -> part instanceof FilePart) + .reduce(new HashMap(), (files, part) -> { + MediaType contentType = part.headers().getContentType(); + long contentLength = part.headers().getContentLength(); + // TODO: get part data + files.put(part.name(), "data:" + contentType + ";base64," + contentLength); + return files; + }) + .map(files -> Collections.singletonMap("files", files)); } @PostMapping(path = "/post", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, @@ -171,11 +175,14 @@ public class HttpBinCompatibleController { @RequestMapping(value = "/responseheaders/{status}", method = { RequestMethod.GET, RequestMethod.POST }) public ResponseEntity> responseHeaders(@PathVariable int status, ServerWebExchange exchange) { - HttpHeaders httpHeaders = exchange.getRequest().getHeaders().entrySet().stream() - .filter(entry -> entry.getKey().startsWith("X-Test-")) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, - (list1, list2) -> Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList()), - HttpHeaders::new)); + HttpHeaders httpHeaders = exchange.getRequest() + .getHeaders() + .entrySet() + .stream() + .filter(entry -> entry.getKey().startsWith("X-Test-")) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, + (list1, list2) -> Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList()), + HttpHeaders::new)); return ResponseEntity.status(status).headers(httpHeaders).body(Collections.singletonMap("status", status)); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/HttpStatusTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/HttpStatusTests.java index 87fd38ea..f011fe85 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/HttpStatusTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/HttpStatusTests.java @@ -46,8 +46,13 @@ public class HttpStatusTests extends BaseWebClientTests { @Test void notFoundResponseWorks() { - testClient.get().uri("/status/404").exchange().expectStatus().isEqualTo(HttpStatus.NOT_FOUND) - .expectBody(String.class).isEqualTo("Failed with 404"); + testClient.get() + .uri("/status/404") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.NOT_FOUND) + .expectBody(String.class) + .isEqualTo("Failed with 404"); } @Test @@ -64,16 +69,25 @@ public class HttpStatusTests extends BaseWebClientTests { @Test void serverErrorResponseWorks() { - testClient.get().uri("/status/500").exchange().expectStatus().isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR) - .expectBody(String.class).isEqualTo("Failed with 500"); + testClient.get() + .uri("/status/500") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR) + .expectBody(String.class) + .isEqualTo("Failed with 500"); } @Test void normalErrorPageWorks() { - testClient.get().uri("/exception").exchange().expectStatus().isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR) - .expectBody(Map.class) - .consumeWith(result -> assertThat(result.getResponseBody()).hasSizeGreaterThanOrEqualTo(5) - .containsKeys("timestamp", "path", "status", "error", "message")); + testClient.get() + .uri("/exception") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR) + .expectBody(Map.class) + .consumeWith(result -> assertThat(result.getResponseBody()).hasSizeGreaterThanOrEqualTo(5) + .containsKeys("timestamp", "path", "status", "error", "message")); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/PostTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/PostTests.java index acc260a6..809021f6 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/PostTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/PostTests.java @@ -39,11 +39,17 @@ class PostTests extends BaseWebClientTests { @Test void postWorks() { - Mono result = webClient.post().uri("/post").header("Host", "www.example.org").bodyValue("testdata") - .retrieve().bodyToMono(Map.class); + Mono result = webClient.post() + .uri("/post") + .header("Host", "www.example.org") + .bodyValue("testdata") + .retrieve() + .bodyToMono(Map.class); - StepVerifier.create(result).consumeNextWith(map -> assertThat(map).containsEntry("data", "testdata")) - .expectComplete().verify(DURATION); + StepVerifier.create(result) + .consumeNextWith(map -> assertThat(map).containsEntry("data", "testdata")) + .expectComplete() + .verify(DURATION); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/RouteConstructionIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/RouteConstructionIntegrationTests.java index 13f25d1a..a7cd9641 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/RouteConstructionIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/RouteConstructionIntegrationTests.java @@ -32,7 +32,7 @@ public class RouteConstructionIntegrationTests { @Test public void routesWithVerificationShouldFail() { assertThatThrownBy(() -> new SpringApplicationBuilder(TestConfig.class).profiles("verification-route") - .run("--server.port=0")).hasMessageContaining("Stop right now!"); + .run("--server.port=0")).hasMessageContaining("Stop right now!"); } @EnableAutoConfiguration diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/sse/SseIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/sse/SseIntegrationTests.java index 1cd3a243..46465add 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/sse/SseIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/sse/SseIntegrationTests.java @@ -94,7 +94,8 @@ public class SseIntegrationTests { logger.info("SSE Port: " + this.serverPort); this.gatewayContext = new SpringApplicationBuilder(GatewayConfig.class) - .properties("sse.server.port:" + this.serverPort, "server.port=0", "spring.jmx.enabled=false").run(); + .properties("sse.server.port:" + this.serverPort, "server.port=0", "spring.jmx.enabled=false") + .run(); ConfigurableEnvironment env = this.gatewayContext.getBean(ConfigurableEnvironment.class); this.gatewayPort = Integer.valueOf(env.getProperty("local.server.port")); @@ -123,28 +124,40 @@ public class SseIntegrationTests { @Test public void sseAsString() { - Flux result = this.webClient.get().uri("/string").accept(TEXT_EVENT_STREAM).retrieve() - .bodyToFlux(String.class); + Flux result = this.webClient.get() + .uri("/string") + .accept(TEXT_EVENT_STREAM) + .retrieve() + .bodyToFlux(String.class); StepVerifier.create(result).expectNext("foo 0").expectNext("foo 1").thenCancel().verify(Duration.ofSeconds(5L)); } @Test public void sseAsPerson() { - Flux result = this.webClient.get().uri("/person").accept(TEXT_EVENT_STREAM).retrieve() - .bodyToFlux(Person.class); + Flux result = this.webClient.get() + .uri("/person") + .accept(TEXT_EVENT_STREAM) + .retrieve() + .bodyToFlux(Person.class); - StepVerifier.create(result).expectNext(new Person("foo 0")).expectNext(new Person("foo 1")).thenCancel() - .verify(Duration.ofSeconds(5L)); + StepVerifier.create(result) + .expectNext(new Person("foo 0")) + .expectNext(new Person("foo 1")) + .thenCancel() + .verify(Duration.ofSeconds(5L)); } @Test @SuppressWarnings("Duplicates") public void sseAsEvent() { ResolvableType type = forClassWithGenerics(ServerSentEvent.class, String.class); - Flux> result = this.webClient.get().uri("/event").accept(TEXT_EVENT_STREAM).retrieve() - .bodyToFlux(new ParameterizedTypeReference>() { - }); + Flux> result = this.webClient.get() + .uri("/event") + .accept(TEXT_EVENT_STREAM) + .retrieve() + .bodyToFlux(new ParameterizedTypeReference>() { + }); StepVerifier.create(result).consumeNextWith(event -> { assertThat(event.id()).isEqualTo("0"); @@ -164,9 +177,12 @@ public class SseIntegrationTests { @Test @SuppressWarnings("Duplicates") public void sseAsEventWithoutAcceptHeader() { - Flux> result = this.webClient.get().uri("/event").accept(TEXT_EVENT_STREAM).retrieve() - .bodyToFlux(new ParameterizedTypeReference>() { - }); + Flux> result = this.webClient.get() + .uri("/event") + .accept(TEXT_EVENT_STREAM) + .retrieve() + .bodyToFlux(new ParameterizedTypeReference>() { + }); StepVerifier.create(result).consumeNextWith(event -> { assertThat(event.id()).isEqualTo("0"); @@ -228,8 +244,9 @@ public class SseIntegrationTests { @Bean public RouteLocator sseRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route("sse_route", r -> r.alwaysTrue().uri("http://localhost:" + this.port)) - .build(); + return builder.routes() + .route("sse_route", r -> r.alwaysTrue().uri("http://localhost:" + this.port)) + .build(); } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/ssl/ClientCertAuthSSLTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/ssl/ClientCertAuthSSLTests.java index 047215c3..39c13f74 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/ssl/ClientCertAuthSSLTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/ssl/ClientCertAuthSSLTests.java @@ -75,8 +75,10 @@ public class ClientCertAuthSSLTests extends SingleCertSSLTests { keyManagerFactory.init(store, keyPasswordCharArray); try { - SslContext sslContext = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE) - .keyManager(keyManagerFactory).build(); + SslContext sslContext = SslContextBuilder.forClient() + .trustManager(InsecureTrustManagerFactory.INSTANCE) + .keyManager(keyManagerFactory) + .build(); HttpClient httpClient = HttpClient.create().secure(ssl -> ssl.sslContext(sslContext)); setup(new ReactorClientHttpConnector(httpClient), "https://localhost:" + port); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/ssl/SingleCertSSLTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/ssl/SingleCertSSLTests.java index 15289a0f..8ba13d04 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/ssl/SingleCertSSLTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/ssl/SingleCertSSLTests.java @@ -47,8 +47,9 @@ public class SingleCertSSLTests extends BaseWebClientTests { @BeforeEach public void setup() throws Exception { try { - SslContext sslContext = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE) - .build(); + SslContext sslContext = SslContextBuilder.forClient() + .trustManager(InsecureTrustManagerFactory.INSTANCE) + .build(); HttpClient httpClient = HttpClient.create().secure(ssl -> ssl.sslContext(sslContext)); setup(new ReactorClientHttpConnector(httpClient), "https://localhost:" + port); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/websocket/WebSocketIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/websocket/WebSocketIntegrationTests.java index afb61ff1..7de7b5d9 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/websocket/WebSocketIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/websocket/WebSocketIntegrationTests.java @@ -124,7 +124,8 @@ public class WebSocketIntegrationTests { } this.gatewayContext = new SpringApplicationBuilder(GatewayConfig.class) - .properties("ws.server.port:" + this.serverPort, "server.port=0", "spring.jmx.enabled=false").run(); + .properties("ws.server.port:" + this.serverPort, "server.port=0", "spring.jmx.enabled=false") + .run(); ConfigurableEnvironment env = this.gatewayContext.getBean(ConfigurableEnvironment.class); this.gatewayPort = Integer.valueOf(env.getProperty("local.server.port")); @@ -162,11 +163,14 @@ public class WebSocketIntegrationTests { int count = 100; Flux input = Flux.range(1, count).map(index -> "msg-" + index); AtomicReference> actualRef = new AtomicReference<>(); - this.client.execute(getUrl("/echo"), - session -> session.send(input.map(session::textMessage)) - .thenMany(session.receive().take(count).map(WebSocketMessage::getPayloadAsText)).collectList() - .doOnNext(actualRef::set).then()) - .block(TIMEOUT); + this.client + .execute(getUrl("/echo"), + session -> session.send(input.map(session::textMessage)) + .thenMany(session.receive().take(count).map(WebSocketMessage::getPayloadAsText)) + .collectList() + .doOnNext(actualRef::set) + .then()) + .block(TIMEOUT); assertThat(actualRef.get()).isNotNull(); assertThat(actualRef.get()).isEqualTo(input.collectList().block()); } @@ -179,8 +183,10 @@ public class WebSocketIntegrationTests { this.client.execute(getHttpUrl("/echoForHttp"), session -> { logger.debug("Starting to send messages"); return session.send(input.doOnNext(s -> logger.debug("outbound " + s)).map(session::textMessage)) - .thenMany(session.receive().take(count).map(WebSocketMessage::getPayloadAsText)).collectList() - .doOnNext(actualRef::set).then(); + .thenMany(session.receive().take(count).map(WebSocketMessage::getPayloadAsText)) + .collectList() + .doOnNext(actualRef::set) + .then(); }).block(TIMEOUT); assertThat(actualRef.get()).isNotNull(); assertThat(actualRef.get()).isEqualTo(input.collectList().block()); @@ -202,8 +208,11 @@ public class WebSocketIntegrationTests { @Override public Mono handle(WebSocketSession session) { infoRef.set(session.getHandshakeInfo()); - return session.receive().map(WebSocketMessage::getPayloadAsText).doOnNext(protocolRef::set) - .doOnError(protocolRef::set).then(); + return session.receive() + .map(WebSocketMessage::getPayloadAsText) + .doOnNext(protocolRef::set) + .doOnError(protocolRef::set) + .then(); } }).block(TIMEOUT); @@ -220,9 +229,14 @@ public class WebSocketIntegrationTests { headers.add("my-header", "my-value"); AtomicReference headerRef = new AtomicReference<>(); - this.client.execute(getUrl("/custom-header"), headers, session -> session.receive() - .map(WebSocketMessage::getPayloadAsText).doOnNext(headerRef::set).doOnError(headerRef::set).then()) - .block(TIMEOUT); + this.client + .execute(getUrl("/custom-header"), headers, + session -> session.receive() + .map(WebSocketMessage::getPayloadAsText) + .doOnNext(headerRef::set) + .doOnError(headerRef::set) + .then()) + .block(TIMEOUT); assertThat(headerRef.get()).isEqualTo("my-header:my-value"); } @@ -238,15 +252,15 @@ public class WebSocketIntegrationTests { }); }).block(Duration.ofMillis(5000)); assertThat(closeStatus.get().block(Duration.ofMillis(5000))) - .isEqualTo(CloseStatus.create(4999, "server-close")); + .isEqualTo(CloseStatus.create(4999, "server-close")); } @Test public void clientClosing() throws Exception { this.client.execute(getUrl("/client-close"), session -> session.close(CloseStatus.create(4999, "client-close"))) - .block(Duration.ofMillis(5000)); + .block(Duration.ofMillis(5000)); assertThat(serverCloseStatusSink.asMono().block(Duration.ofMillis(5000))) - .isEqualTo(CloseStatus.create(4999, "client-close")); + .isEqualTo(CloseStatus.create(4999, "client-close")); } @Disabled @@ -256,8 +270,11 @@ public class WebSocketIntegrationTests { AtomicReference receivedCookieRef = new AtomicReference<>(); this.client.execute(getUrl("/cookie"), session -> { cookie.set(session.getHandshakeInfo().getHeaders().getFirst("Set-Cookie")); - return session.receive().map(WebSocketMessage::getPayloadAsText).doOnNext(receivedCookieRef::set) - .doOnError(receivedCookieRef::set).then(); + return session.receive() + .map(WebSocketMessage::getPayloadAsText) + .doOnNext(receivedCookieRef::set) + .doOnError(receivedCookieRef::set) + .then(); }).block(TIMEOUT); assertThat(receivedCookieRef.get()).isEqualTo("cookie"); assertThat(cookie.get()).isEqualTo("project=spring"); @@ -395,8 +412,10 @@ public class WebSocketIntegrationTests { @Bean public RouteLocator wsRouteLocator(RouteLocatorBuilder builder) { - return builder.routes().route(r -> r.path("/echoForHttp").uri("lb://wsservice")) - .route(r -> r.alwaysTrue().uri("lb:ws://wsservice")).build(); + return builder.routes() + .route(r -> r.path("/echoForHttp").uri("lb://wsservice")) + .route(r -> r.alwaysTrue().uri("lb:ws://wsservice")) + .build(); } } diff --git a/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java b/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java index 983f4466..67cecf50 100644 --- a/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java +++ b/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java @@ -370,8 +370,9 @@ public class ProxyExchange { private Mono> exchange(RequestEntity requestEntity) { Type type = this.responseType; - RequestBodySpec builder = rest.method(requestEntity.getMethod()).uri(requestEntity.getUrl()) - .headers(headers -> addHeaders(headers, requestEntity.getHeaders())); + RequestBodySpec builder = rest.method(requestEntity.getMethod()) + .uri(requestEntity.getUrl()) + .headers(headers -> addHeaders(headers, requestEntity.getHeaders())); WebClient.ResponseSpec result; if (requestEntity.getBody() instanceof Publisher) { @SuppressWarnings("unchecked") @@ -384,26 +385,30 @@ public class ProxyExchange { else { if (hasBody) { result = builder.headers(headers -> addHeaders(headers, exchange.getRequest().getHeaders())) - .body(exchange.getRequest().getBody(), DataBuffer.class).retrieve(); + .body(exchange.getRequest().getBody(), DataBuffer.class) + .retrieve(); } else { result = builder.headers(headers -> addHeaders(headers, exchange.getRequest().getHeaders())).retrieve(); } } return result.onStatus(HttpStatusCode::isError, t -> Mono.empty()) - .toEntity(ParameterizedTypeReference.forType(type)); + .toEntity(ParameterizedTypeReference.forType(type)); } private void addHeaders(HttpHeaders headers, HttpHeaders toAdd) { Set filteredKeys = filterHeaderKeys(toAdd); - filteredKeys.stream().filter(key -> !headers.containsKey(key)) - .forEach(header -> headers.addAll(header, toAdd.get(header))); + filteredKeys.stream() + .filter(key -> !headers.containsKey(key)) + .forEach(header -> headers.addAll(header, toAdd.get(header))); } private Set filterHeaderKeys(HttpHeaders headers) { final Set excludedHeaders = this.excluded != null ? this.excluded : Collections.emptySet(); - return headers.keySet().stream().filter(header -> !excludedHeaders.contains(header.toLowerCase())) - .collect(Collectors.toSet()); + return headers.keySet() + .stream() + .filter(header -> !excludedHeaders.contains(header.toLowerCase())) + .collect(Collectors.toSet()); } private BodyBuilder headers(BodyBuilder builder) { diff --git a/spring-cloud-gateway-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ProductionConfigurationTests.java b/spring-cloud-gateway-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ProductionConfigurationTests.java index f7246e18..374bbfa5 100644 --- a/spring-cloud-gateway-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ProductionConfigurationTests.java +++ b/spring-cloud-gateway-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ProductionConfigurationTests.java @@ -115,7 +115,7 @@ public class ProductionConfigurationTests { @Test public void post() throws Exception { assertThat(rest.postForObject("/proxy/0", Collections.singletonMap("name", "foo"), Bar.class).getName()) - .isEqualTo("host=localhost:" + port + ";foo"); + .isEqualTo("host=localhost:" + port + ";foo"); } @Test @@ -130,21 +130,21 @@ public class ProductionConfigurationTests { headers.setContentLength(json.length()); var request = new HttpEntity<>(json, headers); assertThat(rest.postForEntity("/proxy/checkContentLength", request, Void.class).getStatusCode()) - .isEqualTo(HttpStatus.OK); + .isEqualTo(HttpStatus.OK); } @Test public void forwardPost() throws Exception { assertThat(rest.postForObject("/proxy/forward/0", Collections.singletonMap("name", "foo"), Bar.class).getName()) - .isEqualTo("host=localhost:" + port + ";foo"); + .isEqualTo("host=localhost:" + port + ";foo"); } @Test public void list() throws Exception { ResponseEntity> result = rest.exchange( RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy")) - .contentType(MediaType.APPLICATION_JSON) - .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), + .contentType(MediaType.APPLICATION_JSON) + .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), new ParameterizedTypeReference>() { }); assertThat(result.getBody().iterator().next().getName()).isEqualTo("host=localhost:" + port + ";foo"); @@ -153,47 +153,62 @@ public class ProductionConfigurationTests { @Test public void bodyless() throws Exception { assertThat(rest.postForObject("/proxy/0", Collections.singletonMap("name", "foo"), Bar.class).getName()) - .isEqualTo("host=localhost:" + port + ";foo"); + .isEqualTo("host=localhost:" + port + ";foo"); } @Test public void entity() throws Exception { assertThat( - rest.exchange(RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/entity")) - .body(Collections.singletonMap("name", "foo")), new ParameterizedTypeReference>() { - }).getBody().iterator().next().getName()).isEqualTo("host=localhost:" + port + ";foo"); + rest.exchange( + RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/entity")) + .body(Collections.singletonMap("name", "foo")), + new ParameterizedTypeReference>() { + }) + .getBody() + .iterator() + .next() + .getName()) + .isEqualTo("host=localhost:" + port + ";foo"); } @Test public void entityWithType() throws Exception { assertThat( - rest.exchange(RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/type")) - .body(Collections.singletonMap("name", "foo")), new ParameterizedTypeReference>() { - }).getBody().iterator().next().getName()).isEqualTo("host=localhost:" + port + ";foo"); + rest.exchange( + RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/type")) + .body(Collections.singletonMap("name", "foo")), + new ParameterizedTypeReference>() { + }) + .getBody() + .iterator() + .next() + .getName()) + .isEqualTo("host=localhost:" + port + ";foo"); } @Test public void single() throws Exception { assertThat(rest.postForObject("/proxy/single", Collections.singletonMap("name", "foobar"), Bar.class).getName()) - .isEqualTo("host=localhost:" + port + ";foobar"); + .isEqualTo("host=localhost:" + port + ";foobar"); } @Test public void converter() throws Exception { assertThat( rest.postForObject("/proxy/converter", Collections.singletonMap("name", "foobar"), Bar.class).getName()) - .isEqualTo("host=localhost:" + port + ";foobar"); + .isEqualTo("host=localhost:" + port + ";foobar"); } @Test @SuppressWarnings({ "Duplicates", "unchecked" }) public void testSensitiveHeadersOverride() throws Exception { Map> headers = rest - .exchange( - RequestEntity.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers")) - .header("foo", "bar").header("abc", "xyz").header("cookie", "monster").build(), - Map.class) - .getBody(); + .exchange(RequestEntity.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers")) + .header("foo", "bar") + .header("abc", "xyz") + .header("cookie", "monster") + .build(), Map.class) + .getBody(); assertThat(headers).doesNotContainKey("foo").doesNotContainKey("hello").containsKeys("bar", "abc"); assertThat(headers.get("cookie")).containsOnly("monster"); @@ -201,9 +216,12 @@ public class ProductionConfigurationTests { @Test public void testSensitiveHeadersDefault() throws Exception { - Map> headers = rest.exchange(RequestEntity + Map> headers = rest + .exchange(RequestEntity .get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/sensitive-headers-default")) - .header("cookie", "monster").build(), Map.class).getBody(); + .header("cookie", "monster") + .build(), Map.class) + .getBody(); assertThat(headers).doesNotContainKey("cookie"); } @@ -212,9 +230,12 @@ public class ProductionConfigurationTests { @SuppressWarnings({ "Duplicates", "unchecked" }) public void headers() throws Exception { Map> headers = rest - .exchange(RequestEntity.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers")) - .header("foo", "bar").header("abc", "xyz").header("baz", "fob").build(), Map.class) - .getBody(); + .exchange(RequestEntity.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers")) + .header("foo", "bar") + .header("abc", "xyz") + .header("baz", "fob") + .build(), Map.class) + .getBody(); assertThat(headers).doesNotContainKey("foo").doesNotContainKey("hello").containsKeys("bar", "abc"); assertThat(headers.get("bar")).containsOnly("hello"); @@ -225,9 +246,10 @@ public class ProductionConfigurationTests { @Test public void forwardedHeaderUsesHost() throws Exception { Map> headers = rest - .exchange(RequestEntity.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers")) - .header("host", "foo:1234").build(), Map.class) - .getBody(); + .exchange(RequestEntity.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers")) + .header("host", "foo:1234") + .build(), Map.class) + .getBody(); assertThat(headers).containsKey("forwarded"); assertThat(headers.get("forwarded").size()).isEqualTo(1); @@ -343,9 +365,11 @@ public class ProductionConfigurationTests { @PostMapping("/proxy/converter") public Mono> implicitEntityWithConverter(@RequestBody Foo foo, ProxyExchange> proxy) throws Exception { - return proxy.uri(home.toString() + "/bars").body(Arrays.asList(foo)) - .post(response -> ResponseEntity.status(response.getStatusCode()).headers(response.getHeaders()) - .body(response.getBody().iterator().next())); + return proxy.uri(home.toString() + "/bars") + .body(Arrays.asList(foo)) + .post(response -> ResponseEntity.status(response.getStatusCode()) + .headers(response.getHeaders()) + .body(response.getBody().iterator().next())); } @GetMapping("/proxy/headers") @@ -373,8 +397,9 @@ public class ProductionConfigurationTests { } private ResponseEntity first(ResponseEntity> response) { - return ResponseEntity.status(response.getStatusCode()).headers(response.getHeaders()) - .body(response.getBody().iterator().next()); + return ResponseEntity.status(response.getStatusCode()) + .headers(response.getHeaders()) + .body(response.getBody().iterator().next()); } @GetMapping("/proxy/forward/{id}") @@ -399,8 +424,11 @@ public class ProductionConfigurationTests { @DeleteMapping("/proxy/{id}") public Mono> deleteWithBody(@PathVariable Integer id, @RequestBody Foo foo, ProxyExchange proxy) throws Exception { - return proxy.uri(home.toString() + "/foos/" + id).body(foo).delete(response -> ResponseEntity - .status(response.getStatusCode()).headers(response.getHeaders()).body(response.getBody())); + return proxy.uri(home.toString() + "/foos/" + id) + .body(foo) + .delete(response -> ResponseEntity.status(response.getStatusCode()) + .headers(response.getHeaders()) + .body(response.getBody())); } } diff --git a/spring-cloud-gateway-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ReactiveTests.java b/spring-cloud-gateway-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ReactiveTests.java index 9321860f..506741e4 100644 --- a/spring-cloud-gateway-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ReactiveTests.java +++ b/spring-cloud-gateway-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ReactiveTests.java @@ -64,9 +64,9 @@ public class ReactiveTests { @Test public void postBytes() throws Exception { - ResponseEntity> result = rest.exchange(RequestEntity - .post(rest.getRestTemplate().getUriTemplateHandler().expand("/bytes")).body("hello foo".getBytes()), - new ParameterizedTypeReference>() { + ResponseEntity> result = rest + .exchange(RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/bytes")) + .body("hello foo".getBytes()), new ParameterizedTypeReference>() { }); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(result.getBody().iterator().next().getName()).isEqualTo("hello foo"); @@ -76,7 +76,7 @@ public class ReactiveTests { public void post() throws Exception { ResponseEntity> result = rest.exchange( RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/bars")) - .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), + .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), new ParameterizedTypeReference>() { }); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); @@ -87,7 +87,7 @@ public class ReactiveTests { public void postFlux() throws Exception { ResponseEntity> result = rest.exchange( RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/flux/bars")) - .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), + .body(Collections.singletonList(Collections.singletonMap("name", "foo"))), new ParameterizedTypeReference>() { }); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK);