From 74717fd5b178364e4a4ee19653df8b54594fa390 Mon Sep 17 00:00:00 2001 From: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> Date: Thu, 11 Jan 2024 13:42:59 -0500 Subject: [PATCH] Support segments with Java config. Fixes #3204 --- .../factory/SpringCloudCircuitBreakerFilterFactory.java | 8 ++++++-- .../SpringCloudCircuitBreakerFilterFactoryTests.java | 6 ++++++ .../factory/SpringCloudCircuitBreakerTestConfig.java | 9 +++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) 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 758d6f3e..cbea631b 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 @@ -17,6 +17,8 @@ package org.springframework.cloud.gateway.filter.factory; import java.net.URI; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -135,8 +137,10 @@ public abstract class SpringCloudCircuitBreakerFilterFactory @Override public String toString() { + String fallbackUriString = config.fallbackUri != null + ? URLDecoder.decode(config.fallbackUri.toString(), StandardCharsets.UTF_8) : null; return filterToStringCreator(SpringCloudCircuitBreakerFilterFactory.this) - .append("name", config.getName()).append("fallback", config.fallbackUri).toString(); + .append("name", config.getName()).append("fallback", fallbackUriString).toString(); } }; } @@ -184,7 +188,7 @@ public abstract class SpringCloudCircuitBreakerFilterFactory } public Config setFallbackUri(String fallbackUri) { - return setFallbackUri(URI.create(fallbackUri)); + return setFallbackUri(UriComponentsBuilder.fromUriString(fallbackUri).build().toUri()); } public String getName() { 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 335e3122..9cefd9a5 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 @@ -91,6 +91,12 @@ public abstract class SpringCloudCircuitBreakerFilterFactoryTests extends BaseWe .is5xxServerError(); } + @Test + public void testJavaConfigSegments() { + testClient.get().uri("/fallback/seg").exchange().expectStatus().isOk().expectBody() + .json("{\"from\":\"circuitbreakerfallbackcontrollerseg\"}"); + } + @Test public void filterErrorPage() { testClient.get().uri("/delay/3").header("Host", "www.circuitbreakerconnectfail.org").accept(APPLICATION_JSON) 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 e96093c5..ed2181f4 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 @@ -83,6 +83,11 @@ public class SpringCloudCircuitBreakerTestConfig { return Collections.singletonMap("from", "circuitbreakerfallbackcontroller3"); } + @GetMapping("/circuitbreakerFallbackController/seg") + public Map fallbackcontrollerSeg() { + return Collections.singletonMap("from", "circuitbreakerfallbackcontrollerseg"); + } + @GetMapping("/statusCodeFallbackController") public Map statusCodeFallbackController(ServerWebExchange exchange) { return Collections.singletonMap("from", "statusCodeFallbackController"); @@ -106,6 +111,10 @@ public class SpringCloudCircuitBreakerTestConfig { return builder.routes() .route("fallback_controller_3", r -> r.path("/fallback").filters(f -> f.setPath("/circuitbreakerFallbackController3")).uri(uri)) + .route("fallback_with_segments", r -> r.path("/fallback/{*segments}") + .filters(f -> f.circuitBreaker(c -> c.setName("test") + .setFallbackUri("forward:/circuitbreakerFallbackController/{segments}"))) + .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",