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 1a5471f589..e438b9ef14 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; @@ -61,6 +62,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; @@ -195,8 +198,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(); } }