Update WelcomePageHandlerMapping to handle reqs with no Accept header

Closes gh-7138
This commit is contained in:
Andy Wilkinson 2016-10-11 13:02:36 +01:00
parent b1d2552ede
commit 0333416952
2 changed files with 30 additions and 3 deletions

View File

@ -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<MediaType> getAcceptedMediaTypes(HttpServletRequest request) {
String acceptHeader = request.getHeader(HttpHeaders.ACCEPT);
return MediaType.parseMediaTypes(
StringUtils.hasText(acceptHeader) ? acceptHeader : "*/*");
}
}
}

View File

@ -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 {