Skip to content

Commit 95690f7

Browse files
committed
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
1 parent 1f527c3 commit 95690f7

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageHandlerMapping.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.springframework.core.io.Resource;
3030
import org.springframework.core.log.LogMessage;
3131
import org.springframework.http.HttpHeaders;
32+
import org.springframework.http.InvalidMediaTypeException;
3233
import org.springframework.http.MediaType;
3334
import org.springframework.util.StringUtils;
3435
import org.springframework.web.servlet.handler.AbstractUrlHandlerMapping;
@@ -41,6 +42,7 @@
4142
*
4243
* @author Andy Wilkinson
4344
* @author Bruce Brouwer
45+
* @author Moritz Halbritter
4446
* @see WelcomePageNotAcceptableHandlerMapping
4547
*/
4648
final class WelcomePageHandlerMapping extends AbstractUrlHandlerMapping {
@@ -80,7 +82,13 @@ private boolean isHtmlTextAccepted(HttpServletRequest request) {
8082
private List<MediaType> getAcceptedMediaTypes(HttpServletRequest request) {
8183
String acceptHeader = request.getHeader(HttpHeaders.ACCEPT);
8284
if (StringUtils.hasText(acceptHeader)) {
83-
return MediaType.parseMediaTypes(acceptHeader);
85+
try {
86+
return MediaType.parseMediaTypes(acceptHeader);
87+
}
88+
catch (InvalidMediaTypeException ex) {
89+
logger.warn("Received invalid Accept header. Assuming all media types are accepted",
90+
logger.isDebugEnabled() ? ex : null);
91+
}
8492
}
8593
return MEDIA_TYPES_ALL;
8694
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageHandlerMappingTests.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import javax.servlet.http.HttpServletResponse;
2424

2525
import org.junit.jupiter.api.Test;
26+
import org.junit.jupiter.api.extension.ExtendWith;
2627

2728
import org.springframework.beans.factory.ObjectProvider;
2829
import org.springframework.beans.factory.annotation.Value;
@@ -31,6 +32,8 @@
3132
import org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider;
3233
import org.springframework.boot.autoconfigure.template.TemplateAvailabilityProviders;
3334
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
35+
import org.springframework.boot.test.system.CapturedOutput;
36+
import org.springframework.boot.test.system.OutputCaptureExtension;
3437
import org.springframework.context.ApplicationContext;
3538
import org.springframework.context.annotation.Bean;
3639
import org.springframework.context.annotation.Configuration;
@@ -54,7 +57,9 @@
5457
* Tests for {@link WelcomePageHandlerMapping}.
5558
*
5659
* @author Andy Wilkinson
60+
* @author Moritz Halbritter
5761
*/
62+
@ExtendWith(OutputCaptureExtension.class)
5863
class WelcomePageHandlerMappingTests {
5964

6065
private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner()
@@ -164,6 +169,17 @@ void prefersAStaticResourceToATemplate() {
164169
});
165170
}
166171

172+
@Test
173+
void logsInvalidAcceptHeader(CapturedOutput output) {
174+
this.contextRunner.withUserConfiguration(TemplateConfiguration.class).run((context) -> {
175+
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
176+
mockMvc.perform(get("/").accept("*/*q=0.8"))
177+
.andExpect(status().isOk())
178+
.andExpect(content().string("index template"));
179+
});
180+
assertThat(output).contains("Received invalid Accept header. Assuming all media types are accepted");
181+
}
182+
167183
@Configuration(proxyBeanMethods = false)
168184
static class HandlerMappingConfiguration {
169185

0 commit comments

Comments
 (0)