From 95690f732733aaa1a316e070afd72f7bb30f3d3b Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 6 Sep 2023 14:23:27 +0200 Subject: [PATCH] Fall back to all media types if encountering invalid Accept header A warn log message is printed, and if log level is set to debug, the exception stacktrace is logged, too. Closes gh-37455 --- .../web/servlet/WelcomePageHandlerMapping.java | 10 +++++++++- .../servlet/WelcomePageHandlerMappingTests.java | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageHandlerMapping.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageHandlerMapping.java index 8872c5f8a4..ce73a7ec7c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageHandlerMapping.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageHandlerMapping.java @@ -29,6 +29,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.core.io.Resource; import org.springframework.core.log.LogMessage; import org.springframework.http.HttpHeaders; +import org.springframework.http.InvalidMediaTypeException; import org.springframework.http.MediaType; import org.springframework.util.StringUtils; import org.springframework.web.servlet.handler.AbstractUrlHandlerMapping; @@ -41,6 +42,7 @@ import org.springframework.web.servlet.mvc.ParameterizableViewController; * * @author Andy Wilkinson * @author Bruce Brouwer + * @author Moritz Halbritter * @see WelcomePageNotAcceptableHandlerMapping */ final class WelcomePageHandlerMapping extends AbstractUrlHandlerMapping { @@ -80,7 +82,13 @@ final class WelcomePageHandlerMapping extends AbstractUrlHandlerMapping { private List getAcceptedMediaTypes(HttpServletRequest request) { String acceptHeader = request.getHeader(HttpHeaders.ACCEPT); if (StringUtils.hasText(acceptHeader)) { - return MediaType.parseMediaTypes(acceptHeader); + try { + return MediaType.parseMediaTypes(acceptHeader); + } + catch (InvalidMediaTypeException ex) { + logger.warn("Received invalid Accept header. Assuming all media types are accepted", + logger.isDebugEnabled() ? ex : null); + } } return MEDIA_TYPES_ALL; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageHandlerMappingTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageHandlerMappingTests.java index f5c249e6a8..af0e3cbf3e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageHandlerMappingTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageHandlerMappingTests.java @@ -23,6 +23,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Value; @@ -31,6 +32,8 @@ import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoCon import org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider; import org.springframework.boot.autoconfigure.template.TemplateAvailabilityProviders; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; +import org.springframework.boot.test.system.CapturedOutput; +import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -54,7 +57,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. * Tests for {@link WelcomePageHandlerMapping}. * * @author Andy Wilkinson + * @author Moritz Halbritter */ +@ExtendWith(OutputCaptureExtension.class) class WelcomePageHandlerMappingTests { private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner() @@ -164,6 +169,17 @@ class WelcomePageHandlerMappingTests { }); } + @Test + void logsInvalidAcceptHeader(CapturedOutput output) { + this.contextRunner.withUserConfiguration(TemplateConfiguration.class).run((context) -> { + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); + mockMvc.perform(get("/").accept("*/*q=0.8")) + .andExpect(status().isOk()) + .andExpect(content().string("index template")); + }); + assertThat(output).contains("Received invalid Accept header. Assuming all media types are accepted"); + } + @Configuration(proxyBeanMethods = false) static class HandlerMappingConfiguration {