MockHttpServletResponse.getDateHeader returns -1 for non-existent header

Includes consistent getDateHeader results in both MockHttpServletResponse variants (spring-test and spring-web)

Issue: SPR-16160

(cherry picked from commit 80a0cf7)
This commit is contained in:
Juergen Hoeller
2017-11-05 16:12:21 +01:00
parent 9ca4de1ccf
commit dc0a934c99
4 changed files with 85 additions and 87 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2015 the original author or authors.
* Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@@ -16,6 +16,7 @@
package org.springframework.web.context.request;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
@@ -35,7 +36,8 @@ import org.springframework.mock.web.test.MockHttpServletResponse;
import static org.junit.Assert.*;
/**
* Parameterized tests for ServletWebRequest
* Parameterized tests for {@link ServletWebRequest}.
*
* @author Juergen Hoeller
* @author Brian Clozel
* @author Markus Malkusch
@@ -61,8 +63,7 @@ public class ServletWebRequestHttpMethodsTests {
@Parameters(name = "{0}")
static public Iterable<Object[]> safeMethods() {
return Arrays.asList(new Object[][] {
{"GET"},
{"HEAD"}
{"GET"}, {"HEAD"}
});
}
@@ -100,11 +101,11 @@ public class ServletWebRequestHttpMethodsTests {
@Test // SPR-14559
public void checkNotModifiedInvalidIfNoneMatchHeader() {
String eTag = "\"etagvalue\"";
String etag = "\"etagvalue\"";
servletRequest.addHeader("If-None-Match", "missingquotes");
assertFalse(request.checkNotModified(eTag));
assertFalse(request.checkNotModified(etag));
assertEquals(200, servletResponse.getStatus());
assertEquals(eTag, servletResponse.getHeader("ETag"));
assertEquals(etag, servletResponse.getHeader("ETag"));
}
@Test
@@ -120,12 +121,11 @@ public class ServletWebRequestHttpMethodsTests {
}
@Test
public void checkNotModifiedTimestamp() throws Exception {
public void checkNotModifiedTimestamp() {
long epochTime = currentDate.getTime();
servletRequest.addHeader("If-Modified-Since", epochTime);
assertTrue(request.checkNotModified(epochTime));
assertEquals(304, servletResponse.getStatus());
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
}
@@ -136,119 +136,109 @@ public class ServletWebRequestHttpMethodsTests {
servletRequest.addHeader("If-Modified-Since", oneMinuteAgo);
assertFalse(request.checkNotModified(currentDate.getTime()));
assertEquals(200, servletResponse.getStatus());
assertEquals(dateFormat.format(currentDate.getTime()), servletResponse.getHeader("Last-Modified"));
}
@Test
public void checkNotModifiedETag() {
String eTag = "\"Foo\"";
servletRequest.addHeader("If-None-Match", eTag);
assertTrue(request.checkNotModified(eTag));
String etag = "\"Foo\"";
servletRequest.addHeader("If-None-Match", etag);
assertTrue(request.checkNotModified(etag));
assertEquals(304, servletResponse.getStatus());
assertEquals(eTag, servletResponse.getHeader("ETag"));
assertEquals(etag, servletResponse.getHeader("ETag"));
}
@Test
public void checkNotModifiedETagWithSeparatorChars() {
String eTag = "\"Foo, Bar\"";
servletRequest.addHeader("If-None-Match", eTag);
assertTrue(request.checkNotModified(eTag));
String etag = "\"Foo, Bar\"";
servletRequest.addHeader("If-None-Match", etag);
assertTrue(request.checkNotModified(etag));
assertEquals(304, servletResponse.getStatus());
assertEquals(eTag, servletResponse.getHeader("ETag"));
assertEquals(etag, servletResponse.getHeader("ETag"));
}
@Test
public void checkModifiedETag() {
String currentETag = "\"Foo\"";
String oldEtag = "Bar";
servletRequest.addHeader("If-None-Match", oldEtag);
String oldETag = "Bar";
servletRequest.addHeader("If-None-Match", oldETag);
assertFalse(request.checkNotModified(currentETag));
assertEquals(200, servletResponse.getStatus());
assertEquals(currentETag, servletResponse.getHeader("ETag"));
}
@Test
public void checkNotModifiedUnpaddedETag() {
String eTag = "Foo";
String paddedEtag = String.format("\"%s\"", eTag);
servletRequest.addHeader("If-None-Match", paddedEtag);
assertTrue(request.checkNotModified(eTag));
String etag = "Foo";
String paddedETag = String.format("\"%s\"", etag);
servletRequest.addHeader("If-None-Match", paddedETag);
assertTrue(request.checkNotModified(etag));
assertEquals(304, servletResponse.getStatus());
assertEquals(paddedEtag, servletResponse.getHeader("ETag"));
assertEquals(paddedETag, servletResponse.getHeader("ETag"));
}
@Test
public void checkModifiedUnpaddedETag() {
String currentETag = "Foo";
String oldEtag = "Bar";
servletRequest.addHeader("If-None-Match", oldEtag);
String oldETag = "Bar";
servletRequest.addHeader("If-None-Match", oldETag);
assertFalse(request.checkNotModified(currentETag));
assertEquals(200, servletResponse.getStatus());
assertEquals(String.format("\"%s\"", currentETag), servletResponse.getHeader("ETag"));
}
@Test
public void checkNotModifiedWildcardIsIgnored() {
String eTag = "\"Foo\"";
String etag = "\"Foo\"";
servletRequest.addHeader("If-None-Match", "*");
assertFalse(request.checkNotModified(eTag));
assertFalse(request.checkNotModified(etag));
assertEquals(200, servletResponse.getStatus());
assertEquals(eTag, servletResponse.getHeader("ETag"));
assertEquals(etag, servletResponse.getHeader("ETag"));
}
@Test
public void checkNotModifiedETagAndTimestamp() {
String eTag = "\"Foo\"";
servletRequest.addHeader("If-None-Match", eTag);
String etag = "\"Foo\"";
servletRequest.addHeader("If-None-Match", etag);
servletRequest.addHeader("If-Modified-Since", currentDate.getTime());
assertTrue(request.checkNotModified(eTag, currentDate.getTime()));
assertTrue(request.checkNotModified(etag, currentDate.getTime()));
assertEquals(304, servletResponse.getStatus());
assertEquals(eTag, servletResponse.getHeader("ETag"));
assertEquals(etag, servletResponse.getHeader("ETag"));
assertEquals(dateFormat.format(currentDate.getTime()), servletResponse.getHeader("Last-Modified"));
}
@Test // SPR-14224
public void checkNotModifiedETagAndModifiedTimestamp() {
String eTag = "\"Foo\"";
servletRequest.addHeader("If-None-Match", eTag);
String etag = "\"Foo\"";
servletRequest.addHeader("If-None-Match", etag);
long currentEpoch = currentDate.getTime();
long oneMinuteAgo = currentEpoch - (1000 * 60);
servletRequest.addHeader("If-Modified-Since", oneMinuteAgo);
assertTrue(request.checkNotModified(eTag, currentEpoch));
assertTrue(request.checkNotModified(etag, currentEpoch));
assertEquals(304, servletResponse.getStatus());
assertEquals(eTag, servletResponse.getHeader("ETag"));
assertEquals(etag, servletResponse.getHeader("ETag"));
assertEquals(dateFormat.format(currentEpoch), servletResponse.getHeader("Last-Modified"));
}
@Test
public void checkModifiedETagAndNotModifiedTimestamp() throws Exception {
public void checkModifiedETagAndNotModifiedTimestamp() {
String currentETag = "\"Foo\"";
String oldEtag = "\"Bar\"";
servletRequest.addHeader("If-None-Match", oldEtag);
String oldETag = "\"Bar\"";
servletRequest.addHeader("If-None-Match", oldETag);
long epochTime = currentDate.getTime();
servletRequest.addHeader("If-Modified-Since", epochTime);
assertFalse(request.checkNotModified(currentETag, epochTime));
assertEquals(200, servletResponse.getStatus());
assertEquals(currentETag, servletResponse.getHeader("ETag"));
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
@@ -256,65 +246,60 @@ public class ServletWebRequestHttpMethodsTests {
@Test
public void checkNotModifiedETagWeakStrong() {
String eTag = "\"Foo\"";
String weakEtag = String.format("W/%s", eTag);
servletRequest.addHeader("If-None-Match", eTag);
assertTrue(request.checkNotModified(weakEtag));
String etag = "\"Foo\"";
String weakETag = String.format("W/%s", etag);
servletRequest.addHeader("If-None-Match", etag);
assertTrue(request.checkNotModified(weakETag));
assertEquals(304, servletResponse.getStatus());
assertEquals(weakEtag, servletResponse.getHeader("ETag"));
assertEquals(weakETag, servletResponse.getHeader("ETag"));
}
@Test
public void checkNotModifiedETagStrongWeak() {
String eTag = "\"Foo\"";
servletRequest.addHeader("If-None-Match", String.format("W/%s", eTag));
assertTrue(request.checkNotModified(eTag));
String etag = "\"Foo\"";
servletRequest.addHeader("If-None-Match", String.format("W/%s", etag));
assertTrue(request.checkNotModified(etag));
assertEquals(304, servletResponse.getStatus());
assertEquals(eTag, servletResponse.getHeader("ETag"));
assertEquals(etag, servletResponse.getHeader("ETag"));
}
@Test
public void checkNotModifiedMultipleETags() {
String eTag = "\"Bar\"";
String multipleETags = String.format("\"Foo\", %s", eTag);
String etag = "\"Bar\"";
String multipleETags = String.format("\"Foo\", %s", etag);
servletRequest.addHeader("If-None-Match", multipleETags);
assertTrue(request.checkNotModified(eTag));
assertTrue(request.checkNotModified(etag));
assertEquals(304, servletResponse.getStatus());
assertEquals(eTag, servletResponse.getHeader("ETag"));
assertEquals(etag, servletResponse.getHeader("ETag"));
}
@Test
public void checkNotModifiedTimestampWithLengthPart() throws Exception {
public void checkNotModifiedTimestampWithLengthPart() throws ParseException {
long epochTime = dateFormat.parse(CURRENT_TIME).getTime();
servletRequest.setMethod("GET");
servletRequest.addHeader("If-Modified-Since", "Wed, 09 Apr 2014 09:57:42 GMT; length=13774");
assertTrue(request.checkNotModified(epochTime));
assertEquals(304, servletResponse.getStatus());
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
}
@Test
public void checkModifiedTimestampWithLengthPart() throws Exception {
public void checkModifiedTimestampWithLengthPart() throws ParseException {
long epochTime = dateFormat.parse(CURRENT_TIME).getTime();
servletRequest.setMethod("GET");
servletRequest.addHeader("If-Modified-Since", "Wed, 08 Apr 2014 09:57:42 GMT; length=13774");
assertFalse(request.checkNotModified(epochTime));
assertEquals(200, servletResponse.getStatus());
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
}
@Test
public void checkNotModifiedTimestampConditionalPut() throws Exception {
public void checkNotModifiedTimestampConditionalPut() {
long currentEpoch = currentDate.getTime();
long oneMinuteAgo = currentEpoch - (1000 * 60);
servletRequest.setMethod("PUT");
@@ -326,7 +311,7 @@ public class ServletWebRequestHttpMethodsTests {
}
@Test
public void checkNotModifiedTimestampConditionalPutConflict() throws Exception {
public void checkNotModifiedTimestampConditionalPutConflict() {
long currentEpoch = currentDate.getTime();
long oneMinuteAgo = currentEpoch - (1000 * 60);
servletRequest.setMethod("PUT");