From f10cf1701afdb9dbb5525cca1ff22d78c1d39bb6 Mon Sep 17 00:00:00 2001 From: rodom_macbook Date: Mon, 2 Jun 2025 00:17:09 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20add=20=E2=80=9Cenabled=E2=80=9D=20o?= =?UTF-8?q?ptions=20to=20KeyGenerator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cache/keygenerator/CacheKeyGenerator.java | 3 +- .../CookiesKeyValueGenerator.java | 15 +++++++++ .../keygenerator/HeaderKeyValueGenerator.java | 14 ++++++++ .../cache/keygenerator/KeyValueGenerator.java | 5 +++ .../keygenerator/UriKeyValueGenerator.java | 14 ++++++++ .../DefaultKeyValueGeneratorTests.java | 33 +++++++++++++++++++ 6 files changed, 83 insertions(+), 1 deletion(-) diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/CacheKeyGenerator.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/CacheKeyGenerator.java index ccbf7b5448..51b3a1fc3b 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/CacheKeyGenerator.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/CacheKeyGenerator.java @@ -32,6 +32,7 @@ * @author Marta Medio * @author Ignacio Lozano * @author Simone Gerevini + * @author Dong Hyeon Lee */ public class CacheKeyGenerator { @@ -80,7 +81,7 @@ private byte[] generateRawKey(ServerHttpRequest request, List varyHeader Stream keyValueGenerators = getKeyValueGenerators(varyHeaders); final ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream(); - keyValueGenerators.map(generator -> generator.apply(request)).map(String::getBytes).forEach(bytes -> { + keyValueGenerators.filter(KeyValueGenerator::isEnabled).map(generator -> generator.apply(request)).map(String::getBytes).forEach(bytes -> { byteOutputStream.writeBytes(bytes); byteOutputStream.writeBytes(KEY_SEPARATOR_BYTES); }); 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 af56a2da02..301de416af 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 @@ -20,6 +20,7 @@ import java.util.Objects; import java.util.stream.Collectors; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.http.HttpCookie; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.util.CollectionUtils; @@ -28,11 +29,15 @@ /** * @author Marta Medio * @author Ignacio Lozano + * @author Dong Hyeon Lee */ +@ConfigurationProperties("spring.cloud.gateway.server.webflux.cookies") class CookiesKeyValueGenerator implements KeyValueGenerator { private final String valueSeparator; + private boolean enabled = true; + CookiesKeyValueGenerator(String valueSeparator) { this.valueSeparator = Objects.requireNonNull(valueSeparator); } @@ -51,4 +56,14 @@ public String getKeyValue(ServerHttpRequest request) { return cookiesData; } + @Override + public boolean isEnabled() { + return this.enabled; + } + + @Override + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + } 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 fa279b2bc1..73e2bcc137 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 @@ -20,6 +20,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.http.HttpHeaders; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.util.StringUtils; @@ -27,13 +28,17 @@ /** * @author Marta Medio * @author Ignacio Lozano + * @author Dong Hyeon Lee */ +@ConfigurationProperties("spring.cloud.gateway.server.webflux.header") class HeaderKeyValueGenerator implements KeyValueGenerator { private final String header; private final String valueSeparator; + private boolean enabled = true; + HeaderKeyValueGenerator(String header, String valueSeparator) { this.valueSeparator = valueSeparator; if (!StringUtils.hasText(header)) { @@ -60,4 +65,13 @@ private Stream getHeaderValues(HttpHeaders headers) { return value == null ? Stream.empty() : value.stream(); } + @Override + public boolean isEnabled() { + return this.enabled; + } + + @Override + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/KeyValueGenerator.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/KeyValueGenerator.java index a0665e9d7d..4a38bf9049 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/KeyValueGenerator.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/KeyValueGenerator.java @@ -23,6 +23,7 @@ * * @author Marta Medio * @author Ignacio Lozano + * @author Dong Hyeon Lee */ interface KeyValueGenerator { @@ -39,4 +40,8 @@ default String apply(ServerHttpRequest request) { String getKeyValue(ServerHttpRequest request); + boolean isEnabled(); + + void setEnabled(boolean enabled); + } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/UriKeyValueGenerator.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/UriKeyValueGenerator.java index a30f15ee3c..0e7638c214 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/UriKeyValueGenerator.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/UriKeyValueGenerator.java @@ -16,6 +16,7 @@ package org.springframework.cloud.gateway.filter.factory.cache.keygenerator; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.http.server.reactive.ServerHttpRequest; /** @@ -23,12 +24,25 @@ * * @author Marta Medio * @author Ignacio Lozano + * @author Dong Hyeon Lee */ +@ConfigurationProperties("spring.cloud.gateway.server.webflux.uri") public class UriKeyValueGenerator implements KeyValueGenerator { + private boolean enabled = true; + @Override public String getKeyValue(ServerHttpRequest request) { return request.getURI().toString(); } + @Override + public boolean isEnabled() { + return this.enabled; + } + + @Override + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } } 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 ce507d4003..1af1435681 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 @@ -18,6 +18,7 @@ import java.util.stream.Collectors; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.HttpCookie; @@ -29,9 +30,16 @@ /** * @author Ignacio Lozano + * @author Dong Hyeon Lee */ class DefaultKeyValueGeneratorTests { + @BeforeEach + void enableAllGenerators() { + CacheKeyGenerator.DEFAULT_KEY_VALUE_GENERATORS + .forEach(generator -> generator.setEnabled(true)); + } + @Test void uriAuthorizationAndCookiesArePresent() { String uri = "http://myuri"; @@ -72,10 +80,35 @@ void onlyUriPresent() { assertThat(result).isEqualTo(uri + ";" + "" + ";" + ""); } + @Test + void isEnabledFalse(){ + String uri = "http://myuri"; + HttpHeaders headers = new HttpHeaders(); + String authorization = "my-auth"; + headers.set("Authorization", authorization); + String cookieName = "my-cookie"; + String cookieValue = "cookie-value"; + HttpCookie cookie = new HttpCookie(cookieName, cookieValue); + MockServerHttpRequest request = MockServerHttpRequest.get(uri).cookie(cookie).headers(headers).build(); + + String result = applyDisabled(request); + + assertThat(result).isEqualTo(""); + } + public String apply(ServerHttpRequest request) { return CacheKeyGenerator.DEFAULT_KEY_VALUE_GENERATORS.stream() + .filter(KeyValueGenerator::isEnabled) .map(generator -> generator.apply(request)) .collect(Collectors.joining(CacheKeyGenerator.KEY_SEPARATOR)); } + public String applyDisabled(ServerHttpRequest request) { + return CacheKeyGenerator.DEFAULT_KEY_VALUE_GENERATORS.stream() + .peek(generator -> generator.setEnabled(false)) + .filter(KeyValueGenerator::isEnabled) + .map(generator -> generator.apply(request)) + .collect(Collectors.joining(CacheKeyGenerator.KEY_SEPARATOR)); + } + } From ef098fb459be18fa28367c29f72163f93b6c2dfd Mon Sep 17 00:00:00 2001 From: rodom_macbook Date: Mon, 2 Jun 2025 21:12:39 +0900 Subject: [PATCH 2/2] feat: register KeyValueGenerator as a Spring bean --- .../LocalResponseCacheAutoConfiguration.java | 27 +++++++++++++-- .../cache/LocalResponseCacheProperties.java | 33 ++++++++++++++++++- .../cache/keygenerator/CacheKeyGenerator.java | 22 +++++++------ .../CookiesKeyValueGenerator.java | 8 ++--- .../keygenerator/HeaderKeyValueGenerator.java | 7 ++-- .../cache/keygenerator/KeyValueGenerator.java | 2 +- .../keygenerator/UriKeyValueGenerator.java | 6 ++-- .../factory/cache/CacheKeyGeneratorTest.java | 9 ++++- .../DefaultKeyValueGeneratorTests.java | 13 ++++---- .../HeaderKeyValueGeneratorTest.java | 8 ++--- 10 files changed, 98 insertions(+), 37 deletions(-) diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/LocalResponseCacheAutoConfiguration.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/LocalResponseCacheAutoConfiguration.java index 71e2641cb4..429f3c21a1 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/LocalResponseCacheAutoConfiguration.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/LocalResponseCacheAutoConfiguration.java @@ -16,6 +16,8 @@ package org.springframework.cloud.gateway.config; +import java.util.List; + import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.Weigher; import org.apache.commons.logging.Log; @@ -36,6 +38,10 @@ import org.springframework.cloud.gateway.filter.factory.cache.LocalResponseCacheUtils; import org.springframework.cloud.gateway.filter.factory.cache.ResponseCacheManagerFactory; import org.springframework.cloud.gateway.filter.factory.cache.keygenerator.CacheKeyGenerator; +import org.springframework.cloud.gateway.filter.factory.cache.keygenerator.CookiesKeyValueGenerator; +import org.springframework.cloud.gateway.filter.factory.cache.keygenerator.HeaderKeyValueGenerator; +import org.springframework.cloud.gateway.filter.factory.cache.keygenerator.KeyValueGenerator; +import org.springframework.cloud.gateway.filter.factory.cache.keygenerator.UriKeyValueGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; @@ -85,8 +91,25 @@ public ResponseCacheManagerFactory responseCacheManagerFactory(CacheKeyGenerator } @Bean - public CacheKeyGenerator cacheKeyGenerator() { - return new CacheKeyGenerator(); + public UriKeyValueGenerator uriKeyValueGenerator(LocalResponseCacheProperties cacheProperties) { + return new UriKeyValueGenerator(cacheProperties.getEnableUriKeyGenerator()); + } + + @Bean + public HeaderKeyValueGenerator headerKeyValueGenerator(LocalResponseCacheProperties cacheProperties) { + return new HeaderKeyValueGenerator(cacheProperties.getEnableHeaderKeyGenerator(), "Authorization", ";"); + } + + @Bean + public CookiesKeyValueGenerator cookiesKeyValueGenerator(LocalResponseCacheProperties cacheProperties) { + return new CookiesKeyValueGenerator(cacheProperties.getEnableCookiesKeyGenerator(), ";"); + } + + @Bean + public CacheKeyGenerator cacheKeyGenerator(UriKeyValueGenerator uriGenerator, + HeaderKeyValueGenerator headerGenerator, CookiesKeyValueGenerator cookiesGenerator) { + List defaultGenerators = List.of(uriGenerator, headerGenerator, cookiesGenerator); + return new CacheKeyGenerator(defaultGenerators); } /** diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheProperties.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheProperties.java index 56e026e46d..ae96d372ef 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheProperties.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/LocalResponseCacheProperties.java @@ -42,6 +42,12 @@ public class LocalResponseCacheProperties { private RequestOptions request = new RequestOptions(); + private boolean enableCookiesKeyGenerator = true; + + private boolean enableHeaderKeyGenerator = true; + + private boolean enableUriKeyGenerator = true; + public DataSize getSize() { return size; } @@ -74,10 +80,35 @@ public void setRequest(RequestOptions request) { this.request = request; } + public boolean getEnableCookiesKeyGenerator() { + return enableCookiesKeyGenerator; + } + + public void setEnableCookiesKeyGenerator(boolean enableCookiesKeyGenerator) { + this.enableCookiesKeyGenerator = enableCookiesKeyGenerator; + } + + public boolean getEnableHeaderKeyGenerator() { + return enableHeaderKeyGenerator; + } + + public void setEnableHeaderKeyGenerator(boolean enableHeaderKeyGenerator) { + this.enableHeaderKeyGenerator = enableHeaderKeyGenerator; + } + + public boolean getEnableUriKeyGenerator() { + return enableUriKeyGenerator; + } + + public void setEnableUriKeyGenerator(boolean enableUriKeyGenerator) { + this.enableUriKeyGenerator = enableUriKeyGenerator; + } + @Override public String toString() { return "LocalResponseCacheProperties{" + "size=" + size + ", timeToLive=" + timeToLive + ", request=" + request - + '}'; + + ", enableCookiesKeyGenerator=" + enableCookiesKeyGenerator + ", enableHeaderKeyGenerator=" + + enableHeaderKeyGenerator + ", enableUriKeyGenerator=" + enableUriKeyGenerator + '}'; } public static class RequestOptions { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/CacheKeyGenerator.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/CacheKeyGenerator.java index 51b3a1fc3b..66b794285e 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/CacheKeyGenerator.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/CacheKeyGenerator.java @@ -25,7 +25,6 @@ import java.util.List; import java.util.stream.Stream; -import org.springframework.http.HttpHeaders; import org.springframework.http.server.reactive.ServerHttpRequest; /** @@ -42,11 +41,11 @@ public class CacheKeyGenerator { private final ThreadLocal messageDigest; - /* for testing */ static final List DEFAULT_KEY_VALUE_GENERATORS = List.of( - new UriKeyValueGenerator(), new HeaderKeyValueGenerator(HttpHeaders.AUTHORIZATION, KEY_SEPARATOR), - new CookiesKeyValueGenerator(KEY_SEPARATOR)); + /* for testing */ static List DEFAULT_KEY_VALUE_GENERATORS; + + public CacheKeyGenerator(List keyValueGeneratorList) { + DEFAULT_KEY_VALUE_GENERATORS = keyValueGeneratorList; - public CacheKeyGenerator() { messageDigest = ThreadLocal.withInitial(() -> { try { return MessageDigest.getInstance("MD5"); @@ -74,17 +73,20 @@ public String generateKey(ServerHttpRequest request, List varyHeaders) { private Stream getKeyValueGenerators(List varyHeaders) { return Stream.concat(DEFAULT_KEY_VALUE_GENERATORS.stream(), - varyHeaders.stream().sorted().map(header -> new HeaderKeyValueGenerator(header, ","))); + varyHeaders.stream().sorted().map(header -> new HeaderKeyValueGenerator(true, header, ","))); } private byte[] generateRawKey(ServerHttpRequest request, List varyHeaders) { Stream keyValueGenerators = getKeyValueGenerators(varyHeaders); final ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream(); - keyValueGenerators.filter(KeyValueGenerator::isEnabled).map(generator -> generator.apply(request)).map(String::getBytes).forEach(bytes -> { - byteOutputStream.writeBytes(bytes); - byteOutputStream.writeBytes(KEY_SEPARATOR_BYTES); - }); + keyValueGenerators.filter(KeyValueGenerator::isEnabled) + .map(generator -> generator.apply(request)) + .map(String::getBytes) + .forEach(bytes -> { + byteOutputStream.writeBytes(bytes); + byteOutputStream.writeBytes(KEY_SEPARATOR_BYTES); + }); return byteOutputStream.toByteArray(); } 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 301de416af..f9d46bb996 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 @@ -20,7 +20,6 @@ import java.util.Objects; import java.util.stream.Collectors; -import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.http.HttpCookie; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.util.CollectionUtils; @@ -31,14 +30,14 @@ * @author Ignacio Lozano * @author Dong Hyeon Lee */ -@ConfigurationProperties("spring.cloud.gateway.server.webflux.cookies") -class CookiesKeyValueGenerator implements KeyValueGenerator { +public class CookiesKeyValueGenerator implements KeyValueGenerator { private final String valueSeparator; private boolean enabled = true; - CookiesKeyValueGenerator(String valueSeparator) { + public CookiesKeyValueGenerator(boolean enabled, String valueSeparator) { + this.enabled = enabled; this.valueSeparator = Objects.requireNonNull(valueSeparator); } @@ -65,5 +64,4 @@ public boolean isEnabled() { public void setEnabled(boolean enabled) { this.enabled = enabled; } - } 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 73e2bcc137..108f1bc809 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 @@ -20,7 +20,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.http.HttpHeaders; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.util.StringUtils; @@ -30,8 +29,7 @@ * @author Ignacio Lozano * @author Dong Hyeon Lee */ -@ConfigurationProperties("spring.cloud.gateway.server.webflux.header") -class HeaderKeyValueGenerator implements KeyValueGenerator { +public class HeaderKeyValueGenerator implements KeyValueGenerator { private final String header; @@ -39,7 +37,8 @@ class HeaderKeyValueGenerator implements KeyValueGenerator { private boolean enabled = true; - HeaderKeyValueGenerator(String header, String valueSeparator) { + public HeaderKeyValueGenerator(boolean enabled, String header, String valueSeparator) { + this.enabled = enabled; this.valueSeparator = valueSeparator; if (!StringUtils.hasText(header)) { throw new IllegalArgumentException("The parameter cannot be empty or null"); diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/KeyValueGenerator.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/KeyValueGenerator.java index 4a38bf9049..cfd75003e5 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/KeyValueGenerator.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/KeyValueGenerator.java @@ -25,7 +25,7 @@ * @author Ignacio Lozano * @author Dong Hyeon Lee */ -interface KeyValueGenerator { +public interface KeyValueGenerator { /* * Calls getKeyValue() and guards against null. diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/UriKeyValueGenerator.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/UriKeyValueGenerator.java index 0e7638c214..38c3504f7c 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/UriKeyValueGenerator.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/cache/keygenerator/UriKeyValueGenerator.java @@ -16,7 +16,6 @@ package org.springframework.cloud.gateway.filter.factory.cache.keygenerator; -import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.http.server.reactive.ServerHttpRequest; /** @@ -26,11 +25,14 @@ * @author Ignacio Lozano * @author Dong Hyeon Lee */ -@ConfigurationProperties("spring.cloud.gateway.server.webflux.uri") public class UriKeyValueGenerator implements KeyValueGenerator { private boolean enabled = true; + public UriKeyValueGenerator(boolean enabled) { + this.enabled = enabled; + } + @Override public String getKeyValue(ServerHttpRequest request) { return request.getURI().toString(); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/CacheKeyGeneratorTest.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/CacheKeyGeneratorTest.java index 260b93a0bb..032a97fb9f 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/CacheKeyGeneratorTest.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/cache/CacheKeyGeneratorTest.java @@ -25,6 +25,10 @@ import org.junit.jupiter.api.Test; import org.springframework.cloud.gateway.filter.factory.cache.keygenerator.CacheKeyGenerator; +import org.springframework.cloud.gateway.filter.factory.cache.keygenerator.CookiesKeyValueGenerator; +import org.springframework.cloud.gateway.filter.factory.cache.keygenerator.HeaderKeyValueGenerator; +import org.springframework.cloud.gateway.filter.factory.cache.keygenerator.KeyValueGenerator; +import org.springframework.cloud.gateway.filter.factory.cache.keygenerator.UriKeyValueGenerator; import org.springframework.http.HttpCookie; import org.springframework.http.HttpHeaders; import org.springframework.mock.http.server.reactive.MockServerHttpRequest; @@ -38,7 +42,10 @@ */ class CacheKeyGeneratorTest { - final CacheKeyGenerator cacheKeyGenerator = new CacheKeyGenerator(); + List defaultGenerators = List.of(new UriKeyValueGenerator(true), + new HeaderKeyValueGenerator(true, "Authorization", ";"), new CookiesKeyValueGenerator(true, ";")); + + final CacheKeyGenerator cacheKeyGenerator = new CacheKeyGenerator(defaultGenerators); @Test public void shouldGenerateSameKeyForSameUri() { 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 1af1435681..f716303de0 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 @@ -36,8 +36,7 @@ class DefaultKeyValueGeneratorTests { @BeforeEach void enableAllGenerators() { - CacheKeyGenerator.DEFAULT_KEY_VALUE_GENERATORS - .forEach(generator -> generator.setEnabled(true)); + CacheKeyGenerator.DEFAULT_KEY_VALUE_GENERATORS.forEach(generator -> generator.setEnabled(true)); } @Test @@ -81,7 +80,7 @@ void onlyUriPresent() { } @Test - void isEnabledFalse(){ + void isEnabledFalse() { String uri = "http://myuri"; HttpHeaders headers = new HttpHeaders(); String authorization = "my-auth"; @@ -105,10 +104,10 @@ public String apply(ServerHttpRequest request) { public String applyDisabled(ServerHttpRequest request) { return CacheKeyGenerator.DEFAULT_KEY_VALUE_GENERATORS.stream() - .peek(generator -> generator.setEnabled(false)) - .filter(KeyValueGenerator::isEnabled) - .map(generator -> generator.apply(request)) - .collect(Collectors.joining(CacheKeyGenerator.KEY_SEPARATOR)); + .peek(generator -> generator.setEnabled(false)) + .filter(KeyValueGenerator::isEnabled) + .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 b1b4dab8cc..1a0ea49969 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(true, null, SEPARATOR)); } @Test @@ -53,7 +53,7 @@ void keyValuePatternIsGenerated_whenOneSingleValueHeaderIsFound() { headers.set(HEADER_NAME, SINGLE_HEADER_VALUE); MockServerHttpRequest request = MockServerHttpRequest.get("http://this").headers(headers).build(); - String result = new HeaderKeyValueGenerator(HEADER_NAME, SEPARATOR).apply(request); + String result = new HeaderKeyValueGenerator(true, HEADER_NAME, SEPARATOR).apply(request); assertThat(result).isEqualTo(HEADER_NAME + "=" + SINGLE_HEADER_VALUE); } @@ -64,7 +64,7 @@ void keyValuePatternIsGenerated_whenOneMultipleValueHeaderIsFound() { headers.put(HEADER_NAME, List.of(VALUE1, VALUE2)); MockServerHttpRequest request = MockServerHttpRequest.get("http://this").headers(headers).build(); - String result = new HeaderKeyValueGenerator(HEADER_NAME, SEPARATOR).apply(request); + String result = new HeaderKeyValueGenerator(true, HEADER_NAME, SEPARATOR).apply(request); assertThat(result).isEqualTo(HEADER_NAME + "=" + VALUE1 + SEPARATOR + VALUE2); } @@ -75,7 +75,7 @@ void sotedKeyValuePatternIsGenerated_whenOneMultipleUnsortedValueHeaderIsFound() headers.put(HEADER_NAME, List.of(VALUE2, VALUE1)); MockServerHttpRequest request = MockServerHttpRequest.get("http://this").headers(headers).build(); - String result = new HeaderKeyValueGenerator(HEADER_NAME, SEPARATOR).apply(request); + String result = new HeaderKeyValueGenerator(true, HEADER_NAME, SEPARATOR).apply(request); assertThat(result).isEqualTo(HEADER_NAME + "=" + VALUE1 + SEPARATOR + VALUE2); }