Skip to content

Commit a7e3a43

Browse files
committed
Correctly apply required API version validation
Closes gh-35386
1 parent 442a2d0 commit a7e3a43

File tree

4 files changed

+32
-24
lines changed

4 files changed

+32
-24
lines changed

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

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,17 +70,20 @@ void validateVersion(@Nullable Comparable<?> requestVersion, HttpServletRequest
7070
*/
7171
default @Nullable Comparable<?> resolveParseAndValidateVersion(HttpServletRequest request) {
7272
String value = resolveVersion(request);
73+
Comparable<?> version;
7374
if (value == null) {
74-
return getDefaultVersion();
75+
version = getDefaultVersion();
7576
}
76-
try {
77-
Comparable<?> version = parseVersion(value);
78-
validateVersion(version, request);
79-
return version;
80-
}
81-
catch (Exception ex) {
82-
throw new InvalidApiVersionException(value, null, ex);
77+
else {
78+
try {
79+
version = parseVersion(value);
80+
}
81+
catch (Exception ex) {
82+
throw new InvalidApiVersionException(value, null, ex);
83+
}
8384
}
85+
validateVersion(version, request);
86+
return version;
8487
}
8588

8689
/**

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@ public class DefaultApiVersionStrategiesTests {
3535

3636
private static final SemanticApiVersionParser parser = new SemanticApiVersionParser();
3737

38-
private final MockHttpServletRequest request = new MockHttpServletRequest();
39-
4038

4139
@Test
4240
void defaultVersionIsParsed() {
@@ -113,8 +111,11 @@ private static DefaultApiVersionStrategy apiVersionStrategy(
113111
}
114112

115113
private void validateVersion(@Nullable String version, DefaultApiVersionStrategy strategy) {
116-
Comparable<?> parsedVersion = (version != null ? parser.parseVersion(version) : null);
117-
strategy.validateVersion(parsedVersion, request);
114+
MockHttpServletRequest request = new MockHttpServletRequest();
115+
if (version != null) {
116+
request.setParameter("api-version", version);
117+
}
118+
strategy.resolveParseAndValidateVersion(request);
118119
}
119120

120121
}

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

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,17 +72,20 @@ void validateVersion(@Nullable Comparable<?> requestVersion, ServerWebExchange e
7272
*/
7373
default @Nullable Comparable<?> resolveParseAndValidateVersion(ServerWebExchange exchange) {
7474
String value = resolveVersion(exchange);
75+
Comparable<?> version;
7576
if (value == null) {
76-
return getDefaultVersion();
77+
version = getDefaultVersion();
7778
}
78-
try {
79-
Comparable<?> version = parseVersion(value);
80-
validateVersion(version, exchange);
81-
return version;
82-
}
83-
catch (Exception ex) {
84-
throw new InvalidApiVersionException(value, null, ex);
79+
else {
80+
try {
81+
version = parseVersion(value);
82+
}
83+
catch (Exception ex) {
84+
throw new InvalidApiVersionException(value, null, ex);
85+
}
8586
}
87+
validateVersion(version, exchange);
88+
return version;
8689
}
8790

8891
/**

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.springframework.web.accept.InvalidApiVersionException;
2626
import org.springframework.web.accept.MissingApiVersionException;
2727
import org.springframework.web.accept.SemanticApiVersionParser;
28-
import org.springframework.web.server.ServerWebExchange;
2928
import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest;
3029
import org.springframework.web.testfixture.server.MockServerWebExchange;
3130

@@ -40,8 +39,6 @@ public class DefaultApiVersionStrategiesTests {
4039

4140
private static final SemanticApiVersionParser parser = new SemanticApiVersionParser();
4241

43-
private final ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/"));
44-
4542

4643
@Test
4744
void defaultVersionIsParsed() {
@@ -114,8 +111,12 @@ private static DefaultApiVersionStrategy apiVersionStrategy(
114111
}
115112

116113
private void validateVersion(@Nullable String version, DefaultApiVersionStrategy strategy) {
114+
MockServerHttpRequest.BaseBuilder<?> requestBuilder = MockServerHttpRequest.get("/");
115+
if (version != null) {
116+
requestBuilder.queryParam("api-version", version);
117+
}
117118
Comparable<?> parsedVersion = (version != null ? parser.parseVersion(version) : null);
118-
strategy.validateVersion(parsedVersion, exchange);
119+
strategy.resolveParseAndValidateVersion(MockServerWebExchange.builder(requestBuilder).build());
119120
}
120121

121122
}

0 commit comments

Comments
 (0)