Skip to content

Commit dc0a934

Browse files
committed
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)
1 parent 9ca4de1 commit dc0a934

File tree

4 files changed

+81
-83
lines changed

4 files changed

+81
-83
lines changed

spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2015 the original author or authors.
2+
* Copyright 2002-2017 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
2323
import java.io.PrintWriter;
2424
import java.io.UnsupportedEncodingException;
2525
import java.io.Writer;
26+
import java.text.DateFormat;
2627
import java.text.ParseException;
2728
import java.text.SimpleDateFormat;
2829
import java.util.ArrayList;
@@ -493,27 +494,33 @@ public void setDateHeader(String name, long value) {
493494
setHeaderValue(name, formatDate(value));
494495
}
495496

497+
@Override
498+
public void addDateHeader(String name, long value) {
499+
addHeaderValue(name, formatDate(value));
500+
}
501+
496502
public long getDateHeader(String name) {
497-
SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.US);
498-
dateFormat.setTimeZone(GMT);
503+
String headerValue = getHeader(name);
504+
if (headerValue == null) {
505+
return -1;
506+
}
499507
try {
500-
return dateFormat.parse(getHeader(name)).getTime();
508+
return newDateFormat().parse(getHeader(name)).getTime();
501509
}
502510
catch (ParseException ex) {
503511
throw new IllegalArgumentException(
504-
"Value for header '" + name + "' is not a valid Date: " + getHeader(name));
512+
"Value for header '" + name + "' is not a valid Date: " + headerValue);
505513
}
506514
}
507515

