diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/ProducesRequestCondition.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/ProducesRequestCondition.java index fd8c00790d..a176fd9dcb 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/ProducesRequestCondition.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/ProducesRequestCondition.java @@ -185,9 +185,12 @@ public final class ProducesRequestCondition extends AbstractRequestCondition result = new LinkedHashSet<>(this.expressions); result.removeIf(expression -> !expression.match(exchange)); if (!result.isEmpty()) { diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/ProducesRequestConditionTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/ProducesRequestConditionTests.java index addc705829..3e6f222cd4 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/ProducesRequestConditionTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/ProducesRequestConditionTests.java @@ -21,15 +21,14 @@ import java.util.Collections; import org.junit.Test; +import org.springframework.http.MediaType; import org.springframework.mock.web.test.server.MockServerWebExchange; +import org.springframework.web.reactive.accept.RequestedContentTypeResolver; +import org.springframework.web.reactive.accept.RequestedContentTypeResolverBuilder; import org.springframework.web.server.ServerWebExchange; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.springframework.mock.http.server.reactive.test.MockServerHttpRequest.get; +import static org.junit.Assert.*; +import static org.springframework.mock.http.server.reactive.test.MockServerHttpRequest.*; /** * Unit tests for {@link ProducesRequestCondition}. @@ -110,6 +109,23 @@ public class ProducesRequestConditionTests { assertNotNull(condition.getMatchingCondition(exchange)); } + @Test // gh-22853 + public void matchAndCompare() { + RequestedContentTypeResolverBuilder builder = new RequestedContentTypeResolverBuilder(); + builder.headerResolver(); + builder.fixedResolver(MediaType.TEXT_HTML); + RequestedContentTypeResolver resolver = builder.build(); + + ProducesRequestCondition none = new ProducesRequestCondition(new String[0], null, resolver); + ProducesRequestCondition html = new ProducesRequestCondition(new String[] {"text/html"}, null, resolver); + + MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "*/*")); + + ProducesRequestCondition noneMatch = none.getMatchingCondition(exchange); + ProducesRequestCondition htmlMatch = html.getMatchingCondition(exchange); + + assertEquals(1, noneMatch.compareTo(htmlMatch, exchange)); + } @Test public void compareTo() { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/ProducesRequestCondition.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/ProducesRequestCondition.java index eb1a4c2075..33375cdb52 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/ProducesRequestCondition.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/ProducesRequestCondition.java @@ -185,10 +185,12 @@ public final class ProducesRequestCondition extends AbstractRequestCondition acceptedMediaTypes; try { acceptedMediaTypes = getAcceptedMediaTypes(request); @@ -196,7 +198,6 @@ public final class ProducesRequestCondition extends AbstractRequestCondition result = new LinkedHashSet<>(this.expressions); result.removeIf(expression -> !expression.match(acceptedMediaTypes)); if (!result.isEmpty()) { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/ProducesRequestConditionTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/ProducesRequestConditionTests.java index 6556fb7a49..1bcf0d9e41 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/ProducesRequestConditionTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/ProducesRequestConditionTests.java @@ -21,7 +21,11 @@ import java.util.Collections; import org.junit.Test; +import org.springframework.http.MediaType; import org.springframework.mock.web.test.MockHttpServletRequest; +import org.springframework.web.accept.ContentNegotiationManager; +import org.springframework.web.accept.FixedContentNegotiationStrategy; +import org.springframework.web.accept.HeaderContentNegotiationStrategy; import org.springframework.web.servlet.mvc.condition.ProducesRequestCondition.ProduceMediaTypeExpression; import static org.junit.Assert.*; @@ -139,6 +143,24 @@ public class ProducesRequestConditionTests { assertNotNull(condition.getMatchingCondition(request)); } + @Test // gh-22853 + public void matchAndCompare() { + ContentNegotiationManager manager = new ContentNegotiationManager( + new HeaderContentNegotiationStrategy(), + new FixedContentNegotiationStrategy(MediaType.TEXT_HTML)); + + ProducesRequestCondition none = new ProducesRequestCondition(new String[0], null, manager); + ProducesRequestCondition html = new ProducesRequestCondition(new String[] {"text/html"}, null, manager); + + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader("Accept", "*/*"); + + ProducesRequestCondition noneMatch = none.getMatchingCondition(request); + ProducesRequestCondition htmlMatch = html.getMatchingCondition(request); + + assertEquals(1, noneMatch.compareTo(htmlMatch, request)); + } + @Test public void compareTo() { ProducesRequestCondition html = new ProducesRequestCondition("text/html");