Skip to content

Commit b5327ef

Browse files
committed
Fix regression in ProducesRequestCondition
Closes gh-22853
1 parent a8f845c commit b5327ef

File tree

4 files changed

+52
-10
lines changed

4 files changed

+52
-10
lines changed

spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/ProducesRequestCondition.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,9 +185,12 @@ public ProducesRequestCondition combine(ProducesRequestCondition other) {
185185
@Override
186186
@Nullable
187187
public ProducesRequestCondition getMatchingCondition(ServerWebExchange exchange) {
188-
if (isEmpty() || CorsUtils.isPreFlightRequest(exchange.getRequest())) {
188+
if (CorsUtils.isPreFlightRequest(exchange.getRequest())) {
189189
return EMPTY_CONDITION;
190190
}
191+
if (isEmpty()) {
192+
return this;
193+
}
191194
Set<ProduceMediaTypeExpression> result = new LinkedHashSet<>(this.expressions);
192195
result.removeIf(expression -> !expression.match(exchange));
193196
if (!result.isEmpty()) {

spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/ProducesRequestConditionTests.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,14 @@
2121

2222
import org.junit.Test;
2323

24+
import org.springframework.http.MediaType;
2425
import org.springframework.mock.web.test.server.MockServerWebExchange;
26+
import org.springframework.web.reactive.accept.RequestedContentTypeResolver;
27+
import org.springframework.web.reactive.accept.RequestedContentTypeResolverBuilder;
2528
import org.springframework.web.server.ServerWebExchange;
2629

27-
import static org.junit.Assert.assertEquals;
28-
import static org.junit.Assert.assertNotNull;
29-
import static org.junit.Assert.assertNull;
30-
import static org.junit.Assert.assertTrue;
31-
import static org.junit.Assert.fail;
32-
import static org.springframework.mock.http.server.reactive.test.MockServerHttpRequest.get;
30+
import static org.junit.Assert.*;
31+
import static org.springframework.mock.http.server.reactive.test.MockServerHttpRequest.*;
3332

3433
/**
3534
* Unit tests for {@link ProducesRequestCondition}.
@@ -110,6 +109,23 @@ public void matchWithNegationAndMediaTypeAllWithQualityParameter() {
110109
assertNotNull(condition.getMatchingCondition(exchange));
111110
}
112111

112+
@Test // gh-22853
113+
public void matchAndCompare() {
114+
RequestedContentTypeResolverBuilder builder = new RequestedContentTypeResolverBuilder();
115+
builder.headerResolver();
116+
builder.fixedResolver(MediaType.TEXT_HTML);
117+
RequestedContentTypeResolver resolver = builder.build();
118+
119+
ProducesRequestCondition none = new ProducesRequestCondition(new String[0], null, resolver);
120+
ProducesRequestCondition html = new ProducesRequestCondition(new String[] {"text/html"}, null, resolver);
121+
122+
MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "*/*"));
123+
124+
ProducesRequestCondition noneMatch = none.getMatchingCondition(exchange);
125+
ProducesRequestCondition htmlMatch = html.getMatchingCondition(exchange);
126+
127+
assertEquals(1, noneMatch.compareTo(htmlMatch, exchange));
128+
}
113129

114130
@Test
115131
public void compareTo() {

spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/ProducesRequestCondition.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,18 +185,19 @@ public ProducesRequestCondition combine(ProducesRequestCondition other) {
185185
@Override
186186
@Nullable
187187
public ProducesRequestCondition getMatchingCondition(HttpServletRequest request) {
188-
if (isEmpty() || CorsUtils.isPreFlightRequest(request)) {
188+
if (CorsUtils.isPreFlightRequest(request)) {
189189
return EMPTY_CONDITION;
190190
}
191-
191+
if (isEmpty()) {
192+
return this;
193+
}
192194
List<MediaType> acceptedMediaTypes;
193195
try {
194196
acceptedMediaTypes = getAcceptedMediaTypes(request);
195197
}
196198
catch (HttpMediaTypeException ex) {
197199
return null;
198200
}
199-
200201
Set<ProduceMediaTypeExpression> result = new LinkedHashSet<>(this.expressions);
201202
result.removeIf(expression -> !expression.match(acceptedMediaTypes));
202203
if (!result.isEmpty()) {

spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/ProducesRequestConditionTests.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@
2121

2222
import org.junit.Test;
2323

24+
import org.springframework.http.MediaType;
2425
import org.springframework.mock.web.test.MockHttpServletRequest;
26+
import org.springframework.web.accept.ContentNegotiationManager;
27+
import org.springframework.web.accept.FixedContentNegotiationStrategy;
28+
import org.springframework.web.accept.HeaderContentNegotiationStrategy;
2529
import org.springframework.web.servlet.mvc.condition.ProducesRequestCondition.ProduceMediaTypeExpression;
2630

2731
import static org.junit.Assert.*;
@@ -139,6 +143,24 @@ public void matchWithNegationAndMediaTypeAllWithQualityParameter() {
139143
assertNotNull(condition.getMatchingCondition(request));
140144
}
141145

146+
@Test // gh-22853
147+
public void matchAndCompare() {
148+
ContentNegotiationManager manager = new ContentNegotiationManager(
149+
new HeaderContentNegotiationStrategy(),
150+
new FixedContentNegotiationStrategy(MediaType.TEXT_HTML));
151+
152+
ProducesRequestCondition none = new ProducesRequestCondition(new String[0], null, manager);
153+
ProducesRequestCondition html = new ProducesRequestCondition(new String[] {"text/html"}, null, manager);
154+
155+
MockHttpServletRequest request = new MockHttpServletRequest();
156+
request.addHeader("Accept", "*/*");
157+
158+
ProducesRequestCondition noneMatch = none.getMatchingCondition(request);
159+
ProducesRequestCondition htmlMatch = html.getMatchingCondition(request);
160+
161+
assertEquals(1, noneMatch.compareTo(htmlMatch, request));
162+
}
163+
142164
@Test
143165
public void compareTo() {
144166
ProducesRequestCondition html = new ProducesRequestCondition("text/html");

0 commit comments

Comments
 (0)