508-
@Override
509-
public void addDateHeader(String name, long value) {
510-
addHeaderValue(name, formatDate(value));
516+
private String formatDate(long date) {
517+
return newDateFormat().format(new Date(date));
511518
}
512519

513-
private String formatDate(long date) {
520+
private DateFormat newDateFormat() {
514521
SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.US);
515522
dateFormat.setTimeZone(GMT);
516-
return dateFormat.format(new Date(date));
523+
return dateFormat;
517524
}
518525

519526
@Override

spring-test/src/test/java/org/springframework/mock/web/MockHttpServletResponseTests.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2015 the original author or authors.
2+
* Copyright 2002-2017 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -273,6 +273,12 @@ public void getInvalidDateHeader() {
273273
response.getDateHeader("Last-Modified");
274274
}
275275

276+
@Test // SPR-16160
277+
public void getNonExistentDateHeader() {
278+
assertNull(response.getHeader("Last-Modified"));
279+
assertEquals(-1, response.getDateHeader("Last-Modified"));
280+
}
281+
276282
@Test // SPR-10414
277283
public void modifyStatusAfterSendError() throws IOException {
278284
response.sendError(HttpServletResponse.SC_NOT_FOUND);

spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2015 the original author or authors.
2+
* Copyright 2002-2017 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.

spring-web/src/test/java/org/springframework/web/context/request/ServletWebRequestHttpMethodsTests.java

Lines changed: 56 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.web.context.request;
1818

19+
import java.text.ParseException;
1920
import java.text.SimpleDateFormat;
2021
import java.util.Arrays;
2122
import java.util.Date;
@@ -35,7 +36,8 @@
3536
import static org.junit.Assert.*;
3637

3738
/**
38-
* Parameterized tests for ServletWebRequest
39+
* Parameterized tests for {@link ServletWebRequest}.
40+
*
3941
* @author Juergen Hoeller
4042
* @author Brian Clozel
4143
* @author Markus Malkusch
@@ -61,8 +63,7 @@ public class ServletWebRequestHttpMethodsTests {
6163
@Parameters(name = "{0}")
6264
static public Iterable<Object[]> safeMethods() {
6365
return Arrays.asList(new Object[][] {
64-
{"GET"},
65-
{"HEAD"}
66+
{"GET"}, {"HEAD"}
6667
});
6768
}
6869

@@ -100,11 +101,11 @@ public void checkNotModifiedInvalidStatus() {
100101

101102
@Test // SPR-14559
102103
public void checkNotModifiedInvalidIfNoneMatchHeader() {
103-
String eTag = "\"etagvalue\"";
104+
String etag = "\"etagvalue\"";
104105
servletRequest.addHeader("If-None-Match", "missingquotes");
105-
assertFalse(request.checkNotModified(eTag));
106+
assertFalse(request.checkNotModified(etag));
106107
assertEquals(200, servletResponse.getStatus());
107-
assertEquals(eTag, servletResponse.getHeader("ETag"));
108+
assertEquals(etag, servletResponse.getHeader("ETag"));
108109
}
109110

110111
@Test
@@ -120,12 +121,11 @@ public void checkNotModifiedHeaderAlreadySet() {
120121
}
121122

122123
@Test
123-
public void checkNotModifiedTimestamp() throws Exception {
124+
public void checkNotModifiedTimestamp() {
124125
long epochTime = currentDate.getTime();
125126
servletRequest.addHeader("If-Modified-Since", epochTime);
126127

127128
assertTrue(request.checkNotModified(epochTime));
128-
129129
assertEquals(304, servletResponse.getStatus());
130130
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
131131
}
@@ -136,185 +136,170 @@ public void checkModifiedTimestamp() {
136136
servletRequest.addHeader("If-Modified-Since", oneMinuteAgo);
137137

138138
assertFalse(request.checkNotModified(currentDate.getTime()));
139-
140139
assertEquals(200, servletResponse.getStatus());
141140
assertEquals(dateFormat.format(currentDate.getTime()), servletResponse.getHeader("Last-Modified"));
142141
}
143142

144143
@Test
145144
public void checkNotModifiedETag() {
146-
String eTag = "\"Foo\"";
147-
servletRequest.addHeader("If-None-Match", eTag);
148-
149-
assertTrue(request.checkNotModified(eTag));
145+
String etag = "\"Foo\"";
146+
servletRequest.addHeader("If-None-Match", etag);
150147

148+
assertTrue(request.checkNotModified(etag));
151149
assertEquals(304, servletResponse.getStatus());
152-
assertEquals(eTag, servletResponse.getHeader("ETag"));
150+
assertEquals(etag, servletResponse.getHeader("ETag"));
153151
}
154152

155153
@Test
156154
public void checkNotModifiedETagWithSeparatorChars() {
157-
String eTag = "\"Foo, Bar\"";
158-
servletRequest.addHeader("If-None-Match", eTag);
159-
160-
assertTrue(request.checkNotModified(eTag));
155+
String etag = "\"Foo, Bar\"";
156+
servletRequest.addHeader("If-None-Match", etag);
161157

158+
assertTrue(request.checkNotModified(etag));
162159
assertEquals(304, servletResponse.getStatus());
163-
assertEquals(eTag, servletResponse.getHeader("ETag"));
160+
assertEquals(etag, servletResponse.getHeader("ETag"));
164161
}
165162

166163

167164
@Test
168165
public void checkModifiedETag() {
169166
String currentETag = "\"Foo\"";
170-
String oldEtag = "Bar";
171-
servletRequest.addHeader("If-None-Match", oldEtag);
167+
String oldETag = "Bar";
168+
servletRequest.addHeader("If-None-Match", oldETag);
172169

173170
assertFalse(request.checkNotModified(currentETag));
174-
175171
assertEquals(200, servletResponse.getStatus());
176172
assertEquals(currentETag, servletResponse.getHeader("ETag"));
177173
}
178174

179175
@Test
180176
public void checkNotModifiedUnpaddedETag() {
181-
String eTag = "Foo";
182-
String paddedEtag = String.format("\"%s\"", eTag);
183-
servletRequest.addHeader("If-None-Match", paddedEtag);
184-
185-
assertTrue(request.checkNotModified(eTag));
177+
String etag = "Foo";
178+
String paddedETag = String.format("\"%s\"", etag);
179+
servletRequest.addHeader("If-None-Match", paddedETag);
186180

181+
assertTrue(request.checkNotModified(etag));
187182
assertEquals(304, servletResponse.getStatus());
188-
assertEquals(paddedEtag, servletResponse.getHeader("ETag"));
183+
assertEquals(paddedETag, servletResponse.getHeader("ETag"));
189184
}
190185

191186
@Test
192187
public void checkModifiedUnpaddedETag() {
193188
String currentETag = "Foo";
194-
String oldEtag = "Bar";
195-
servletRequest.addHeader("If-None-Match", oldEtag);
189+
String oldETag = "Bar";
190+
servletRequest.addHeader("If-None-Match", oldETag);
196191

197192
assertFalse(request.checkNotModified(currentETag));
198-
199193
assertEquals(200, servletResponse.getStatus());
200194
assertEquals(String.format("\"%s\"", currentETag), servletResponse.getHeader("ETag"));
201195
}
202196

203197
@Test
204198
public void checkNotModifiedWildcardIsIgnored() {
205-
String eTag = "\"Foo\"";
199+
String etag = "\"Foo\"";
206200
servletRequest.addHeader("If-None-Match", "*");
207201

208-
assertFalse(request.checkNotModified(eTag));
209-
202+
assertFalse(request.checkNotModified(etag));
210203
assertEquals(200, servletResponse.getStatus());
211-
assertEquals(eTag, servletResponse.getHeader("ETag"));
204+
assertEquals(etag, servletResponse.getHeader("ETag"));
212205
}
213206

214207
@Test
215208
public void checkNotModifiedETagAndTimestamp() {
216-
String eTag = "\"Foo\"";
217-
servletRequest.addHeader("If-None-Match", eTag);
209+
String etag = "\"Foo\"";
210+
servletRequest.addHeader("If-None-Match", etag);
218211
servletRequest.addHeader("If-Modified-Since", currentDate.getTime());
219212

220-
assertTrue(request.checkNotModified(eTag, currentDate.getTime()));
221-
213+
assertTrue(request.checkNotModified(etag, currentDate.getTime()));
222214
assertEquals(304, servletResponse.getStatus());
223-
assertEquals(eTag, servletResponse.getHeader("ETag"));
215+
assertEquals(etag, servletResponse.getHeader("ETag"));
224216
assertEquals(dateFormat.format(currentDate.getTime()), servletResponse.getHeader("Last-Modified"));
225217
}
226218

227219
@Test // SPR-14224
228220
public void checkNotModifiedETagAndModifiedTimestamp() {
229-
String eTag = "\"Foo\"";
230-
servletRequest.addHeader("If-None-Match", eTag);
221+
String etag = "\"Foo\"";
222+
servletRequest.addHeader("If-None-Match", etag);
231223
long currentEpoch = currentDate.getTime();
232224
long oneMinuteAgo = currentEpoch - (1000 * 60);
233225
servletRequest.addHeader("If-Modified-Since", oneMinuteAgo);
234226

235-
assertTrue(request.checkNotModified(eTag, currentEpoch));
236-
227+
assertTrue(request.checkNotModified(etag, currentEpoch));
237228
assertEquals(304, servletResponse.getStatus());
238-
assertEquals(eTag, servletResponse.getHeader("ETag"));
229+
assertEquals(etag, servletResponse.getHeader("ETag"));
239230
assertEquals(dateFormat.format(currentEpoch), servletResponse.getHeader("Last-Modified"));
240231
}
241232

242233
@Test
243-
public void checkModifiedETagAndNotModifiedTimestamp() throws Exception {
234+
public void checkModifiedETagAndNotModifiedTimestamp() {
244235
String currentETag = "\"Foo\"";
245-
String oldEtag = "\"Bar\"";
246-
servletRequest.addHeader("If-None-Match", oldEtag);
236+
String oldETag = "\"Bar\"";
237+
servletRequest.addHeader("If-None-Match", oldETag);
247238
long epochTime = currentDate.getTime();
248239
servletRequest.addHeader("If-Modified-Since", epochTime);
249240

250241
assertFalse(request.checkNotModified(currentETag, epochTime));
251-
252242
assertEquals(200, servletResponse.getStatus());
253243
assertEquals(currentETag, servletResponse.getHeader("ETag"));
254244
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
255245
}
256246

257247
@Test
258248
public void checkNotModifiedETagWeakStrong() {
259-
String eTag = "\"Foo\"";
260-
String weakEtag = String.format("W/%s", eTag);
261-
servletRequest.addHeader("If-None-Match", eTag);
262-
263-
assertTrue(request.checkNotModified(weakEtag));
249+
String etag = "\"Foo\"";
250+
String weakETag = String.format("W/%s", etag);
251+
servletRequest.addHeader("If-None-Match", etag);
264252

253+
assertTrue(request.checkNotModified(weakETag));
265254
assertEquals(304, servletResponse.getStatus());
266-
assertEquals(weakEtag, servletResponse.getHeader("ETag"));
255+
assertEquals(weakETag, servletResponse.getHeader("ETag"));
267256
}
268257

269258
@Test
270259
public void checkNotModifiedETagStrongWeak() {
271-
String eTag = "\"Foo\"";
272-
servletRequest.addHeader("If-None-Match", String.format("W/%s", eTag));
273-
274-
assertTrue(request.checkNotModified(eTag));
260+
String etag = "\"Foo\"";
261+
servletRequest.addHeader("If-None-Match", String.format("W/%s", etag));
275262

263+
assertTrue(request.checkNotModified(etag));
276264
assertEquals(304, servletResponse.getStatus());
277-
assertEquals(eTag, servletResponse.getHeader("ETag"));
265+
assertEquals(etag, servletResponse.getHeader("ETag"));
278266
}
279267

280268
@Test
281269
public void checkNotModifiedMultipleETags() {
282-
String eTag = "\"Bar\"";
283-
String multipleETags = String.format("\"Foo\", %s", eTag);
270+
String etag = "\"Bar\"";
271+
String multipleETags = String.format("\"Foo\", %s", etag);
284272
servletRequest.addHeader("If-None-Match", multipleETags);
285273

286-
assertTrue(request.checkNotModified(eTag));
287-
274+
assertTrue(request.checkNotModified(etag));
288275
assertEquals(304, servletResponse.getStatus());
289-
assertEquals(eTag, servletResponse.getHeader("ETag"));
276+
assertEquals(etag, servletResponse.getHeader("ETag"));
290277
}
291278

292279
@Test
293-
public void checkNotModifiedTimestampWithLengthPart() throws Exception {
280+
public void checkNotModifiedTimestampWithLengthPart() throws ParseException {
294281
long epochTime = dateFormat.parse(CURRENT_TIME).getTime();
295282
servletRequest.setMethod("GET");
296283
servletRequest.addHeader("If-Modified-Since", "Wed, 09 Apr 2014 09:57:42 GMT; length=13774");
297284

298285
assertTrue(request.checkNotModified(epochTime));
299-
300286
assertEquals(304, servletResponse.getStatus());
301287
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
302288
}
303289

304290
@Test
305-
public void checkModifiedTimestampWithLengthPart() throws Exception {
291+
public void checkModifiedTimestampWithLengthPart() throws ParseException {
306292
long epochTime = dateFormat.parse(CURRENT_TIME).getTime();
307293
servletRequest.setMethod("GET");
308294
servletRequest.addHeader("If-Modified-Since", "Wed, 08 Apr 2014 09:57:42 GMT; length=13774");
309295

310296
assertFalse(request.checkNotModified(epochTime));
311-
312297
assertEquals(200, servletResponse.getStatus());
313298
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
314299
}
315300

316301
@Test
317-
public void checkNotModifiedTimestampConditionalPut() throws Exception {
302+
public void checkNotModifiedTimestampConditionalPut() {
318303
long currentEpoch = currentDate.getTime();
319304
long oneMinuteAgo = currentEpoch - (1000 * 60);
320305
servletRequest.setMethod("PUT");
@@ -326,7 +311,7 @@ public void checkNotModifiedTimestampConditionalPut() throws Exception {
326311
}
327312

328313
@Test
329-
public void checkNotModifiedTimestampConditionalPutConflict() throws Exception {
314+
public void checkNotModifiedTimestampConditionalPutConflict() {
330315
long currentEpoch = currentDate.getTime();
331316
long oneMinuteAgo = currentEpoch - (1000 * 60);
332317
servletRequest.setMethod("PUT");

0 commit comments

Comments
 (0)