SPR-8612 Allow use of explicit status code in HTTP 1.0 compatibility mode

This commit is contained in:
Rossen Stoyanchev
2011-08-15 13:02:48 +00:00
parent 585745de32
commit 0f1c10bc1c
3 changed files with 26 additions and 5 deletions

View File

@@ -43,6 +43,7 @@ Changes in version 3.0.6 (2011-07-29)
* fixed JPA 2.0 timeout hints to correctly specify milliseconds
* updated Quartz package to support Quartz 1.8 as well (note: not supporting Quartz 2.0 yet)
* fixed @Rule execution order in SpringJUnit4ClassRunner to match standard JUnit 4 behavior
* Explicit status code in RedirectView respected in HTTP 1.0 compatibility mode
Changes in version 3.0.5 (2010-10-20)

View File

@@ -389,9 +389,17 @@ public class RedirectView extends AbstractUrlBasedView {
HttpServletRequest request, HttpServletResponse response, String targetUrl, boolean http10Compatible)
throws IOException {
String encodedRedirectURL = response.encodeRedirectURL(targetUrl);
if (http10Compatible) {
// Always send status code 302.
response.sendRedirect(response.encodeRedirectURL(targetUrl));
if (this.statusCode != null) {
response.setStatus(this.statusCode.value());
response.setHeader("Location", encodedRedirectURL);
}
else {
// Send status code 302 by default.
response.sendRedirect(encodedRedirectURL);
}
}
else {
HttpStatus statusCode = getHttp11StatusCode(request, response, targetUrl);

View File

@@ -66,15 +66,27 @@ public class RedirectViewTests {
}
@Test
public void explicitStatusCode() throws Exception {
public void explicitStatusCodeHttp11() throws Exception {
RedirectView rv = new RedirectView();
rv.setUrl("http://url.somewhere.com");
rv.setHttp10Compatible(false);
rv.setStatusCode(HttpStatus.CREATED);
rv.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
rv.render(new HashMap<String, Object>(), request, response);
assertEquals(201, response.getStatus());
assertEquals(301, response.getStatus());
assertEquals("http://url.somewhere.com", response.getHeader("Location"));
}
@Test
public void explicitStatusCodeHttp10() throws Exception {
RedirectView rv = new RedirectView();
rv.setUrl("http://url.somewhere.com");
rv.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
rv.render(new HashMap<String, Object>(), request, response);
assertEquals(301, response.getStatus());
assertEquals("http://url.somewhere.com", response.getHeader("Location"));
}