Browse Source

Correctly apply required API version validation

Closes gh-35386
pull/35393/head
rstoyanchev 4 months ago
parent
commit
a7e3a438c9
  1. 11
      spring-web/src/main/java/org/springframework/web/accept/ApiVersionStrategy.java
  2. 9
      spring-web/src/test/java/org/springframework/web/accept/DefaultApiVersionStrategiesTests.java
  3. 11
      spring-webflux/src/main/java/org/springframework/web/reactive/accept/ApiVersionStrategy.java
  4. 9
      spring-webflux/src/test/java/org/springframework/web/reactive/accept/DefaultApiVersionStrategiesTests.java

11
spring-web/src/main/java/org/springframework/web/accept/ApiVersionStrategy.java

@ -70,18 +70,21 @@ public interface ApiVersionStrategy {
*/ */
default @Nullable Comparable<?> resolveParseAndValidateVersion(HttpServletRequest request) { default @Nullable Comparable<?> resolveParseAndValidateVersion(HttpServletRequest request) {
String value = resolveVersion(request); String value = resolveVersion(request);
Comparable<?> version;
if (value == null) { if (value == null) {
return getDefaultVersion(); version = getDefaultVersion();
} }
else {
try { try {
Comparable<?> version = parseVersion(value); version = parseVersion(value);
validateVersion(version, request);
return version;
} }
catch (Exception ex) { catch (Exception ex) {
throw new InvalidApiVersionException(value, null, ex); throw new InvalidApiVersionException(value, null, ex);
} }
} }
validateVersion(version, request);
return version;
}
/** /**
* Check if the requested API version is deprecated, and if so handle it * Check if the requested API version is deprecated, and if so handle it

9
spring-web/src/test/java/org/springframework/web/accept/DefaultApiVersionStrategiesTests.java

@ -35,8 +35,6 @@ public class DefaultApiVersionStrategiesTests {
private static final SemanticApiVersionParser parser = new SemanticApiVersionParser(); private static final SemanticApiVersionParser parser = new SemanticApiVersionParser();
private final MockHttpServletRequest request = new MockHttpServletRequest();
@Test @Test
void defaultVersionIsParsed() { void defaultVersionIsParsed() {
@ -113,8 +111,11 @@ public class DefaultApiVersionStrategiesTests {
} }
private void validateVersion(@Nullable String version, DefaultApiVersionStrategy strategy) { private void validateVersion(@Nullable String version, DefaultApiVersionStrategy strategy) {
Comparable<?> parsedVersion = (version != null ? parser.parseVersion(version) : null); MockHttpServletRequest request = new MockHttpServletRequest();
strategy.validateVersion(parsedVersion, request); if (version != null) {
request.setParameter("api-version", version);
}
strategy.resolveParseAndValidateVersion(request);
} }
} }

11
spring-webflux/src/main/java/org/springframework/web/reactive/accept/ApiVersionStrategy.java

@ -72,18 +72,21 @@ public interface ApiVersionStrategy {
*/ */
default @Nullable Comparable<?> resolveParseAndValidateVersion(ServerWebExchange exchange) { default @Nullable Comparable<?> resolveParseAndValidateVersion(ServerWebExchange exchange) {
String value = resolveVersion(exchange); String value = resolveVersion(exchange);
Comparable<?> version;
if (value == null) { if (value == null) {
return getDefaultVersion(); version = getDefaultVersion();
} }
else {
try { try {
Comparable<?> version = parseVersion(value); version = parseVersion(value);
validateVersion(version, exchange);
return version;
} }
catch (Exception ex) { catch (Exception ex) {
throw new InvalidApiVersionException(value, null, ex); throw new InvalidApiVersionException(value, null, ex);
} }
} }
validateVersion(version, exchange);
return version;
}
/** /**
* Check if the requested API version is deprecated, and if so handle it * Check if the requested API version is deprecated, and if so handle it

9
spring-webflux/src/test/java/org/springframework/web/reactive/accept/DefaultApiVersionStrategiesTests.java

@ -25,7 +25,6 @@ import org.junit.jupiter.api.Test;
import org.springframework.web.accept.InvalidApiVersionException; import org.springframework.web.accept.InvalidApiVersionException;
import org.springframework.web.accept.MissingApiVersionException; import org.springframework.web.accept.MissingApiVersionException;
import org.springframework.web.accept.SemanticApiVersionParser; import org.springframework.web.accept.SemanticApiVersionParser;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest; import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest;
import org.springframework.web.testfixture.server.MockServerWebExchange; import org.springframework.web.testfixture.server.MockServerWebExchange;
@ -40,8 +39,6 @@ public class DefaultApiVersionStrategiesTests {
private static final SemanticApiVersionParser parser = new SemanticApiVersionParser(); private static final SemanticApiVersionParser parser = new SemanticApiVersionParser();
private final ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/"));
@Test @Test
void defaultVersionIsParsed() { void defaultVersionIsParsed() {
@ -114,8 +111,12 @@ public class DefaultApiVersionStrategiesTests {
} }
private void validateVersion(@Nullable String version, DefaultApiVersionStrategy strategy) { private void validateVersion(@Nullable String version, DefaultApiVersionStrategy strategy) {
MockServerHttpRequest.BaseBuilder<?> requestBuilder = MockServerHttpRequest.get("/");
if (version != null) {
requestBuilder.queryParam("api-version", version);
}
Comparable<?> parsedVersion = (version != null ? parser.parseVersion(version) : null); Comparable<?> parsedVersion = (version != null ? parser.parseVersion(version) : null);
strategy.validateVersion(parsedVersion, exchange); strategy.resolveParseAndValidateVersion(MockServerWebExchange.builder(requestBuilder).build());
} }
} }

Loading…
Cancel
Save