diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java index 3dca4eda94..a3f3c37547 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java @@ -26,6 +26,7 @@ import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; import org.springframework.beans.BeanUtils; import org.springframework.context.ApplicationContext; @@ -866,10 +867,18 @@ public abstract class FrameworkServlet extends HttpServletBean { return; } } - super.doOptions(request, response); - String allowedMethods = response.getHeader("Allow"); - allowedMethods += ", " + RequestMethod.PATCH.name(); - response.setHeader("Allow", allowedMethods); + + // Use response wrapper for Servlet 2.5 compatibility where + // the getHeader() method does not exist + super.doOptions(request, new HttpServletResponseWrapper(response) { + @Override + public void setHeader(String name, String value) { + if("Allow".equals(name)) { + value = (StringUtils.hasLength(value) ? value + ", " : "") + RequestMethod.PATCH.name(); + } + super.setHeader(name, value); + } + }); } /** diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java index b73e69ae6f..667fb643b4 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java @@ -61,6 +61,8 @@ import org.springframework.web.util.WebUtils; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; +import static org.mockito.Matchers.*; +import static org.mockito.Mockito.*; /** * @author Rod Johnson @@ -857,9 +859,10 @@ public class DispatcherServletTests extends TestCase { public void testAllowedOptionsIncludesPatchMethod() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(getServletContext(), "OPTIONS", "/foo"); - MockHttpServletResponse response = new MockHttpServletResponse(); + MockHttpServletResponse response = spy(new MockHttpServletResponse()); DispatcherServlet servlet = new DispatcherServlet(); servlet.service(request, response); + verify(response, never()).getHeader(anyString()); // SPR-10341 assertThat(response.getHeader("Allow"), equalTo("GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH")); }