From d1a7fed16caab93396103b055bb1b80d6f19cbd4 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Thu, 14 Jan 2021 14:30:07 +0100 Subject: [PATCH] Clean up content type in ContentNegotiatingViewResolver This commit removes the quality value of the selected media type before setting it in the request attribute. Closes gh-26315 --- .../view/ContentNegotiatingViewResolver.java | 1 + .../ContentNegotiatingViewResolverTests.java | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java index 7e0b3b8564..2d61e8a191 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java @@ -344,6 +344,7 @@ public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport if (StringUtils.hasText(candidateView.getContentType())) { MediaType candidateContentType = MediaType.parseMediaType(candidateView.getContentType()); if (mediaType.isCompatibleWith(candidateContentType)) { + mediaType = mediaType.removeQualityValue(); if (logger.isDebugEnabled()) { logger.debug("Selected '" + mediaType + "' given " + requestedMediaTypes); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolverTests.java index deef4171d2..ec619d54aa 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolverTests.java @@ -500,4 +500,26 @@ public class ContentNegotiatingViewResolverTests { assertThat(result).as("Invalid view").isNotNull(); } + @Test + public void resolveQualityValue() throws Exception { + request.addHeader("Accept", "text/html;q=0.9"); + + ViewResolver viewResolverMock = mock(ViewResolver.class); + viewResolver.setViewResolvers(Collections.singletonList(viewResolverMock)); + + viewResolver.afterPropertiesSet(); + + View viewMock = mock(View.class, "text_html"); + + String viewName = "view"; + Locale locale = Locale.ENGLISH; + + given(viewResolverMock.resolveViewName(viewName, locale)).willReturn(viewMock); + given(viewMock.getContentType()).willReturn("text/html"); + + viewResolver.resolveViewName(viewName, locale); + + assertThat(request.getAttribute(View.SELECTED_CONTENT_TYPE)).isEqualTo(MediaType.TEXT_HTML); + } + }