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.HttpHeaders;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.util.StringUtils;
import org.springframework.validation.DefaultMessageCodesResolver; import org.springframework.validation.DefaultMessageCodesResolver;
import org.springframework.validation.MessageCodesResolver; import org.springframework.validation.MessageCodesResolver;
import org.springframework.web.accept.ContentNegotiationManager; import org.springframework.web.accept.ContentNegotiationManager;
@ -516,8 +517,7 @@ public class WebMvcAutoConfiguration {
@Override @Override
public Object getHandlerInternal(HttpServletRequest request) throws Exception { public Object getHandlerInternal(HttpServletRequest request) throws Exception {
for (MediaType mediaType : MediaType for (MediaType mediaType : getAcceptedMediaTypes(request)) {
.parseMediaTypes(request.getHeader(HttpHeaders.ACCEPT))) {
if (mediaType.includes(MediaType.TEXT_HTML)) { if (mediaType.includes(MediaType.TEXT_HTML)) {
return super.getHandlerInternal(request); return super.getHandlerInternal(request);
} }
@ -525,6 +525,12 @@ public class WebMvcAutoConfiguration {
return null; 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 @Test
public void welcomePageMappingOnlyHandlesRequestsThatAcceptTextHtml() public void welcomePageMappingDoesNotHandleRequestThatDoNotAcceptTextHtml()
throws Exception { throws Exception {
load("spring.resources.static-locations:classpath:/welcome-page/"); load("spring.resources.static-locations:classpath:/welcome-page/");
assertThat(this.context.getBeansOfType(WelcomePageHandlerMapping.class)) assertThat(this.context.getBeansOfType(WelcomePageHandlerMapping.class))
@ -587,6 +587,27 @@ public class WebMvcAutoConfigurationTests {
.andExpect(status().isNotFound()); .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 @Test
public void welcomePageMappingWorksWithNoTrailingSlashOnResourceLocation() public void welcomePageMappingWorksWithNoTrailingSlashOnResourceLocation()
throws Exception { throws Exception {