Skip to content

Commit b27fc0e

Browse files
committed
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
1 parent c986a1e commit b27fc0e

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import javax.servlet.ServletException;
2727
import javax.servlet.http.HttpServletRequest;
2828
import javax.servlet.http.HttpServletResponse;
29+
import javax.servlet.http.HttpServletResponseWrapper;
2930

3031
import org.springframework.beans.BeanUtils;
3132
import org.springframework.context.ApplicationContext;
@@ -866,10 +867,18 @@ protected void doOptions(HttpServletRequest request, HttpServletResponse respons
866867
return;
867868
}
868869
}
869-
super.doOptions(request, response);
870-
String allowedMethods = response.getHeader("Allow");
871-
allowedMethods += ", " + RequestMethod.PATCH.name();
872-
response.setHeader("Allow", allowedMethods);
870+
871+
// Use response wrapper for Servlet 2.5 compatibility where
872+
// the getHeader() method does not exist
873+
super.doOptions(request, new HttpServletResponseWrapper(response) {
874+
@Override
875+
public void setHeader(String name, String value) {
876+
if("Allow".equals(name)) {
877+
value = (StringUtils.hasLength(value) ? value + ", " : "") + RequestMethod.PATCH.name();
878+
}
879+
super.setHeader(name, value);
880+
}
881+
});
873882
}
874883

875884
/**

spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@
6161

6262
import static org.hamcrest.CoreMatchers.*;
6363
import static org.junit.Assert.*;
64+
import static org.mockito.Matchers.*;
65+
import static org.mockito.Mockito.*;
6466

6567
/**
6668
* @author Rod Johnson
@@ -857,9 +859,10 @@ protected ConfigurableWebEnvironment createEnvironment() {
857859

858860
public void testAllowedOptionsIncludesPatchMethod() throws Exception {
859861
MockHttpServletRequest request = new MockHttpServletRequest(getServletContext(), "OPTIONS", "/foo");
860-
MockHttpServletResponse response = new MockHttpServletResponse();
862+
MockHttpServletResponse response = spy(new MockHttpServletResponse());
861863
DispatcherServlet servlet = new DispatcherServlet();
862864
servlet.service(request, response);
865+
verify(response, never()).getHeader(anyString()); // SPR-10341
863866
assertThat(response.getHeader("Allow"), equalTo("GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH"));
864867
}
865868

0 commit comments

Comments
 (0)