From 0f1c10bc1c51ba28042ef0d5371e3bcb54621a46 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Mon, 15 Aug 2011 13:02:48 +0000 Subject: [PATCH] SPR-8612 Allow use of explicit status code in HTTP 1.0 compatibility mode --- build-spring-framework/resources/changelog.txt | 1 + .../web/servlet/view/RedirectView.java | 12 ++++++++++-- .../web/servlet/view/RedirectViewTests.java | 18 +++++++++++++++--- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/build-spring-framework/resources/changelog.txt b/build-spring-framework/resources/changelog.txt index 96b3ad2370..d49ff99238 100644 --- a/build-spring-framework/resources/changelog.txt +++ b/build-spring-framework/resources/changelog.txt @@ -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) diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/RedirectView.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/RedirectView.java index e6b692182d..95c94cb45b 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/RedirectView.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/RedirectView.java @@ -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); diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/view/RedirectViewTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/view/RedirectViewTests.java index 80fdeb0359..48e0583479 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/view/RedirectViewTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/view/RedirectViewTests.java @@ -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(), 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(), request, response); + assertEquals(301, response.getStatus()); assertEquals("http://url.somewhere.com", response.getHeader("Location")); }