From 0dca49318c8ad78a1a56596bfdf4e8e90b93af24 Mon Sep 17 00:00:00 2001 From: spencergibb Date: Fri, 3 Mar 2023 22:21:03 -0500 Subject: [PATCH] Include contextPath in eurekaVersionFilter computed path Fixes gh-4154 --- .../server/EurekaServerAutoConfiguration.java | 28 ++++++++++++++----- .../server/ApplicationContextTests.java | 5 +++- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerAutoConfiguration.java b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerAutoConfiguration.java index 249b39224..6aed5e520 100644 --- a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerAutoConfiguration.java +++ b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerAutoConfiguration.java @@ -246,12 +246,15 @@ public class EurekaServerAutoConfiguration implements WebMvcConfigurer { } @Bean - public FilterRegistrationBean eurekaVersionFilterRegistration(ServerProperties serverProperties) { - String contextPath = serverProperties.getServlet().getContextPath(); + public FilterRegistrationBean eurekaVersionFilterRegistration(ServerProperties serverProperties, + Environment env) { + final String contextPath = serverProperties.getServlet().getContextPath(); String regex = EurekaConstants.DEFAULT_PREFIX + STATIC_CONTENT_PATTERN; if (StringUtils.hasText(contextPath)) { regex = contextPath + regex; } + String debugResponseHeader = env.getProperty("eureka.server.version.filter.debug.response-header"); + boolean addDebugResponseHeader = StringUtils.hasText(debugResponseHeader); Pattern staticPattern = Pattern.compile(regex); FilterRegistrationBean bean = new FilterRegistrationBean<>(); bean.setFilter(new OncePerRequestFilter() { @@ -264,18 +267,29 @@ public class EurekaServerAutoConfiguration implements WebMvcConfigurer { // don't forward static requests (images, js, etc...) to /v2 && !staticPattern.matcher(requestURI).matches()) { - String updatedPath = EurekaConstants.DEFAULT_PREFIX + "/v2" - + requestURI.substring(EurekaConstants.DEFAULT_PREFIX.length()); - + String prefix = EurekaConstants.DEFAULT_PREFIX; + if (StringUtils.hasText(contextPath)) { + prefix = contextPath + prefix; + } + String updatedPath = EurekaConstants.DEFAULT_PREFIX + "/v2" + requestURI.substring(prefix.length()); + if (StringUtils.hasText(contextPath)) { + updatedPath = contextPath + updatedPath; + } + final String computedPath = updatedPath; + // only used if a special debug property is set, so in prod this is + // always skipped. + if (addDebugResponseHeader) { + response.addHeader(debugResponseHeader, computedPath); + } HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(request) { @Override public String getRequestURI() { - return updatedPath; + return computedPath; } @Override public String getServletPath() { - return updatedPath; + return computedPath; } }; req = wrapper; diff --git a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationContextTests.java b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationContextTests.java index 002bd40ec..c4e2f46f6 100644 --- a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationContextTests.java +++ b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationContextTests.java @@ -40,7 +40,8 @@ import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, properties = { "spring.application.name=eureka", "server.servlet.context-path=/context", - "management.security.enabled=false", "management.endpoints.web.exposure.include=*" }) + "management.security.enabled=false", "management.endpoints.web.exposure.include=*", + "eureka.server.version.filter.debug.response-header=X-Version-Filter-Computed-Path" }) class ApplicationContextTests { private static final String BASE_PATH = new WebEndpointProperties().getBasePath(); @@ -54,6 +55,8 @@ class ApplicationContextTests { ResponseEntity entity = new TestRestTemplate() .getForEntity("http://localhost:" + this.port + "/context/eureka/apps", Map.class); assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); + String computedPath = entity.getHeaders().getFirst("X-Version-Filter-Computed-Path"); + assertThat(computedPath).isEqualTo("/context/eureka/v2/apps"); } @Test