/** * Expect a "Last-Modified" header with the given value. */ public WebTestClient.ResponseSpec lastModified(long lastModified) { return assertHeader("Last-Modified", lastModified, getHeaders().getLastModified()); }
@Test public void lastModified() { Calendar calendar = new GregorianCalendar(2008, 11, 18, 11, 20); calendar.setTimeZone(TimeZone.getTimeZone("CET")); long date = calendar.getTimeInMillis(); headers.setLastModified(date); assertEquals("Invalid Last-Modified header", date, headers.getLastModified()); assertEquals("Invalid Last-Modified header", "Thu, 18 Dec 2008 10:20:00 GMT", headers.getFirst("last-modified")); }
@Override public final Mono<Void> writeTo(ServerWebExchange exchange, Context context) { writeStatusAndHeaders(exchange.getResponse()); Instant lastModified = Instant.ofEpochMilli(headers().getLastModified()); HttpMethod httpMethod = exchange.getRequest().getMethod(); if (SAFE_METHODS.contains(httpMethod) && exchange.checkNotModified(headers().getETag(), lastModified)) { return exchange.getResponse().setComplete(); } else { return writeToInternal(exchange, context); } }
@Test public void lastModified() { ZonedDateTime now = ZonedDateTime.now(); Mono<ServerResponse> result = ServerResponse.ok().lastModified(now).build(); Long expected = now.toInstant().toEpochMilli() / 1000; StepVerifier.create(result) .expectNextMatches(response -> expected.equals(response.headers().getLastModified() / 1000)) .expectComplete() .verify(); }
@Test public void lastModified() { ZonedDateTime now = ZonedDateTime.now(); String body = "foo"; Mono<EntityResponse<String>> result = EntityResponse.fromObject(body).lastModified(now).build(); Long expected = now.toInstant().toEpochMilli() / 1000; StepVerifier.create(result) .expectNextMatches(response -> expected.equals(response.headers().getLastModified() / 1000)) .expectComplete() .verify(); }
private boolean isResourceNotModified(ServletServerHttpRequest request, ServletServerHttpResponse response) { ServletWebRequest servletWebRequest = new ServletWebRequest(request.getServletRequest(), response.getServletResponse()); HttpHeaders responseHeaders = response.getHeaders(); String etag = responseHeaders.getETag(); long lastModifiedTimestamp = responseHeaders.getLastModified(); if (request.getMethod() == HttpMethod.GET || request.getMethod() == HttpMethod.HEAD) { responseHeaders.remove(HttpHeaders.ETAG); responseHeaders.remove(HttpHeaders.LAST_MODIFIED); } return servletWebRequest.checkNotModified(etag, lastModifiedTimestamp); }
@Test public void checkNotModifiedTimestampWithLengthPart() throws Exception { long epochTime = dateFormat.parse(CURRENT_TIME).getTime(); String header = "Wed, 09 Apr 2014 09:57:42 GMT; length=13774"; MockServerHttpRequest request = get("/").header("If-Modified-Since", header).build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); assertTrue(exchange.checkNotModified(Instant.ofEpochMilli(epochTime))); assertEquals(304, exchange.getResponse().getStatusCode().value()); assertEquals(epochTime, exchange.getResponse().getHeaders().getLastModified()); }
@Test public void checkModifiedTimestampWithLengthPart() throws Exception { long epochTime = dateFormat.parse(CURRENT_TIME).getTime(); String header = "Tue, 08 Apr 2014 09:57:42 GMT; length=13774"; MockServerHttpRequest request = get("/").header("If-Modified-Since", header).build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); assertFalse(exchange.checkNotModified(Instant.ofEpochMilli(epochTime))); assertNull(exchange.getResponse().getStatusCode()); assertEquals(epochTime, exchange.getResponse().getHeaders().getLastModified()); }
@Test public void checkNotModifiedTimestamp() throws Exception { MockServerHttpRequest request = get("/").ifModifiedSince(currentDate.toEpochMilli()).build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); assertTrue(exchange.checkNotModified(currentDate)); assertEquals(304, exchange.getResponse().getStatusCode().value()); assertEquals(currentDate.toEpochMilli(), exchange.getResponse().getHeaders().getLastModified()); }
@Test public void checkNotModifiedTimestampConditionalPutConflict() throws Exception { Instant oneMinuteAgo = currentDate.minusSeconds(60); long millis = oneMinuteAgo.toEpochMilli(); MockServerHttpRequest request = MockServerHttpRequest.put("/").ifUnmodifiedSince(millis).build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); assertTrue(exchange.checkNotModified(currentDate)); assertEquals(412, exchange.getResponse().getStatusCode().value()); assertEquals(-1, exchange.getResponse().getHeaders().getLastModified()); }
@Test public void checkModifiedTimestamp() { Instant oneMinuteAgo = currentDate.minusSeconds(60); MockServerHttpRequest request = get("/").ifModifiedSince(oneMinuteAgo.toEpochMilli()).build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); assertFalse(exchange.checkNotModified(currentDate)); assertNull(exchange.getResponse().getStatusCode()); assertEquals(currentDate.toEpochMilli(), exchange.getResponse().getHeaders().getLastModified()); }
@Test public void checkNotModifiedNon2xxStatus() { MockServerHttpRequest request = get("/").ifModifiedSince(this.currentDate.toEpochMilli()).build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); exchange.getResponse().setStatusCode(HttpStatus.NOT_MODIFIED); assertFalse(exchange.checkNotModified(this.currentDate)); assertEquals(304, exchange.getResponse().getStatusCode().value()); assertEquals(-1, exchange.getResponse().getHeaders().getLastModified()); }
@Test public void checkNotModifiedETagAndModifiedTimestamp() { String eTag = "\"Foo\""; Instant oneMinuteAgo = currentDate.minusSeconds(60); MockServerWebExchange exchange = MockServerWebExchange.from(get("/") .ifNoneMatch(eTag) .ifModifiedSince(oneMinuteAgo.toEpochMilli()) ); assertTrue(exchange.checkNotModified(eTag, currentDate)); assertEquals(304, exchange.getResponse().getStatusCode().value()); assertEquals(eTag, exchange.getResponse().getHeaders().getETag()); assertEquals(currentDate.toEpochMilli(), exchange.getResponse().getHeaders().getLastModified()); }
@Test public void checkNotModifiedTimestampConditionalPut() throws Exception { Instant oneMinuteAgo = currentDate.minusSeconds(60); long millis = currentDate.toEpochMilli(); MockServerHttpRequest request = MockServerHttpRequest.put("/").ifUnmodifiedSince(millis).build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); assertFalse(exchange.checkNotModified(oneMinuteAgo)); assertNull(exchange.getResponse().getStatusCode()); assertEquals(-1, exchange.getResponse().getHeaders().getLastModified()); }
@Test public void checkNotModifiedETagAndTimestamp() { String eTag = "\"Foo\""; long time = currentDate.toEpochMilli(); MockServerHttpRequest request = get("/").ifNoneMatch(eTag).ifModifiedSince(time).build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); assertTrue(exchange.checkNotModified(eTag, currentDate)); assertEquals(304, exchange.getResponse().getStatusCode().value()); assertEquals(eTag, exchange.getResponse().getHeaders().getETag()); assertEquals(time, exchange.getResponse().getHeaders().getLastModified()); }
@Test public void getResourceWithHtmlMediaType() throws Exception { MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("")); setPathWithinHandlerMapping(exchange, "foo.html"); this.handler.handle(exchange).block(TIMEOUT); HttpHeaders headers = exchange.getResponse().getHeaders(); assertEquals(MediaType.TEXT_HTML, headers.getContentType()); assertEquals("max-age=3600", headers.getCacheControl()); assertTrue(headers.containsKey("Last-Modified")); assertEquals(headers.getLastModified() / 1000, resourceLastModifiedDate("test/foo.html") / 1000); assertEquals("bytes", headers.getFirst("Accept-Ranges")); assertEquals(1, headers.get("Accept-Ranges").size()); }
@Test public void checkModifiedETagAndNotModifiedTimestamp() throws Exception { String currentETag = "\"Foo\""; String oldEtag = "\"Bar\""; long time = currentDate.toEpochMilli(); MockServerHttpRequest request = get("/").ifNoneMatch(oldEtag).ifModifiedSince(time).build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); assertFalse(exchange.checkNotModified(currentETag, currentDate)); assertNull(exchange.getResponse().getStatusCode()); assertEquals(currentETag, exchange.getResponse().getHeaders().getETag()); assertEquals(time, exchange.getResponse().getHeaders().getLastModified()); }
@Test public void getResourceNoCache() throws Exception { MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("")); setPathWithinHandlerMapping(exchange, "foo.css"); this.handler.setCacheControl(CacheControl.noStore()); this.handler.handle(exchange).block(TIMEOUT); MockServerHttpResponse response = exchange.getResponse(); assertEquals("no-store", response.getHeaders().getCacheControl()); assertTrue(response.getHeaders().containsKey("Last-Modified")); assertEquals(response.getHeaders().getLastModified() / 1000, resourceLastModifiedDate("test/foo.css") / 1000); assertEquals("bytes", response.getHeaders().getFirst("Accept-Ranges")); assertEquals(1, response.getHeaders().get("Accept-Ranges").size()); }
@Test public void getResource() throws Exception { MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("")); setPathWithinHandlerMapping(exchange, "foo.css"); this.handler.handle(exchange).block(TIMEOUT); HttpHeaders headers = exchange.getResponse().getHeaders(); assertEquals(MediaType.parseMediaType("text/css"), headers.getContentType()); assertEquals(17, headers.getContentLength()); assertEquals("max-age=3600", headers.getCacheControl()); assertTrue(headers.containsKey("Last-Modified")); assertEquals(headers.getLastModified() / 1000, resourceLastModifiedDate("test/foo.css") / 1000); assertEquals("bytes", headers.getFirst("Accept-Ranges")); assertEquals(1, headers.get("Accept-Ranges").size()); assertResponseBody(exchange, "h1 { color:red; }"); }
@Test public void getResourceFromAlternatePath() throws Exception { MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("")); setPathWithinHandlerMapping(exchange, "baz.css"); this.handler.handle(exchange).block(TIMEOUT); HttpHeaders headers = exchange.getResponse().getHeaders(); assertEquals(MediaType.parseMediaType("text/css"), headers.getContentType()); assertEquals(17, headers.getContentLength()); assertEquals("max-age=3600", headers.getCacheControl()); assertTrue(headers.containsKey("Last-Modified")); assertEquals(headers.getLastModified() / 1000, resourceLastModifiedDate("testalternatepath/baz.css") / 1000); assertEquals("bytes", headers.getFirst("Accept-Ranges")); assertEquals(1, headers.get("Accept-Ranges").size()); assertResponseBody(exchange, "h1 { color:red; }"); }