diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.java index 16039c3e9ff..fe03fd17618 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.java @@ -61,6 +61,7 @@ import org.springframework.format.datetime.DateFormatter; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.util.StringUtils; import org.springframework.validation.DefaultMessageCodesResolver; import org.springframework.validation.MessageCodesResolver; import org.springframework.web.accept.ContentNegotiationManager; @@ -516,8 +517,7 @@ public class WebMvcAutoConfiguration { @Override public Object getHandlerInternal(HttpServletRequest request) throws Exception { - for (MediaType mediaType : MediaType - .parseMediaTypes(request.getHeader(HttpHeaders.ACCEPT))) { + for (MediaType mediaType : getAcceptedMediaTypes(request)) { if (mediaType.includes(MediaType.TEXT_HTML)) { return super.getHandlerInternal(request); } @@ -525,6 +525,12 @@ public class WebMvcAutoConfiguration { return null; } + private List getAcceptedMediaTypes(HttpServletRequest request) { + String acceptHeader = request.getHeader(HttpHeaders.ACCEPT); + return MediaType.parseMediaTypes( + StringUtils.hasText(acceptHeader) ? acceptHeader : "*/*"); + } + } } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfigurationTests.java index d090ce3e791..9b17db8c2f3 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfigurationTests.java @@ -577,7 +577,7 @@ public class WebMvcAutoConfigurationTests { } @Test - public void welcomePageMappingOnlyHandlesRequestsThatAcceptTextHtml() + public void welcomePageMappingDoesNotHandleRequestThatDoNotAcceptTextHtml() throws Exception { load("spring.resources.static-locations:classpath:/welcome-page/"); assertThat(this.context.getBeansOfType(WelcomePageHandlerMapping.class)) @@ -587,6 +587,27 @@ public class WebMvcAutoConfigurationTests { .andExpect(status().isNotFound()); } + @Test + public void welcomePageMappingHandlesRequestsWithNoAcceptHeader() throws Exception { + load("spring.resources.static-locations:classpath:/welcome-page/"); + assertThat(this.context.getBeansOfType(WelcomePageHandlerMapping.class)) + .hasSize(1); + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build(); + mockMvc.perform(get("/")).andExpect(status().isOk()) + .andExpect(forwardedUrl("index.html")); + } + + @Test + public void welcomePageMappingHandlesRequestsWithEmptyAcceptHeader() + throws Exception { + load("spring.resources.static-locations:classpath:/welcome-page/"); + assertThat(this.context.getBeansOfType(WelcomePageHandlerMapping.class)) + .hasSize(1); + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build(); + mockMvc.perform(get("/").header(HttpHeaders.ACCEPT, "")) + .andExpect(status().isOk()).andExpect(forwardedUrl("index.html")); + } + @Test public void welcomePageMappingWorksWithNoTrailingSlashOnResourceLocation() throws Exception {