From 6d888fa2125380fb16854e9075335ee9092162f7 Mon Sep 17 00:00:00 2001 From: Daniel Shiplett Date: Fri, 14 Jun 2024 15:04:47 -0400 Subject: [PATCH] fix: add splitting of comma separated cache-control values --- .../filter/factory/cache/ResponseCacheManager.java | 7 +++++-- .../factory/cache/ResponseCacheGatewayFilterTest.java | 8 ++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) 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 90d8a42dcc..f2c1477dbc 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 @@ -23,6 +23,7 @@ import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -60,6 +61,8 @@ public class ResponseCacheManager { private static final String VARY_WILDCARD = "*"; + private static final Pattern CACHE_CONTROL_SPLITTER = Pattern.compile("\\s*,\\s*"); + final CacheKeyGenerator cacheKeyGenerator; final List afterCacheExchangeMutators; @@ -193,8 +196,8 @@ private boolean isVaryWildcard(ServerHttpResponse response) { private boolean isCacheControlAllowed(HttpMessage request) { HttpHeaders headers = request.getHeaders(); List cacheControlHeader = headers.getOrEmpty(HttpHeaders.CACHE_CONTROL); - - return cacheControlHeader.stream().noneMatch(forbiddenCacheControlValues::contains); + return cacheControlHeader.stream().flatMap(CACHE_CONTROL_SPLITTER::splitAsStream) + .noneMatch(forbiddenCacheControlValues::contains); } private static boolean hasRequestBody(ServerHttpRequest request) { diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/ResponseCacheGatewayFilterTest.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/ResponseCacheGatewayFilterTest.java index cb2506dd53..9d15fd6f6d 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/ResponseCacheGatewayFilterTest.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/ResponseCacheGatewayFilterTest.java @@ -102,6 +102,14 @@ void responseShouldNotBeCacheable() { response.setStatusCode(HttpStatus.OK); assertThat(cacheManagerToTest.isResponseCacheable(response)).isFalse(); + + headers = new HttpHeaders(); + headers.add(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, max-age=0, must-revalidate"); + response = new MockServerHttpResponse(); + response.getHeaders().putAll(headers); + response.setStatusCode(HttpStatus.OK); + + assertThat(cacheManagerToTest.isResponseCacheable(response)).isFalse(); } }