Skip to content

Commit 0f1c10b

Browse files
committed
SPR-8612 Allow use of explicit status code in HTTP 1.0 compatibility mode
1 parent 585745d commit 0f1c10b

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

build-spring-framework/resources/changelog.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ Changes in version 3.0.6 (2011-07-29)
4343
* fixed JPA 2.0 timeout hints to correctly specify milliseconds
4444
* updated Quartz package to support Quartz 1.8 as well (note: not supporting Quartz 2.0 yet)
4545
* fixed @Rule execution order in SpringJUnit4ClassRunner to match standard JUnit 4 behavior
46+
* Explicit status code in RedirectView respected in HTTP 1.0 compatibility mode
4647

4748

4849
Changes in version 3.0.5 (2010-10-20)

org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/RedirectView.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,9 +389,17 @@ protected void sendRedirect(
389389
HttpServletRequest request, HttpServletResponse response, String targetUrl, boolean http10Compatible)
390390
throws IOException {
391391

392+
String encodedRedirectURL = response.encodeRedirectURL(targetUrl);
393+
392394
if (http10Compatible) {
393-
// Always send status code 302.
394-
response.sendRedirect(response.encodeRedirectURL(targetUrl));
395+
if (this.statusCode != null) {
396+
response.setStatus(this.statusCode.value());
397+
response.setHeader("Location", encodedRedirectURL);
398+
}
399+
else {
400+
// Send status code 302 by default.
401+
response.sendRedirect(encodedRedirectURL);
402+
}
395403
}
396404
else {
397405
HttpStatus statusCode = getHttp11StatusCode(request, response, targetUrl);

org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/view/RedirectViewTests.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,27 @@ public void http11() throws Exception {
6666
}
6767

6868
@Test
69-
public void explicitStatusCode() throws Exception {
69+
public void explicitStatusCodeHttp11() throws Exception {
7070
RedirectView rv = new RedirectView();
7171
rv.setUrl("http://url.somewhere.com");
7272
rv.setHttp10Compatible(false);
73-
rv.setStatusCode(HttpStatus.CREATED);
73+
rv.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
7474
MockHttpServletRequest request = new MockHttpServletRequest();
7575
MockHttpServletResponse response = new MockHttpServletResponse();
7676
rv.render(new HashMap<String, Object>(), request, response);
77-
assertEquals(201, response.getStatus());
77+
assertEquals(301, response.getStatus());
78+
assertEquals("http://url.somewhere.com", response.getHeader("Location"));
79+
}
80+
81+
@Test
82+
public void explicitStatusCodeHttp10() throws Exception {
83+
RedirectView rv = new RedirectView();
84+
rv.setUrl("http://url.somewhere.com");
85+
rv.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
86+
MockHttpServletRequest request = new MockHttpServletRequest();
87+
MockHttpServletResponse response = new MockHttpServletResponse();
88+
rv.render(new HashMap<String, Object>(), request, response);
89+
assertEquals(301, response.getStatus());
7890
assertEquals("http://url.somewhere.com", response.getHeader("Location"));
7991
}
8092

0 commit comments

Comments
 (0)