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 { @@ -70,18 +70,21 @@ public interface ApiVersionStrategy {
*/
default @Nullable Comparable<?> resolveParseAndValidateVersion(HttpServletRequest request) {
String value = resolveVersion(request);
Comparable<?> version;
if (value == null) {
return getDefaultVersion();
version = getDefaultVersion();
}
else {
try {
Comparable<?> version = parseVersion(value);
validateVersion(version, request);
return version;
version = parseVersion(value);
}
catch (Exception 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

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

@ -35,8 +35,6 @@ public class DefaultApiVersionStrategiesTests { @@ -35,8 +35,6 @@ public class DefaultApiVersionStrategiesTests {
private static final SemanticApiVersionParser parser = new SemanticApiVersionParser();
private final MockHttpServletRequest request = new MockHttpServletRequest();
@Test
void defaultVersionIsParsed() {
@ -113,8 +111,11 @@ public class DefaultApiVersionStrategiesTests { @@ -113,8 +111,11 @@ public class DefaultApiVersionStrategiesTests {
}
private void validateVersion(@Nullable String version, DefaultApiVersionStrategy strategy) {
Comparable<?> parsedVersion = (version != null ? parser.parseVersion(version) : null);
strategy.validateVersion(parsedVersion, request);
MockHttpServletRequest request = new MockHttpServletRequest();
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 { @@ -72,18 +72,21 @@ public interface ApiVersionStrategy {
*/
default @Nullable Comparable<?> resolveParseAndValidateVersion(ServerWebExchange exchange) {
String value = resolveVersion(exchange);
Comparable<?> version;
if (value == null) {
return getDefaultVersion();
version = getDefaultVersion();
}
else {
try {
Comparable<?> version = parseVersion(value);
validateVersion(version, exchange);
return version;
version = parseVersion(value);
}
catch (Exception 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

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

@ -25,7 +25,6 @@ import org.junit.jupiter.api.Test; @@ -25,7 +25,6 @@ import org.junit.jupiter.api.Test;
import org.springframework.web.accept.InvalidApiVersionException;
import org.springframework.web.accept.MissingApiVersionException;
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.server.MockServerWebExchange;
@ -40,8 +39,6 @@ public class DefaultApiVersionStrategiesTests { @@ -40,8 +39,6 @@ public class DefaultApiVersionStrategiesTests {
private static final SemanticApiVersionParser parser = new SemanticApiVersionParser();
private final ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/"));
@Test
void defaultVersionIsParsed() {
@ -114,8 +111,12 @@ public class DefaultApiVersionStrategiesTests { @@ -114,8 +111,12 @@ public class DefaultApiVersionStrategiesTests {
}
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);
strategy.validateVersion(parsedVersion, exchange);
strategy.resolveParseAndValidateVersion(MockServerWebExchange.builder(requestBuilder).build());
}
}

Loading…
Cancel
Save