Skip to content

Commit 803d7b5

Browse files
committed
Skip HttpServletResponse.getStatus() on Servlet 2.5
Prior to this commit, ServletWebRequest would call HttpServletResponse.getStatus(), which is a Servlet 3.x method. This commit checks if this method is available before calling it, thus keeping Servlet 2.5 compatibility. Issue: SPR-13396
1 parent 7118fcf commit 803d7b5

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

spring-web/src/main/java/org/springframework/web/context/request/ServletWebRequest.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import org.springframework.http.HttpMethod;
2929
import org.springframework.http.HttpStatus;
30+
import org.springframework.util.ClassUtils;
3031
import org.springframework.util.CollectionUtils;
3132
import org.springframework.util.ObjectUtils;
3233
import org.springframework.util.StringUtils;
@@ -54,6 +55,10 @@ public class ServletWebRequest extends ServletRequestAttributes implements Nativ
5455

5556
private static final String METHOD_HEAD = "HEAD";
5657

58+
/** Checking for Servlet 3.0+ HttpServletResponse.getStatus() */
59+
private static final boolean responseGetStatusAvailable =
60+
ClassUtils.hasMethod(HttpServletResponse.class, "getStatus");
61+
5762

5863
private boolean notModified = false;
5964

@@ -173,7 +178,7 @@ public boolean isSecure() {
173178
public boolean checkNotModified(long lastModifiedTimestamp) {
174179
HttpServletResponse response = getResponse();
175180
if (lastModifiedTimestamp >= 0 && !this.notModified) {
176-
if (response == null || HttpStatus.valueOf(response.getStatus()).is2xxSuccessful()) {
181+
if (isCompatibleWithConditionalRequests(response)) {
177182
this.notModified = isTimestampNotModified(lastModifiedTimestamp);
178183
if (response != null) {
179184
if (this.notModified && supportsNotModifiedStatus()) {
@@ -188,6 +193,12 @@ public boolean checkNotModified(long lastModifiedTimestamp) {
188193
return this.notModified;
189194
}
190195

196+
private boolean isCompatibleWithConditionalRequests(HttpServletResponse response) {
197+
return response == null
198+
|| !responseGetStatusAvailable
199+
|| HttpStatus.valueOf(response.getStatus()).is2xxSuccessful();
200+
}
201+
191202
@SuppressWarnings("deprecation")
192203
private boolean isTimestampNotModified(long lastModifiedTimestamp) {
193204
long ifModifiedSince = -1;
@@ -215,7 +226,7 @@ private boolean isTimestampNotModified(long lastModifiedTimestamp) {
215226
public boolean checkNotModified(String etag) {
216227
HttpServletResponse response = getResponse();
217228
if (StringUtils.hasLength(etag) && !this.notModified) {
218-
if (response == null || HttpStatus.valueOf(response.getStatus()).is2xxSuccessful()) {
229+
if (isCompatibleWithConditionalRequests(response)) {
219230
etag = addEtagPadding(etag);
220231
this.notModified = isETagNotModified(etag);
221232
if (response != null) {
@@ -265,7 +276,7 @@ private boolean supportsNotModifiedStatus() {
265276
public boolean checkNotModified(String etag, long lastModifiedTimestamp) {
266277
HttpServletResponse response = getResponse();
267278
if (StringUtils.hasLength(etag) && !this.notModified) {
268-
if (response == null || HttpStatus.valueOf(response.getStatus()).is2xxSuccessful()) {
279+
if (isCompatibleWithConditionalRequests(response)) {
269280
etag = addEtagPadding(etag);
270281
this.notModified = isETagNotModified(etag) && isTimestampNotModified(lastModifiedTimestamp);
271282
if (response != null) {

0 commit comments

Comments
 (0)