Browse Source

Do not use Servlet 3.0 API in doOptions()

Refactor FrameworkServlet.doOptions() to capture the "Allow" header
by using a HttpServletResponseWrapper.

Prior to this commit the HttpServletResponse.getHeader() method was
used which is only available in Servlet 3.0 environments.

Issue: SPR-10341
pull/238/merge
Phillip Webb 13 years ago
parent
commit
b27fc0ef30
  1. 17
      spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java
  2. 5
      spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java

17
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.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
@ -866,10 +867,18 @@ public abstract class FrameworkServlet extends HttpServletBean {
return; return;
} }
} }
super.doOptions(request, response);
String allowedMethods = response.getHeader("Allow"); // Use response wrapper for Servlet 2.5 compatibility where
allowedMethods += ", " + RequestMethod.PATCH.name(); // the getHeader() method does not exist
response.setHeader("Allow", allowedMethods); 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);
}
});
} }
/** /**

5
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.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
/** /**
* @author Rod Johnson * @author Rod Johnson
@ -857,9 +859,10 @@ public class DispatcherServletTests extends TestCase {
public void testAllowedOptionsIncludesPatchMethod() throws Exception { public void testAllowedOptionsIncludesPatchMethod() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest(getServletContext(), "OPTIONS", "/foo"); MockHttpServletRequest request = new MockHttpServletRequest(getServletContext(), "OPTIONS", "/foo");
MockHttpServletResponse response = new MockHttpServletResponse(); MockHttpServletResponse response = spy(new MockHttpServletResponse());
DispatcherServlet servlet = new DispatcherServlet(); DispatcherServlet servlet = new DispatcherServlet();
servlet.service(request, response); servlet.service(request, response);
verify(response, never()).getHeader(anyString()); // SPR-10341
assertThat(response.getHeader("Allow"), equalTo("GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH")); assertThat(response.getHeader("Allow"), equalTo("GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH"));
} }

Loading…
Cancel
Save