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
master
Phillip Webb 12 years ago
parent c986a1efc1
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

@ -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);
}
});
}
/**

@ -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"));
}

Loading…
Cancel
Save