HTTPCLIENT-2189 - Cookie and Cache APIs to use Java time primitives
This commit is contained in:
parent
0a42d173ef
commit
d323e0d684
|
@ -27,6 +27,7 @@
|
||||||
package org.apache.hc.client5.http.cache;
|
package org.apache.hc.client5.http.cache;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
@ -59,13 +60,13 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
|
||||||
private static final long serialVersionUID = -6300496422359477413L;
|
private static final long serialVersionUID = -6300496422359477413L;
|
||||||
private static final String REQUEST_METHOD_HEADER_NAME = "Hc-Request-Method";
|
private static final String REQUEST_METHOD_HEADER_NAME = "Hc-Request-Method";
|
||||||
|
|
||||||
private final Date requestDate;
|
private final Instant requestDate;
|
||||||
private final Date responseDate;
|
private final Instant responseDate;
|
||||||
private final int status;
|
private final int status;
|
||||||
private final HeaderGroup responseHeaders;
|
private final HeaderGroup responseHeaders;
|
||||||
private final Resource resource;
|
private final Resource resource;
|
||||||
private final Map<String, String> variantMap;
|
private final Map<String, String> variantMap;
|
||||||
private final Date date;
|
private final Instant date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new {@link HttpCacheEntry} with variants.
|
* Create a new {@link HttpCacheEntry} with variants.
|
||||||
|
@ -84,7 +85,9 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
|
||||||
* of this parent entry; this maps a "variant key" (derived
|
* of this parent entry; this maps a "variant key" (derived
|
||||||
* from the varying request headers) to a "cache key" (where
|
* from the varying request headers) to a "cache key" (where
|
||||||
* in the cache storage the particular variant is located)
|
* in the cache storage the particular variant is located)
|
||||||
|
* @deprecated Use {{@link #HttpCacheEntry(Instant, Instant, int, Header[], Resource, Map)}}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public HttpCacheEntry(
|
public HttpCacheEntry(
|
||||||
final Date requestDate,
|
final Date requestDate,
|
||||||
final Date responseDate,
|
final Date responseDate,
|
||||||
|
@ -97,6 +100,42 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
|
||||||
Args.notNull(responseDate, "Response date");
|
Args.notNull(responseDate, "Response date");
|
||||||
Args.check(status >= HttpStatus.SC_SUCCESS, "Status code");
|
Args.check(status >= HttpStatus.SC_SUCCESS, "Status code");
|
||||||
Args.notNull(responseHeaders, "Response headers");
|
Args.notNull(responseHeaders, "Response headers");
|
||||||
|
this.requestDate = DateUtils.toInstant(requestDate);
|
||||||
|
this.responseDate = DateUtils.toInstant(responseDate);
|
||||||
|
this.status = status;
|
||||||
|
this.responseHeaders = new HeaderGroup();
|
||||||
|
this.responseHeaders.setHeaders(responseHeaders);
|
||||||
|
this.resource = resource;
|
||||||
|
this.variantMap = variantMap != null ? new HashMap<>(variantMap) : null;
|
||||||
|
this.date = parseDate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new {@link HttpCacheEntry} with variants.
|
||||||
|
*
|
||||||
|
* @param requestDate Date/time when the request was made (Used for age calculations)
|
||||||
|
* @param responseDate Date/time that the response came back (Used for age calculations)
|
||||||
|
* @param status HTTP status from origin response
|
||||||
|
* @param responseHeaders Header[] from original HTTP Response
|
||||||
|
* @param resource representing origin response body
|
||||||
|
* @param variantMap describing cache entries that are variants of this parent entry; this
|
||||||
|
* maps a "variant key" (derived from the varying request headers) to a
|
||||||
|
* "cache key" (where in the cache storage the particular variant is
|
||||||
|
* located)
|
||||||
|
* @since 5.2
|
||||||
|
*/
|
||||||
|
public HttpCacheEntry(
|
||||||
|
final Instant requestDate,
|
||||||
|
final Instant responseDate,
|
||||||
|
final int status,
|
||||||
|
final Header[] responseHeaders,
|
||||||
|
final Resource resource,
|
||||||
|
final Map<String, String> variantMap) {
|
||||||
|
super();
|
||||||
|
Args.notNull(requestDate, "Request date");
|
||||||
|
Args.notNull(responseDate, "Response date");
|
||||||
|
Args.check(status >= HttpStatus.SC_SUCCESS, "Status code");
|
||||||
|
Args.notNull(responseHeaders, "Response headers");
|
||||||
this.requestDate = requestDate;
|
this.requestDate = requestDate;
|
||||||
this.responseDate = responseDate;
|
this.responseDate = responseDate;
|
||||||
this.status = status;
|
this.status = status;
|
||||||
|
@ -107,6 +146,21 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
|
||||||
this.date = parseDate();
|
this.date = parseDate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new {@link HttpCacheEntry}.
|
||||||
|
*
|
||||||
|
* @param requestDate Date/time when the request was made (Used for age calculations)
|
||||||
|
* @param responseDate Date/time that the response came back (Used for age calculations)
|
||||||
|
* @param status HTTP status from origin response
|
||||||
|
* @param responseHeaders Header[] from original HTTP Response
|
||||||
|
* @param resource representing origin response body
|
||||||
|
* @deprecated {{@link #HttpCacheEntry(Instant, Instant, int, Header[], Resource)}}
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public HttpCacheEntry(final Date requestDate, final Date responseDate, final int status,
|
||||||
|
final Header[] responseHeaders, final Resource resource) {
|
||||||
|
this(requestDate, responseDate, status, responseHeaders, resource, new HashMap<>());
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Create a new {@link HttpCacheEntry}.
|
* Create a new {@link HttpCacheEntry}.
|
||||||
*
|
*
|
||||||
|
@ -122,17 +176,17 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
|
||||||
* Header[] from original HTTP Response
|
* Header[] from original HTTP Response
|
||||||
* @param resource representing origin response body
|
* @param resource representing origin response body
|
||||||
*/
|
*/
|
||||||
public HttpCacheEntry(final Date requestDate, final Date responseDate, final int status,
|
public HttpCacheEntry(final Instant requestDate, final Instant responseDate, final int status,
|
||||||
final Header[] responseHeaders, final Resource resource) {
|
final Header[] responseHeaders, final Resource resource) {
|
||||||
this(requestDate, responseDate, status, responseHeaders, resource, new HashMap<>());
|
this(requestDate, responseDate, status, responseHeaders, resource, new HashMap<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find the "Date" response header and parse it into a java.util.Date
|
* Find the "Date" response header and parse it into a {@link Instant}
|
||||||
* @return the Date value of the header or null if the header is not present
|
* @return the Date value of the header or null if the header is not present
|
||||||
*/
|
*/
|
||||||
private Date parseDate() {
|
private Instant parseDate() {
|
||||||
return DateUtils.toDate(DateUtils.parseStandardDate(this, HttpHeaders.DATE));
|
return DateUtils.parseStandardDate(this, HttpHeaders.DATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -146,16 +200,40 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
|
||||||
* Returns the time the associated origin request was initiated by the
|
* Returns the time the associated origin request was initiated by the
|
||||||
* caching module.
|
* caching module.
|
||||||
* @return {@link Date}
|
* @return {@link Date}
|
||||||
|
* @deprecated USe {@link #getRequestInstant()}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public Date getRequestDate() {
|
public Date getRequestDate() {
|
||||||
|
return DateUtils.toDate(requestDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the time the associated origin request was initiated by the
|
||||||
|
* caching module.
|
||||||
|
* @return {@link Instant}
|
||||||
|
* @since 5.2
|
||||||
|
*/
|
||||||
|
public Instant getRequestInstant() {
|
||||||
return requestDate;
|
return requestDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the time the origin response was received by the caching module.
|
* Returns the time the origin response was received by the caching module.
|
||||||
* @return {@link Date}
|
* @return {@link Date}
|
||||||
|
* @deprecated Use {@link #getResponseInstant()}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public Date getResponseDate() {
|
public Date getResponseDate() {
|
||||||
|
return DateUtils.toDate(responseDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the time the origin response was received by the caching module.
|
||||||
|
*
|
||||||
|
* @return {@link Instant}
|
||||||
|
* @since 5.2
|
||||||
|
*/
|
||||||
|
public Instant getResponseInstant() {
|
||||||
return responseDate;
|
return responseDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,6 +331,10 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
|
||||||
* @since 4.3
|
* @since 4.3
|
||||||
*/
|
*/
|
||||||
public Date getDate() {
|
public Date getDate() {
|
||||||
|
return DateUtils.toDate(date);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Instant getInstant() {
|
||||||
return date;
|
return date;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ package org.apache.hc.client5.http.impl.cache;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InterruptedIOException;
|
import java.io.InterruptedIOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.util.Date;
|
import java.time.Instant;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
@ -309,7 +309,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
|
||||||
final AsyncExecChain chain,
|
final AsyncExecChain chain,
|
||||||
final AsyncExecCallback asyncExecCallback) {
|
final AsyncExecCallback asyncExecCallback) {
|
||||||
LOG.debug("Calling the backend");
|
LOG.debug("Calling the backend");
|
||||||
final Date requestDate = getCurrentDate();
|
final Instant requestDate = getCurrentDate();
|
||||||
final AtomicReference<AsyncExecCallback> callbackRef = new AtomicReference<>();
|
final AtomicReference<AsyncExecCallback> callbackRef = new AtomicReference<>();
|
||||||
chainProceed(request, entityProducer, scope, chain, new AsyncExecCallback() {
|
chainProceed(request, entityProducer, scope, chain, new AsyncExecCallback() {
|
||||||
|
|
||||||
|
@ -317,7 +317,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
|
||||||
public AsyncDataConsumer handleResponse(
|
public AsyncDataConsumer handleResponse(
|
||||||
final HttpResponse backendResponse,
|
final HttpResponse backendResponse,
|
||||||
final EntityDetails entityDetails) throws HttpException, IOException {
|
final EntityDetails entityDetails) throws HttpException, IOException {
|
||||||
final Date responseDate = getCurrentDate();
|
final Instant responseDate = getCurrentDate();
|
||||||
backendResponse.addHeader("Via", generateViaHeader(backendResponse));
|
backendResponse.addHeader("Via", generateViaHeader(backendResponse));
|
||||||
|
|
||||||
final AsyncExecCallback callback = new BackendResponseHandler(target, request, requestDate, responseDate, scope, asyncExecCallback);
|
final AsyncExecCallback callback = new BackendResponseHandler(target, request, requestDate, responseDate, scope, asyncExecCallback);
|
||||||
|
@ -446,8 +446,8 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
|
||||||
|
|
||||||
private final HttpHost target;
|
private final HttpHost target;
|
||||||
private final HttpRequest request;
|
private final HttpRequest request;
|
||||||
private final Date requestDate;
|
private final Instant requestDate;
|
||||||
private final Date responseDate;
|
private final Instant responseDate;
|
||||||
private final AsyncExecChain.Scope scope;
|
private final AsyncExecChain.Scope scope;
|
||||||
private final AsyncExecCallback asyncExecCallback;
|
private final AsyncExecCallback asyncExecCallback;
|
||||||
private final AtomicReference<CachingAsyncDataConsumer> cachingConsumerRef;
|
private final AtomicReference<CachingAsyncDataConsumer> cachingConsumerRef;
|
||||||
|
@ -455,8 +455,8 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
|
||||||
BackendResponseHandler(
|
BackendResponseHandler(
|
||||||
final HttpHost target,
|
final HttpHost target,
|
||||||
final HttpRequest request,
|
final HttpRequest request,
|
||||||
final Date requestDate,
|
final Instant requestDate,
|
||||||
final Date responseDate,
|
final Instant responseDate,
|
||||||
final AsyncExecChain.Scope scope,
|
final AsyncExecChain.Scope scope,
|
||||||
final AsyncExecCallback asyncExecCallback) {
|
final AsyncExecCallback asyncExecCallback) {
|
||||||
this.target = target;
|
this.target = target;
|
||||||
|
@ -525,7 +525,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
|
||||||
asyncExecCallback.handleInformationResponse(response);
|
asyncExecCallback.handleInformationResponse(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
void triggerNewCacheEntryResponse(final HttpResponse backendResponse, final Date responseDate, final ByteArrayBuffer buffer) {
|
void triggerNewCacheEntryResponse(final HttpResponse backendResponse, final Instant responseDate, final ByteArrayBuffer buffer) {
|
||||||
final CancellableDependency operation = scope.cancellableDependency;
|
final CancellableDependency operation = scope.cancellableDependency;
|
||||||
operation.setDependency(responseCache.createCacheEntry(
|
operation.setDependency(responseCache.createCacheEntry(
|
||||||
target,
|
target,
|
||||||
|
@ -622,7 +622,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
|
||||||
final HttpCacheEntry entry) {
|
final HttpCacheEntry entry) {
|
||||||
final HttpClientContext context = scope.clientContext;
|
final HttpClientContext context = scope.clientContext;
|
||||||
recordCacheHit(target, request);
|
recordCacheHit(target, request);
|
||||||
final Date now = getCurrentDate();
|
final Instant now = getCurrentDate();
|
||||||
if (suitabilityChecker.canCachedResponseBeUsed(target, request, entry, now)) {
|
if (suitabilityChecker.canCachedResponseBeUsed(target, request, entry, now)) {
|
||||||
LOG.debug("Cache hit");
|
LOG.debug("Cache hit");
|
||||||
try {
|
try {
|
||||||
|
@ -690,7 +690,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
|
||||||
final AsyncExecChain chain,
|
final AsyncExecChain chain,
|
||||||
final AsyncExecCallback asyncExecCallback,
|
final AsyncExecCallback asyncExecCallback,
|
||||||
final HttpCacheEntry cacheEntry) {
|
final HttpCacheEntry cacheEntry) {
|
||||||
final Date requestDate = getCurrentDate();
|
final Instant requestDate = getCurrentDate();
|
||||||
final HttpRequest conditionalRequest = conditionalRequestBuilder.buildConditionalRequest(
|
final HttpRequest conditionalRequest = conditionalRequestBuilder.buildConditionalRequest(
|
||||||
BasicRequestBuilder.copy(scope.originalRequest).build(),
|
BasicRequestBuilder.copy(scope.originalRequest).build(),
|
||||||
cacheEntry);
|
cacheEntry);
|
||||||
|
@ -698,7 +698,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
|
||||||
|
|
||||||
final AtomicReference<AsyncExecCallback> callbackRef = new AtomicReference<>();
|
final AtomicReference<AsyncExecCallback> callbackRef = new AtomicReference<>();
|
||||||
|
|
||||||
void triggerUpdatedCacheEntryResponse(final HttpResponse backendResponse, final Date responseDate) {
|
void triggerUpdatedCacheEntryResponse(final HttpResponse backendResponse, final Instant responseDate) {
|
||||||
final CancellableDependency operation = scope.cancellableDependency;
|
final CancellableDependency operation = scope.cancellableDependency;
|
||||||
recordCacheUpdate(scope.clientContext);
|
recordCacheUpdate(scope.clientContext);
|
||||||
operation.setDependency(responseCache.updateCacheEntry(
|
operation.setDependency(responseCache.updateCacheEntry(
|
||||||
|
@ -713,7 +713,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
|
||||||
@Override
|
@Override
|
||||||
public void completed(final HttpCacheEntry updatedEntry) {
|
public void completed(final HttpCacheEntry updatedEntry) {
|
||||||
if (suitabilityChecker.isConditional(request)
|
if (suitabilityChecker.isConditional(request)
|
||||||
&& suitabilityChecker.allConditionalsMatch(request, updatedEntry, new Date())) {
|
&& suitabilityChecker.allConditionalsMatch(request, updatedEntry, Instant.now())) {
|
||||||
final SimpleHttpResponse cacheResponse = responseGenerator.generateNotModifiedResponse(updatedEntry);
|
final SimpleHttpResponse cacheResponse = responseGenerator.generateNotModifiedResponse(updatedEntry);
|
||||||
triggerResponse(cacheResponse, scope, asyncExecCallback);
|
triggerResponse(cacheResponse, scope, asyncExecCallback);
|
||||||
} else {
|
} else {
|
||||||
|
@ -749,7 +749,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AsyncExecCallback evaluateResponse(final HttpResponse backendResponse, final Date responseDate) {
|
AsyncExecCallback evaluateResponse(final HttpResponse backendResponse, final Instant responseDate) {
|
||||||
backendResponse.addHeader(HeaderConstants.VIA, generateViaHeader(backendResponse));
|
backendResponse.addHeader(HeaderConstants.VIA, generateViaHeader(backendResponse));
|
||||||
|
|
||||||
final int statusCode = backendResponse.getCode();
|
final int statusCode = backendResponse.getCode();
|
||||||
|
@ -772,7 +772,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
|
||||||
final HttpResponse backendResponse1,
|
final HttpResponse backendResponse1,
|
||||||
final EntityDetails entityDetails) throws HttpException, IOException {
|
final EntityDetails entityDetails) throws HttpException, IOException {
|
||||||
|
|
||||||
final Date responseDate1 = getCurrentDate();
|
final Instant responseDate1 = getCurrentDate();
|
||||||
|
|
||||||
final AsyncExecCallback callback1;
|
final AsyncExecCallback callback1;
|
||||||
if (revalidationResponseIsTooOld(backendResponse1, cacheEntry)
|
if (revalidationResponseIsTooOld(backendResponse1, cacheEntry)
|
||||||
|
@ -787,7 +787,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
|
||||||
public AsyncDataConsumer handleResponse(
|
public AsyncDataConsumer handleResponse(
|
||||||
final HttpResponse backendResponse2,
|
final HttpResponse backendResponse2,
|
||||||
final EntityDetails entityDetails1) throws HttpException, IOException {
|
final EntityDetails entityDetails1) throws HttpException, IOException {
|
||||||
final Date responseDate2 = getCurrentDate();
|
final Instant responseDate2 = getCurrentDate();
|
||||||
final AsyncExecCallback callback2 = evaluateResponse(backendResponse2, responseDate2);
|
final AsyncExecCallback callback2 = evaluateResponse(backendResponse2, responseDate2);
|
||||||
callbackRef.set(callback2);
|
callbackRef.set(callback2);
|
||||||
return callback2.handleResponse(backendResponse2, entityDetails1);
|
return callback2.handleResponse(backendResponse2, entityDetails1);
|
||||||
|
@ -920,12 +920,12 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
|
||||||
BasicRequestBuilder.copy(request).build(),
|
BasicRequestBuilder.copy(request).build(),
|
||||||
variants);
|
variants);
|
||||||
|
|
||||||
final Date requestDate = getCurrentDate();
|
final Instant requestDate = getCurrentDate();
|
||||||
chainProceed(conditionalRequest, entityProducer, scope, chain, new AsyncExecCallback() {
|
chainProceed(conditionalRequest, entityProducer, scope, chain, new AsyncExecCallback() {
|
||||||
|
|
||||||
final AtomicReference<AsyncExecCallback> callbackRef = new AtomicReference<>();
|
final AtomicReference<AsyncExecCallback> callbackRef = new AtomicReference<>();
|
||||||
|
|
||||||
void updateVariantCacheEntry(final HttpResponse backendResponse, final Date responseDate, final Variant matchingVariant) {
|
void updateVariantCacheEntry(final HttpResponse backendResponse, final Instant responseDate, final Variant matchingVariant) {
|
||||||
recordCacheUpdate(scope.clientContext);
|
recordCacheUpdate(scope.clientContext);
|
||||||
operation.setDependency(responseCache.updateVariantCacheEntry(
|
operation.setDependency(responseCache.updateVariantCacheEntry(
|
||||||
target,
|
target,
|
||||||
|
@ -989,7 +989,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
|
||||||
public AsyncDataConsumer handleResponse(
|
public AsyncDataConsumer handleResponse(
|
||||||
final HttpResponse backendResponse,
|
final HttpResponse backendResponse,
|
||||||
final EntityDetails entityDetails) throws HttpException, IOException {
|
final EntityDetails entityDetails) throws HttpException, IOException {
|
||||||
final Date responseDate = getCurrentDate();
|
final Instant responseDate = getCurrentDate();
|
||||||
backendResponse.addHeader("Via", generateViaHeader(backendResponse));
|
backendResponse.addHeader("Via", generateViaHeader(backendResponse));
|
||||||
|
|
||||||
final AsyncExecCallback callback;
|
final AsyncExecCallback callback;
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hc.client5.http.impl.cache;
|
package org.apache.hc.client5.http.impl.cache;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.time.Instant;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -309,8 +309,8 @@ class BasicHttpAsyncCache implements HttpAsyncCache {
|
||||||
final HttpRequest request,
|
final HttpRequest request,
|
||||||
final HttpCacheEntry stale,
|
final HttpCacheEntry stale,
|
||||||
final HttpResponse originResponse,
|
final HttpResponse originResponse,
|
||||||
final Date requestSent,
|
final Instant requestSent,
|
||||||
final Date responseReceived,
|
final Instant responseReceived,
|
||||||
final FutureCallback<HttpCacheEntry> callback) {
|
final FutureCallback<HttpCacheEntry> callback) {
|
||||||
if (LOG.isDebugEnabled()) {
|
if (LOG.isDebugEnabled()) {
|
||||||
LOG.debug("Update cache entry: {}; {}", host, new RequestLine(request));
|
LOG.debug("Update cache entry: {}; {}", host, new RequestLine(request));
|
||||||
|
@ -356,8 +356,8 @@ class BasicHttpAsyncCache implements HttpAsyncCache {
|
||||||
final HttpRequest request,
|
final HttpRequest request,
|
||||||
final HttpResponse originResponse,
|
final HttpResponse originResponse,
|
||||||
final Variant variant,
|
final Variant variant,
|
||||||
final Date requestSent,
|
final Instant requestSent,
|
||||||
final Date responseReceived,
|
final Instant responseReceived,
|
||||||
final FutureCallback<HttpCacheEntry> callback) {
|
final FutureCallback<HttpCacheEntry> callback) {
|
||||||
if (LOG.isDebugEnabled()) {
|
if (LOG.isDebugEnabled()) {
|
||||||
LOG.debug("Update variant cache entry: {}; {} / {}", host, new RequestLine(request), variant);
|
LOG.debug("Update variant cache entry: {}; {} / {}", host, new RequestLine(request), variant);
|
||||||
|
@ -404,8 +404,8 @@ class BasicHttpAsyncCache implements HttpAsyncCache {
|
||||||
final HttpRequest request,
|
final HttpRequest request,
|
||||||
final HttpResponse originResponse,
|
final HttpResponse originResponse,
|
||||||
final ByteArrayBuffer content,
|
final ByteArrayBuffer content,
|
||||||
final Date requestSent,
|
final Instant requestSent,
|
||||||
final Date responseReceived,
|
final Instant responseReceived,
|
||||||
final FutureCallback<HttpCacheEntry> callback) {
|
final FutureCallback<HttpCacheEntry> callback) {
|
||||||
if (LOG.isDebugEnabled()) {
|
if (LOG.isDebugEnabled()) {
|
||||||
LOG.debug("Create cache entry: {}; {}", host, new RequestLine(request));
|
LOG.debug("Create cache entry: {}; {}", host, new RequestLine(request));
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hc.client5.http.impl.cache;
|
package org.apache.hc.client5.http.impl.cache;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.time.Instant;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ -204,8 +204,8 @@ class BasicHttpCache implements HttpCache {
|
||||||
final HttpRequest request,
|
final HttpRequest request,
|
||||||
final HttpCacheEntry stale,
|
final HttpCacheEntry stale,
|
||||||
final HttpResponse originResponse,
|
final HttpResponse originResponse,
|
||||||
final Date requestSent,
|
final Instant requestSent,
|
||||||
final Date responseReceived) {
|
final Instant responseReceived) {
|
||||||
if (LOG.isDebugEnabled()) {
|
if (LOG.isDebugEnabled()) {
|
||||||
LOG.debug("Update cache entry: {}; {}", host, new RequestLine(request));
|
LOG.debug("Update cache entry: {}; {}", host, new RequestLine(request));
|
||||||
}
|
}
|
||||||
|
@ -233,8 +233,8 @@ class BasicHttpCache implements HttpCache {
|
||||||
final HttpRequest request,
|
final HttpRequest request,
|
||||||
final HttpResponse originResponse,
|
final HttpResponse originResponse,
|
||||||
final Variant variant,
|
final Variant variant,
|
||||||
final Date requestSent,
|
final Instant requestSent,
|
||||||
final Date responseReceived) {
|
final Instant responseReceived) {
|
||||||
if (LOG.isDebugEnabled()) {
|
if (LOG.isDebugEnabled()) {
|
||||||
LOG.debug("Update variant cache entry: {}; {} / {}", host, new RequestLine(request), variant);
|
LOG.debug("Update variant cache entry: {}; {} / {}", host, new RequestLine(request), variant);
|
||||||
}
|
}
|
||||||
|
@ -263,8 +263,8 @@ class BasicHttpCache implements HttpCache {
|
||||||
final HttpRequest request,
|
final HttpRequest request,
|
||||||
final HttpResponse originResponse,
|
final HttpResponse originResponse,
|
||||||
final ByteArrayBuffer content,
|
final ByteArrayBuffer content,
|
||||||
final Date requestSent,
|
final Instant requestSent,
|
||||||
final Date responseReceived) {
|
final Instant responseReceived) {
|
||||||
if (LOG.isDebugEnabled()) {
|
if (LOG.isDebugEnabled()) {
|
||||||
LOG.debug("Create cache entry: {}; {}", host, new RequestLine(request));
|
LOG.debug("Create cache entry: {}; {}", host, new RequestLine(request));
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,6 +90,7 @@ public final class ByteArrayCacheEntrySerializer implements HttpCacheEntrySerial
|
||||||
Pattern.compile("^(\\[L)?org\\.apache\\.hc\\.(.*)"),
|
Pattern.compile("^(\\[L)?org\\.apache\\.hc\\.(.*)"),
|
||||||
Pattern.compile("^(?:\\[+L)?java\\.util\\..*$"),
|
Pattern.compile("^(?:\\[+L)?java\\.util\\..*$"),
|
||||||
Pattern.compile("^(?:\\[+L)?java\\.lang\\..*$"),
|
Pattern.compile("^(?:\\[+L)?java\\.lang\\..*$"),
|
||||||
|
Pattern.compile("^(?:\\[+L)?java\\.time\\..*$"), // java 8 time
|
||||||
Pattern.compile("^\\[+Z$"), // boolean
|
Pattern.compile("^\\[+Z$"), // boolean
|
||||||
Pattern.compile("^\\[+B$"), // byte
|
Pattern.compile("^\\[+B$"), // byte
|
||||||
Pattern.compile("^\\[+C$"), // char
|
Pattern.compile("^\\[+C$"), // char
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hc.client5.http.impl.cache;
|
package org.apache.hc.client5.http.impl.cache;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.time.Instant;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -69,8 +69,8 @@ class CacheUpdateHandler {
|
||||||
final HttpRequest request,
|
final HttpRequest request,
|
||||||
final HttpResponse originResponse,
|
final HttpResponse originResponse,
|
||||||
final ByteArrayBuffer content,
|
final ByteArrayBuffer content,
|
||||||
final Date requestSent,
|
final Instant requestSent,
|
||||||
final Date responseReceived) throws ResourceIOException {
|
final Instant responseReceived) throws ResourceIOException {
|
||||||
return new HttpCacheEntry(
|
return new HttpCacheEntry(
|
||||||
requestSent,
|
requestSent,
|
||||||
responseReceived,
|
responseReceived,
|
||||||
|
@ -86,8 +86,8 @@ class CacheUpdateHandler {
|
||||||
public HttpCacheEntry updateCacheEntry(
|
public HttpCacheEntry updateCacheEntry(
|
||||||
final String requestId,
|
final String requestId,
|
||||||
final HttpCacheEntry entry,
|
final HttpCacheEntry entry,
|
||||||
final Date requestDate,
|
final Instant requestDate,
|
||||||
final Date responseDate,
|
final Instant responseDate,
|
||||||
final HttpResponse response) throws ResourceIOException {
|
final HttpResponse response) throws ResourceIOException {
|
||||||
Args.check(response.getCode() == HttpStatus.SC_NOT_MODIFIED,
|
Args.check(response.getCode() == HttpStatus.SC_NOT_MODIFIED,
|
||||||
"Response must have 304 status code");
|
"Response must have 304 status code");
|
||||||
|
@ -103,7 +103,7 @@ class CacheUpdateHandler {
|
||||||
mergedHeaders,
|
mergedHeaders,
|
||||||
resource);
|
resource);
|
||||||
}
|
}
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public HttpCacheEntry updateParentCacheEntry(
|
public HttpCacheEntry updateParentCacheEntry(
|
||||||
final String requestId,
|
final String requestId,
|
||||||
final HttpCacheEntry existing,
|
final HttpCacheEntry existing,
|
||||||
|
@ -122,8 +122,8 @@ class CacheUpdateHandler {
|
||||||
final Map<String,String> variantMap = new HashMap<>(src.getVariantMap());
|
final Map<String,String> variantMap = new HashMap<>(src.getVariantMap());
|
||||||
variantMap.put(variantKey, variantCacheKey);
|
variantMap.put(variantKey, variantCacheKey);
|
||||||
return new HttpCacheEntry(
|
return new HttpCacheEntry(
|
||||||
src.getRequestDate(),
|
src.getRequestInstant(),
|
||||||
src.getResponseDate(),
|
src.getResponseInstant(),
|
||||||
src.getStatus(),
|
src.getStatus(),
|
||||||
src.getHeaders(),
|
src.getHeaders(),
|
||||||
resource,
|
resource,
|
||||||
|
|
|
@ -26,8 +26,8 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hc.client5.http.impl.cache;
|
package org.apache.hc.client5.http.impl.cache;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
import org.apache.hc.client5.http.cache.HeaderConstants;
|
import org.apache.hc.client5.http.cache.HeaderConstants;
|
||||||
|
@ -50,7 +50,8 @@ class CacheValidityPolicy {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimeValue getCurrentAge(final HttpCacheEntry entry, final Date now) {
|
|
||||||
|
public TimeValue getCurrentAge(final HttpCacheEntry entry, final Instant now) {
|
||||||
return TimeValue.ofSeconds(getCorrectedInitialAge(entry).toSeconds() + getResidentTime(entry, now).toSeconds());
|
return TimeValue.ofSeconds(getCorrectedInitialAge(entry).toSeconds() + getResidentTime(entry, now).toSeconds());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +61,7 @@ class CacheValidityPolicy {
|
||||||
return TimeValue.ofSeconds(maxAge);
|
return TimeValue.ofSeconds(maxAge);
|
||||||
}
|
}
|
||||||
|
|
||||||
final Date dateValue = entry.getDate();
|
final Instant dateValue = entry.getInstant();
|
||||||
if (dateValue == null) {
|
if (dateValue == null) {
|
||||||
return TimeValue.ZERO_MILLISECONDS;
|
return TimeValue.ZERO_MILLISECONDS;
|
||||||
}
|
}
|
||||||
|
@ -69,11 +70,11 @@ class CacheValidityPolicy {
|
||||||
if (expiry == null) {
|
if (expiry == null) {
|
||||||
return TimeValue.ZERO_MILLISECONDS;
|
return TimeValue.ZERO_MILLISECONDS;
|
||||||
}
|
}
|
||||||
final long diff = expiry.toEpochMilli() - dateValue.getTime();
|
final Duration diff = Duration.between(dateValue, expiry);
|
||||||
return TimeValue.ofSeconds(diff / 1000);
|
return TimeValue.ofSeconds(diff.getSeconds());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isResponseFresh(final HttpCacheEntry entry, final Date now) {
|
public boolean isResponseFresh(final HttpCacheEntry entry, final Instant now) {
|
||||||
return getCurrentAge(entry, now).compareTo(getFreshnessLifetime(entry)) == -1;
|
return getCurrentAge(entry, now).compareTo(getFreshnessLifetime(entry)) == -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,21 +93,22 @@ class CacheValidityPolicy {
|
||||||
* @return {@code true} if the response is fresh
|
* @return {@code true} if the response is fresh
|
||||||
*/
|
*/
|
||||||
public boolean isResponseHeuristicallyFresh(final HttpCacheEntry entry,
|
public boolean isResponseHeuristicallyFresh(final HttpCacheEntry entry,
|
||||||
final Date now, final float coefficient, final TimeValue defaultLifetime) {
|
final Instant now, final float coefficient, final TimeValue defaultLifetime) {
|
||||||
return getCurrentAge(entry, now).compareTo(getHeuristicFreshnessLifetime(entry, coefficient, defaultLifetime)) == -1;
|
return getCurrentAge(entry, now).compareTo(getHeuristicFreshnessLifetime(entry, coefficient, defaultLifetime)) == -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimeValue getHeuristicFreshnessLifetime(final HttpCacheEntry entry,
|
public TimeValue getHeuristicFreshnessLifetime(final HttpCacheEntry entry,
|
||||||
final float coefficient, final TimeValue defaultLifetime) {
|
final float coefficient, final TimeValue defaultLifetime) {
|
||||||
final Date dateValue = entry.getDate();
|
final Instant dateValue = entry.getInstant();
|
||||||
final Instant lastModifiedValue = DateUtils.parseStandardDate(entry, HeaderConstants.LAST_MODIFIED);
|
final Instant lastModifiedValue = DateUtils.parseStandardDate(entry, HeaderConstants.LAST_MODIFIED);
|
||||||
|
|
||||||
if (dateValue != null && lastModifiedValue != null) {
|
if (dateValue != null && lastModifiedValue != null) {
|
||||||
final long diff = dateValue.getTime() - lastModifiedValue.toEpochMilli();
|
final Duration diff = Duration.between(lastModifiedValue, dateValue);
|
||||||
if (diff < 0) {
|
|
||||||
|
if (diff.isNegative()) {
|
||||||
return TimeValue.ZERO_MILLISECONDS;
|
return TimeValue.ZERO_MILLISECONDS;
|
||||||
}
|
}
|
||||||
return TimeValue.ofSeconds((long) (coefficient * diff / 1000));
|
return TimeValue.ofSeconds((long) (coefficient * diff.getSeconds()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return defaultLifetime;
|
return defaultLifetime;
|
||||||
|
@ -125,7 +127,7 @@ class CacheValidityPolicy {
|
||||||
return hasCacheControlDirective(entry, HeaderConstants.CACHE_CONTROL_PROXY_REVALIDATE);
|
return hasCacheControlDirective(entry, HeaderConstants.CACHE_CONTROL_PROXY_REVALIDATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean mayReturnStaleWhileRevalidating(final HttpCacheEntry entry, final Date now) {
|
public boolean mayReturnStaleWhileRevalidating(final HttpCacheEntry entry, final Instant now) {
|
||||||
final Iterator<HeaderElement> it = MessageSupport.iterate(entry, HeaderConstants.CACHE_CONTROL);
|
final Iterator<HeaderElement> it = MessageSupport.iterate(entry, HeaderConstants.CACHE_CONTROL);
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
final HeaderElement elt = it.next();
|
final HeaderElement elt = it.next();
|
||||||
|
@ -145,7 +147,7 @@ class CacheValidityPolicy {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean mayReturnStaleIfError(final HttpRequest request, final HttpCacheEntry entry, final Date now) {
|
public boolean mayReturnStaleIfError(final HttpRequest request, final HttpCacheEntry entry, final Instant now) {
|
||||||
final TimeValue staleness = getStaleness(entry, now);
|
final TimeValue staleness = getStaleness(entry, now);
|
||||||
return mayReturnStaleIfError(request, HeaderConstants.CACHE_CONTROL, staleness)
|
return mayReturnStaleIfError(request, HeaderConstants.CACHE_CONTROL, staleness)
|
||||||
|| mayReturnStaleIfError(entry, HeaderConstants.CACHE_CONTROL, staleness);
|
|| mayReturnStaleIfError(entry, HeaderConstants.CACHE_CONTROL, staleness);
|
||||||
|
@ -198,15 +200,15 @@ class CacheValidityPolicy {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected TimeValue getApparentAge(final HttpCacheEntry entry) {
|
protected TimeValue getApparentAge(final HttpCacheEntry entry) {
|
||||||
final Date dateValue = entry.getDate();
|
final Instant dateValue = entry.getInstant();
|
||||||
if (dateValue == null) {
|
if (dateValue == null) {
|
||||||
return MAX_AGE;
|
return MAX_AGE;
|
||||||
}
|
}
|
||||||
final long diff = entry.getResponseDate().getTime() - dateValue.getTime();
|
final Duration diff = Duration.between(dateValue, entry.getResponseInstant());
|
||||||
if (diff < 0L) {
|
if (diff.isNegative()) {
|
||||||
return TimeValue.ZERO_MILLISECONDS;
|
return TimeValue.ZERO_MILLISECONDS;
|
||||||
}
|
}
|
||||||
return TimeValue.ofSeconds(diff / 1000);
|
return TimeValue.ofSeconds(diff.getSeconds());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected long getAgeValue(final HttpCacheEntry entry) {
|
protected long getAgeValue(final HttpCacheEntry entry) {
|
||||||
|
@ -234,19 +236,20 @@ class CacheValidityPolicy {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected TimeValue getResponseDelay(final HttpCacheEntry entry) {
|
protected TimeValue getResponseDelay(final HttpCacheEntry entry) {
|
||||||
final long diff = entry.getResponseDate().getTime() - entry.getRequestDate().getTime();
|
final Duration diff = Duration.between(entry.getRequestInstant(), entry.getResponseInstant());
|
||||||
return TimeValue.ofSeconds(diff / 1000);
|
return TimeValue.ofSeconds(diff.getSeconds());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected TimeValue getCorrectedInitialAge(final HttpCacheEntry entry) {
|
protected TimeValue getCorrectedInitialAge(final HttpCacheEntry entry) {
|
||||||
return TimeValue.ofSeconds(getCorrectedReceivedAge(entry).toSeconds() + getResponseDelay(entry).toSeconds());
|
return TimeValue.ofSeconds(getCorrectedReceivedAge(entry).toSeconds() + getResponseDelay(entry).toSeconds());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected TimeValue getResidentTime(final HttpCacheEntry entry, final Date now) {
|
protected TimeValue getResidentTime(final HttpCacheEntry entry, final Instant now) {
|
||||||
final long diff = now.getTime() - entry.getResponseDate().getTime();
|
final Duration diff = Duration.between(entry.getResponseInstant(), now);
|
||||||
return TimeValue.ofSeconds(diff / 1000);
|
return TimeValue.ofSeconds(diff.getSeconds());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected long getMaxAge(final HttpCacheEntry entry) {
|
protected long getMaxAge(final HttpCacheEntry entry) {
|
||||||
// This is a header value, we leave as-is
|
// This is a header value, we leave as-is
|
||||||
long maxAge = -1;
|
long maxAge = -1;
|
||||||
|
@ -279,7 +282,7 @@ class CacheValidityPolicy {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimeValue getStaleness(final HttpCacheEntry entry, final Date now) {
|
public TimeValue getStaleness(final HttpCacheEntry entry, final Instant now) {
|
||||||
final TimeValue age = getCurrentAge(entry, now);
|
final TimeValue age = getCurrentAge(entry, now);
|
||||||
final TimeValue freshness = getFreshnessLifetime(entry);
|
final TimeValue freshness = getFreshnessLifetime(entry);
|
||||||
if (age.compareTo(freshness) <= 0) {
|
if (age.compareTo(freshness) <= 0) {
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
package org.apache.hc.client5.http.impl.cache;
|
package org.apache.hc.client5.http.impl.cache;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
|
import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
|
||||||
import org.apache.hc.client5.http.cache.HeaderConstants;
|
import org.apache.hc.client5.http.cache.HeaderConstants;
|
||||||
|
@ -65,7 +64,7 @@ class CachedHttpResponseGenerator {
|
||||||
* @return {@link SimpleHttpResponse} constructed response
|
* @return {@link SimpleHttpResponse} constructed response
|
||||||
*/
|
*/
|
||||||
SimpleHttpResponse generateResponse(final HttpRequest request, final HttpCacheEntry entry) throws ResourceIOException {
|
SimpleHttpResponse generateResponse(final HttpRequest request, final HttpCacheEntry entry) throws ResourceIOException {
|
||||||
final Date now = new Date();
|
final Instant now =Instant.now();
|
||||||
final SimpleHttpResponse response = new SimpleHttpResponse(entry.getStatus());
|
final SimpleHttpResponse response = new SimpleHttpResponse(entry.getStatus());
|
||||||
response.setVersion(HttpVersion.DEFAULT);
|
response.setVersion(HttpVersion.DEFAULT);
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
package org.apache.hc.client5.http.impl.cache;
|
package org.apache.hc.client5.http.impl.cache;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
import org.apache.hc.client5.http.cache.HeaderConstants;
|
import org.apache.hc.client5.http.cache.HeaderConstants;
|
||||||
|
@ -71,7 +70,7 @@ class CachedResponseSuitabilityChecker {
|
||||||
this(new CacheValidityPolicy(), config);
|
this(new CacheValidityPolicy(), config);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isFreshEnough(final HttpCacheEntry entry, final HttpRequest request, final Date now) {
|
private boolean isFreshEnough(final HttpCacheEntry entry, final HttpRequest request, final Instant now) {
|
||||||
if (validityStrategy.isResponseFresh(entry, now)) {
|
if (validityStrategy.isResponseFresh(entry, now)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -142,7 +141,7 @@ class CachedResponseSuitabilityChecker {
|
||||||
* Right now in time
|
* Right now in time
|
||||||
* @return boolean yes/no answer
|
* @return boolean yes/no answer
|
||||||
*/
|
*/
|
||||||
public boolean canCachedResponseBeUsed(final HttpHost host, final HttpRequest request, final HttpCacheEntry entry, final Date now) {
|
public boolean canCachedResponseBeUsed(final HttpHost host, final HttpRequest request, final HttpCacheEntry entry, final Instant now) {
|
||||||
if (!isFreshEnough(entry, request, now)) {
|
if (!isFreshEnough(entry, request, now)) {
|
||||||
LOG.debug("Cache entry is not fresh enough");
|
LOG.debug("Cache entry is not fresh enough");
|
||||||
return false;
|
return false;
|
||||||
|
@ -274,13 +273,12 @@ class CachedResponseSuitabilityChecker {
|
||||||
* @param now right NOW in time
|
* @param now right NOW in time
|
||||||
* @return {@code true} if the request matches all conditionals
|
* @return {@code true} if the request matches all conditionals
|
||||||
*/
|
*/
|
||||||
public boolean allConditionalsMatch(final HttpRequest request, final HttpCacheEntry entry, final Date now) {
|
public boolean allConditionalsMatch(final HttpRequest request, final HttpCacheEntry entry, final Instant now) {
|
||||||
final boolean hasEtagValidator = hasSupportedEtagValidator(request);
|
final boolean hasEtagValidator = hasSupportedEtagValidator(request);
|
||||||
final boolean hasLastModifiedValidator = hasSupportedLastModifiedValidator(request);
|
final boolean hasLastModifiedValidator = hasSupportedLastModifiedValidator(request);
|
||||||
|
|
||||||
final boolean etagValidatorMatches = (hasEtagValidator) && etagValidatorMatches(request, entry);
|
final boolean etagValidatorMatches = (hasEtagValidator) && etagValidatorMatches(request, entry);
|
||||||
final boolean lastModifiedValidatorMatches = (hasLastModifiedValidator) && lastModifiedValidatorMatches(request, entry,
|
final boolean lastModifiedValidatorMatches = (hasLastModifiedValidator) && lastModifiedValidatorMatches(request, entry, now);
|
||||||
DateUtils.toInstant(now));
|
|
||||||
|
|
||||||
if ((hasEtagValidator && hasLastModifiedValidator)
|
if ((hasEtagValidator && hasLastModifiedValidator)
|
||||||
&& !(etagValidatorMatches && lastModifiedValidatorMatches)) {
|
&& !(etagValidatorMatches && lastModifiedValidatorMatches)) {
|
||||||
|
|
|
@ -28,7 +28,7 @@ package org.apache.hc.client5.http.impl.cache;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Date;
|
import java.time.Instant;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
@ -231,7 +231,7 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
|
||||||
final ExecChain.Scope scope,
|
final ExecChain.Scope scope,
|
||||||
final ExecChain chain) throws IOException, HttpException {
|
final ExecChain chain) throws IOException, HttpException {
|
||||||
|
|
||||||
final Date requestDate = getCurrentDate();
|
final Instant requestDate = getCurrentDate();
|
||||||
|
|
||||||
LOG.debug("Calling the backend");
|
LOG.debug("Calling the backend");
|
||||||
final ClassicHttpResponse backendResponse = chain.proceed(request, scope);
|
final ClassicHttpResponse backendResponse = chain.proceed(request, scope);
|
||||||
|
@ -253,7 +253,7 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
|
||||||
final HttpClientContext context = scope.clientContext;
|
final HttpClientContext context = scope.clientContext;
|
||||||
context.setAttribute(HttpCoreContext.HTTP_REQUEST, request);
|
context.setAttribute(HttpCoreContext.HTTP_REQUEST, request);
|
||||||
recordCacheHit(target, request);
|
recordCacheHit(target, request);
|
||||||
final Date now = getCurrentDate();
|
final Instant now = getCurrentDate();
|
||||||
if (suitabilityChecker.canCachedResponseBeUsed(target, request, entry, now)) {
|
if (suitabilityChecker.canCachedResponseBeUsed(target, request, entry, now)) {
|
||||||
LOG.debug("Cache hit");
|
LOG.debug("Cache hit");
|
||||||
try {
|
try {
|
||||||
|
@ -306,13 +306,13 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
|
||||||
final ExecChain.Scope scope,
|
final ExecChain.Scope scope,
|
||||||
final ExecChain chain,
|
final ExecChain chain,
|
||||||
final HttpCacheEntry cacheEntry) throws IOException, HttpException {
|
final HttpCacheEntry cacheEntry) throws IOException, HttpException {
|
||||||
Date requestDate = getCurrentDate();
|
Instant requestDate = getCurrentDate();
|
||||||
final ClassicHttpRequest conditionalRequest = conditionalRequestBuilder.buildConditionalRequest(
|
final ClassicHttpRequest conditionalRequest = conditionalRequestBuilder.buildConditionalRequest(
|
||||||
scope.originalRequest, cacheEntry);
|
scope.originalRequest, cacheEntry);
|
||||||
|
|
||||||
ClassicHttpResponse backendResponse = chain.proceed(conditionalRequest, scope);
|
ClassicHttpResponse backendResponse = chain.proceed(conditionalRequest, scope);
|
||||||
try {
|
try {
|
||||||
Date responseDate = getCurrentDate();
|
Instant responseDate = getCurrentDate();
|
||||||
|
|
||||||
if (revalidationResponseIsTooOld(backendResponse, cacheEntry)) {
|
if (revalidationResponseIsTooOld(backendResponse, cacheEntry)) {
|
||||||
backendResponse.close();
|
backendResponse.close();
|
||||||
|
@ -334,7 +334,7 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
|
||||||
final HttpCacheEntry updatedEntry = responseCache.updateCacheEntry(
|
final HttpCacheEntry updatedEntry = responseCache.updateCacheEntry(
|
||||||
target, request, cacheEntry, backendResponse, requestDate, responseDate);
|
target, request, cacheEntry, backendResponse, requestDate, responseDate);
|
||||||
if (suitabilityChecker.isConditional(request)
|
if (suitabilityChecker.isConditional(request)
|
||||||
&& suitabilityChecker.allConditionalsMatch(request, updatedEntry, new Date())) {
|
&& suitabilityChecker.allConditionalsMatch(request, updatedEntry, Instant.now())) {
|
||||||
return convert(responseGenerator.generateNotModifiedResponse(updatedEntry), scope);
|
return convert(responseGenerator.generateNotModifiedResponse(updatedEntry), scope);
|
||||||
}
|
}
|
||||||
return convert(responseGenerator.generateResponse(request, updatedEntry), scope);
|
return convert(responseGenerator.generateResponse(request, updatedEntry), scope);
|
||||||
|
@ -362,8 +362,8 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
|
||||||
final HttpHost target,
|
final HttpHost target,
|
||||||
final ClassicHttpRequest request,
|
final ClassicHttpRequest request,
|
||||||
final ExecChain.Scope scope,
|
final ExecChain.Scope scope,
|
||||||
final Date requestDate,
|
final Instant requestDate,
|
||||||
final Date responseDate,
|
final Instant responseDate,
|
||||||
final ClassicHttpResponse backendResponse) throws IOException {
|
final ClassicHttpResponse backendResponse) throws IOException {
|
||||||
|
|
||||||
responseCompliance.ensureProtocolCompliance(scope.originalRequest, request, backendResponse);
|
responseCompliance.ensureProtocolCompliance(scope.originalRequest, request, backendResponse);
|
||||||
|
@ -384,8 +384,8 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
|
||||||
final HttpRequest request,
|
final HttpRequest request,
|
||||||
final ClassicHttpResponse backendResponse,
|
final ClassicHttpResponse backendResponse,
|
||||||
final ExecChain.Scope scope,
|
final ExecChain.Scope scope,
|
||||||
final Date requestSent,
|
final Instant requestSent,
|
||||||
final Date responseReceived) throws IOException {
|
final Instant responseReceived) throws IOException {
|
||||||
LOG.debug("Caching backend response");
|
LOG.debug("Caching backend response");
|
||||||
final ByteArrayBuffer buf;
|
final ByteArrayBuffer buf;
|
||||||
final HttpEntity entity = backendResponse.getEntity();
|
final HttpEntity entity = backendResponse.getEntity();
|
||||||
|
@ -453,10 +453,10 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
|
||||||
final Map<String, Variant> variants) throws IOException, HttpException {
|
final Map<String, Variant> variants) throws IOException, HttpException {
|
||||||
final ClassicHttpRequest conditionalRequest = conditionalRequestBuilder.buildConditionalRequestFromVariants(request, variants);
|
final ClassicHttpRequest conditionalRequest = conditionalRequestBuilder.buildConditionalRequestFromVariants(request, variants);
|
||||||
|
|
||||||
final Date requestDate = getCurrentDate();
|
final Instant requestDate = getCurrentDate();
|
||||||
final ClassicHttpResponse backendResponse = chain.proceed(conditionalRequest, scope);
|
final ClassicHttpResponse backendResponse = chain.proceed(conditionalRequest, scope);
|
||||||
try {
|
try {
|
||||||
final Date responseDate = getCurrentDate();
|
final Instant responseDate = getCurrentDate();
|
||||||
|
|
||||||
backendResponse.addHeader("Via", generateViaHeader(backendResponse));
|
backendResponse.addHeader("Via", generateViaHeader(backendResponse));
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
package org.apache.hc.client5.http.impl.cache;
|
package org.apache.hc.client5.http.impl.cache;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Date;
|
import java.time.Instant;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -183,7 +183,7 @@ public class CachingExecBase {
|
||||||
final HttpRequest request,
|
final HttpRequest request,
|
||||||
final HttpContext context,
|
final HttpContext context,
|
||||||
final HttpCacheEntry entry,
|
final HttpCacheEntry entry,
|
||||||
final Date now) throws ResourceIOException {
|
final Instant now) throws ResourceIOException {
|
||||||
final SimpleHttpResponse cachedResponse;
|
final SimpleHttpResponse cachedResponse;
|
||||||
if (request.containsHeader(HeaderConstants.IF_NONE_MATCH)
|
if (request.containsHeader(HeaderConstants.IF_NONE_MATCH)
|
||||||
|| request.containsHeader(HeaderConstants.IF_MODIFIED_SINCE)) {
|
|| request.containsHeader(HeaderConstants.IF_MODIFIED_SINCE)) {
|
||||||
|
@ -202,7 +202,7 @@ public class CachingExecBase {
|
||||||
final HttpRequest request,
|
final HttpRequest request,
|
||||||
final HttpContext context,
|
final HttpContext context,
|
||||||
final HttpCacheEntry entry,
|
final HttpCacheEntry entry,
|
||||||
final Date now) throws IOException {
|
final Instant now) throws IOException {
|
||||||
if (staleResponseNotAllowed(request, entry, now)) {
|
if (staleResponseNotAllowed(request, entry, now)) {
|
||||||
return generateGatewayTimeout(context);
|
return generateGatewayTimeout(context);
|
||||||
} else {
|
} else {
|
||||||
|
@ -226,7 +226,7 @@ public class CachingExecBase {
|
||||||
return cachedResponse;
|
return cachedResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean staleResponseNotAllowed(final HttpRequest request, final HttpCacheEntry entry, final Date now) {
|
boolean staleResponseNotAllowed(final HttpRequest request, final HttpCacheEntry entry, final Instant now) {
|
||||||
return validityPolicy.mustRevalidate(entry)
|
return validityPolicy.mustRevalidate(entry)
|
||||||
|| (cacheConfig.isSharedCache() && validityPolicy.proxyRevalidate(entry))
|
|| (cacheConfig.isSharedCache() && validityPolicy.proxyRevalidate(entry))
|
||||||
|| explicitFreshnessRequest(request, entry, now);
|
|| explicitFreshnessRequest(request, entry, now);
|
||||||
|
@ -244,7 +244,7 @@ public class CachingExecBase {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean explicitFreshnessRequest(final HttpRequest request, final HttpCacheEntry entry, final Date now) {
|
boolean explicitFreshnessRequest(final HttpRequest request, final HttpCacheEntry entry, final Instant now) {
|
||||||
final Iterator<HeaderElement> it = MessageSupport.iterate(request, HeaderConstants.CACHE_CONTROL);
|
final Iterator<HeaderElement> it = MessageSupport.iterate(request, HeaderConstants.CACHE_CONTROL);
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
final HeaderElement elt = it.next();
|
final HeaderElement elt = it.next();
|
||||||
|
@ -313,8 +313,8 @@ public class CachingExecBase {
|
||||||
return SUPPORTS_RANGE_AND_CONTENT_RANGE_HEADERS;
|
return SUPPORTS_RANGE_AND_CONTENT_RANGE_HEADERS;
|
||||||
}
|
}
|
||||||
|
|
||||||
Date getCurrentDate() {
|
Instant getCurrentDate() {
|
||||||
return new Date();
|
return Instant.now();
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean clientRequestsOurOptions(final HttpRequest request) {
|
boolean clientRequestsOurOptions(final HttpRequest request) {
|
||||||
|
@ -340,7 +340,7 @@ public class CachingExecBase {
|
||||||
|
|
||||||
boolean shouldSendNotModifiedResponse(final HttpRequest request, final HttpCacheEntry responseEntry) {
|
boolean shouldSendNotModifiedResponse(final HttpRequest request, final HttpCacheEntry responseEntry) {
|
||||||
return (suitabilityChecker.isConditional(request)
|
return (suitabilityChecker.isConditional(request)
|
||||||
&& suitabilityChecker.allConditionalsMatch(request, responseEntry, new Date()));
|
&& suitabilityChecker.allConditionalsMatch(request, responseEntry, Instant.now()));
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean staleIfErrorAppliesTo(final int statusCode) {
|
boolean staleIfErrorAppliesTo(final int statusCode) {
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hc.client5.http.impl.cache;
|
package org.apache.hc.client5.http.impl.cache;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.time.Instant;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.hc.client5.http.cache.HttpCacheEntry;
|
import org.apache.hc.client5.http.cache.HttpCacheEntry;
|
||||||
|
@ -79,8 +79,8 @@ interface HttpAsyncCache {
|
||||||
HttpRequest request,
|
HttpRequest request,
|
||||||
HttpResponse originResponse,
|
HttpResponse originResponse,
|
||||||
ByteArrayBuffer content,
|
ByteArrayBuffer content,
|
||||||
Date requestSent,
|
Instant requestSent,
|
||||||
Date responseReceived,
|
Instant responseReceived,
|
||||||
FutureCallback<HttpCacheEntry> callback);
|
FutureCallback<HttpCacheEntry> callback);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -91,8 +91,8 @@ interface HttpAsyncCache {
|
||||||
HttpRequest request,
|
HttpRequest request,
|
||||||
HttpCacheEntry stale,
|
HttpCacheEntry stale,
|
||||||
HttpResponse originResponse,
|
HttpResponse originResponse,
|
||||||
Date requestSent,
|
Instant requestSent,
|
||||||
Date responseReceived,
|
Instant responseReceived,
|
||||||
FutureCallback<HttpCacheEntry> callback);
|
FutureCallback<HttpCacheEntry> callback);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -104,8 +104,8 @@ interface HttpAsyncCache {
|
||||||
HttpRequest request,
|
HttpRequest request,
|
||||||
HttpResponse originResponse,
|
HttpResponse originResponse,
|
||||||
Variant variant,
|
Variant variant,
|
||||||
Date requestSent,
|
Instant requestSent,
|
||||||
Date responseReceived,
|
Instant responseReceived,
|
||||||
FutureCallback<HttpCacheEntry> callback);
|
FutureCallback<HttpCacheEntry> callback);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -32,7 +32,7 @@ import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.Date;
|
import java.time.Instant;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ -150,8 +150,8 @@ public class HttpByteArrayCacheEntrySerializer implements HttpCacheEntrySerializ
|
||||||
|
|
||||||
// Extract metadata pseudo-headers
|
// Extract metadata pseudo-headers
|
||||||
final String storageKey = getCachePseudoHeaderAndRemove(response, SC_HEADER_NAME_STORAGE_KEY);
|
final String storageKey = getCachePseudoHeaderAndRemove(response, SC_HEADER_NAME_STORAGE_KEY);
|
||||||
final Date requestDate = getCachePseudoHeaderDateAndRemove(response, SC_HEADER_NAME_REQUEST_DATE);
|
final Instant requestDate = getCachePseudoHeaderDateAndRemove(response, SC_HEADER_NAME_REQUEST_DATE);
|
||||||
final Date responseDate = getCachePseudoHeaderDateAndRemove(response, SC_HEADER_NAME_RESPONSE_DATE);
|
final Instant responseDate = getCachePseudoHeaderDateAndRemove(response, SC_HEADER_NAME_RESPONSE_DATE);
|
||||||
final boolean noBody = getCachePseudoHeaderBooleanAndRemove(response, SC_HEADER_NAME_NO_CONTENT);
|
final boolean noBody = getCachePseudoHeaderBooleanAndRemove(response, SC_HEADER_NAME_NO_CONTENT);
|
||||||
final Map<String, String> variantMap = getVariantMapPseudoHeadersAndRemove(response);
|
final Map<String, String> variantMap = getVariantMapPseudoHeadersAndRemove(response);
|
||||||
unescapeHeaders(response);
|
unescapeHeaders(response);
|
||||||
|
@ -255,8 +255,8 @@ public class HttpByteArrayCacheEntrySerializer implements HttpCacheEntrySerializ
|
||||||
*/
|
*/
|
||||||
private void addMetadataPseudoHeaders(final HttpResponse httpResponse, final HttpCacheStorageEntry httpCacheEntry) {
|
private void addMetadataPseudoHeaders(final HttpResponse httpResponse, final HttpCacheStorageEntry httpCacheEntry) {
|
||||||
httpResponse.addHeader(SC_HEADER_NAME_STORAGE_KEY, httpCacheEntry.getKey());
|
httpResponse.addHeader(SC_HEADER_NAME_STORAGE_KEY, httpCacheEntry.getKey());
|
||||||
httpResponse.addHeader(SC_HEADER_NAME_RESPONSE_DATE, Long.toString(httpCacheEntry.getContent().getResponseDate().getTime()));
|
httpResponse.addHeader(SC_HEADER_NAME_RESPONSE_DATE, Long.toString(httpCacheEntry.getContent().getResponseInstant().toEpochMilli()));
|
||||||
httpResponse.addHeader(SC_HEADER_NAME_REQUEST_DATE, Long.toString(httpCacheEntry.getContent().getRequestDate().getTime()));
|
httpResponse.addHeader(SC_HEADER_NAME_REQUEST_DATE, Long.toString(httpCacheEntry.getContent().getRequestInstant().toEpochMilli()));
|
||||||
|
|
||||||
// Encode these so map entries are stored in a pair of headers, one for key and one for value.
|
// Encode these so map entries are stored in a pair of headers, one for key and one for value.
|
||||||
// Header keys look like: {Accept-Encoding=gzip}
|
// Header keys look like: {Accept-Encoding=gzip}
|
||||||
|
@ -308,12 +308,12 @@ public class HttpByteArrayCacheEntrySerializer implements HttpCacheEntrySerializ
|
||||||
* @return Value for metadata pseudo-header
|
* @return Value for metadata pseudo-header
|
||||||
* @throws ResourceIOException if the given pseudo-header is not found, or contains invalid data
|
* @throws ResourceIOException if the given pseudo-header is not found, or contains invalid data
|
||||||
*/
|
*/
|
||||||
private static Date getCachePseudoHeaderDateAndRemove(final HttpResponse response, final String name) throws ResourceIOException{
|
private static Instant getCachePseudoHeaderDateAndRemove(final HttpResponse response, final String name) throws ResourceIOException{
|
||||||
final String value = getCachePseudoHeaderAndRemove(response, name);
|
final String value = getCachePseudoHeaderAndRemove(response, name);
|
||||||
response.removeHeaders(name);
|
response.removeHeaders(name);
|
||||||
try {
|
try {
|
||||||
final long timestamp = Long.parseLong(value);
|
final long timestamp = Long.parseLong(value);
|
||||||
return new Date(timestamp);
|
return Instant.ofEpochMilli(timestamp);
|
||||||
} catch (final NumberFormatException e) {
|
} catch (final NumberFormatException e) {
|
||||||
throw new ResourceIOException("Invalid value for header '" + name + "'", e);
|
throw new ResourceIOException("Invalid value for header '" + name + "'", e);
|
||||||
}
|
}
|
||||||
|
@ -410,7 +410,7 @@ public class HttpByteArrayCacheEntrySerializer implements HttpCacheEntrySerializ
|
||||||
*/
|
*/
|
||||||
private static class NoAgeCacheValidityPolicy extends CacheValidityPolicy {
|
private static class NoAgeCacheValidityPolicy extends CacheValidityPolicy {
|
||||||
@Override
|
@Override
|
||||||
public TimeValue getCurrentAge(final HttpCacheEntry entry, final Date now) {
|
public TimeValue getCurrentAge(final HttpCacheEntry entry, final Instant now) {
|
||||||
return TimeValue.ZERO_MILLISECONDS;
|
return TimeValue.ZERO_MILLISECONDS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hc.client5.http.impl.cache;
|
package org.apache.hc.client5.http.impl.cache;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.time.Instant;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.hc.client5.http.cache.HttpCacheEntry;
|
import org.apache.hc.client5.http.cache.HttpCacheEntry;
|
||||||
|
@ -73,8 +73,8 @@ interface HttpCache {
|
||||||
HttpRequest request,
|
HttpRequest request,
|
||||||
HttpResponse originResponse,
|
HttpResponse originResponse,
|
||||||
ByteArrayBuffer content,
|
ByteArrayBuffer content,
|
||||||
Date requestSent,
|
Instant requestSent,
|
||||||
Date responseReceived);
|
Instant responseReceived);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update a {@link HttpCacheEntry} using a 304 {@link HttpResponse}.
|
* Update a {@link HttpCacheEntry} using a 304 {@link HttpResponse}.
|
||||||
|
@ -84,8 +84,8 @@ interface HttpCache {
|
||||||
HttpRequest request,
|
HttpRequest request,
|
||||||
HttpCacheEntry stale,
|
HttpCacheEntry stale,
|
||||||
HttpResponse originResponse,
|
HttpResponse originResponse,
|
||||||
Date requestSent,
|
Instant requestSent,
|
||||||
Date responseReceived);
|
Instant responseReceived);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update a specific {@link HttpCacheEntry} representing a cached variant
|
* Update a specific {@link HttpCacheEntry} representing a cached variant
|
||||||
|
@ -96,8 +96,8 @@ interface HttpCache {
|
||||||
HttpRequest request,
|
HttpRequest request,
|
||||||
HttpResponse originResponse,
|
HttpResponse originResponse,
|
||||||
Variant variant,
|
Variant variant,
|
||||||
Date requestSent,
|
Instant requestSent,
|
||||||
Date responseReceived);
|
Instant responseReceived);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specifies cache should reuse the given cached variant to satisfy
|
* Specifies cache should reuse the given cached variant to satisfy
|
||||||
|
|
|
@ -29,7 +29,6 @@ package org.apache.hc.client5.http.impl.cache;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.hc.client5.http.ClientProtocolException;
|
import org.apache.hc.client5.http.ClientProtocolException;
|
||||||
|
@ -101,8 +100,8 @@ class ResponseProtocolCompliance {
|
||||||
boolean modified = false;
|
boolean modified = false;
|
||||||
for(final Header h : warningHeaders) {
|
for(final Header h : warningHeaders) {
|
||||||
for(final WarningValue wv : WarningValue.getWarningValues(h)) {
|
for(final WarningValue wv : WarningValue.getWarningValues(h)) {
|
||||||
final Date warnDate = wv.getWarnDate();
|
final Instant warnInstant = wv.getWarnDate();
|
||||||
if (warnDate == null || warnDate.equals(responseDate)) {
|
if (warnInstant == null || warnInstant.equals(responseDate)) {
|
||||||
newWarningHeaders.add(new BasicHeader(HeaderConstants.WARNING,wv.toString()));
|
newWarningHeaders.add(new BasicHeader(HeaderConstants.WARNING,wv.toString()));
|
||||||
} else {
|
} else {
|
||||||
modified = true;
|
modified = true;
|
||||||
|
|
|
@ -26,8 +26,8 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hc.client5.http.impl.cache;
|
package org.apache.hc.client5.http.impl.cache;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
@ -48,7 +48,7 @@ class WarningValue {
|
||||||
private int warnCode;
|
private int warnCode;
|
||||||
private String warnAgent;
|
private String warnAgent;
|
||||||
private String warnText;
|
private String warnText;
|
||||||
private Date warnDate;
|
private Instant warnDate;
|
||||||
|
|
||||||
WarningValue(final String s) {
|
WarningValue(final String s) {
|
||||||
this(s, 0);
|
this(s, 0);
|
||||||
|
@ -265,7 +265,7 @@ class WarningValue {
|
||||||
parseError();
|
parseError();
|
||||||
}
|
}
|
||||||
offs += m.end();
|
offs += m.end();
|
||||||
warnDate = DateUtils.toDate(DateUtils.parseStandardDate(src.substring(curr+1,offs-1)));
|
warnDate = DateUtils.parseStandardDate(src.substring(curr+1,offs-1));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -342,9 +342,9 @@ class WarningValue {
|
||||||
/** Returns the date and time when this warning was added, or
|
/** Returns the date and time when this warning was added, or
|
||||||
* {@code null} if a warning date was not supplied in the
|
* {@code null} if a warning date was not supplied in the
|
||||||
* header.
|
* header.
|
||||||
* @return {@link Date}
|
* @return {@link Instant}
|
||||||
*/
|
*/
|
||||||
public Date getWarnDate() { return warnDate; }
|
public Instant getWarnDate() { return warnDate; }
|
||||||
|
|
||||||
/** Formats a {@code WarningValue} as a {@link String}
|
/** Formats a {@code WarningValue} as a {@link String}
|
||||||
* suitable for including in a header. For example, you can:
|
* suitable for including in a header. For example, you can:
|
||||||
|
@ -359,7 +359,7 @@ class WarningValue {
|
||||||
public String toString() {
|
public String toString() {
|
||||||
if (warnDate != null) {
|
if (warnDate != null) {
|
||||||
return String.format("%d %s %s \"%s\"", warnCode,
|
return String.format("%d %s %s \"%s\"", warnCode,
|
||||||
warnAgent, warnText, DateUtils.formatStandardDate(DateUtils.toInstant(warnDate)));
|
warnAgent, warnText, DateUtils.formatStandardDate(warnDate));
|
||||||
} else {
|
} else {
|
||||||
return String.format("%d %s %s", warnCode, warnAgent, warnText);
|
return String.format("%d %s %s", warnCode, warnAgent, warnText);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
package org.apache.hc.client5.http.cache;
|
package org.apache.hc.client5.http.cache;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
|
@ -66,7 +65,7 @@ public class TestHttpCacheEntry {
|
||||||
}
|
}
|
||||||
|
|
||||||
private HttpCacheEntry makeEntry(final Header[] headers) {
|
private HttpCacheEntry makeEntry(final Header[] headers) {
|
||||||
return new HttpCacheEntry(DateUtils.toDate(elevenSecondsAgo), DateUtils.toDate(nineSecondsAgo),
|
return new HttpCacheEntry(elevenSecondsAgo, nineSecondsAgo,
|
||||||
HttpStatus.SC_OK, headers, mockResource);
|
HttpStatus.SC_OK, headers, mockResource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,13 +109,6 @@ public class TestHttpCacheEntry {
|
||||||
assertNull(entry.getFirstHeader("quux"));
|
assertNull(entry.getFirstHeader("quux"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCacheEntryWithNoVaryHeaderDoesNotHaveVariants() {
|
|
||||||
final Header[] headers = new Header[0];
|
|
||||||
entry = makeEntry(headers);
|
|
||||||
assertFalse(entry.hasVariants());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCacheEntryWithOneVaryHeaderHasVariants() {
|
public void testCacheEntryWithOneVaryHeaderHasVariants() {
|
||||||
final Header[] headers = { new BasicHeader("Vary", "User-Agent") };
|
final Header[] headers = { new BasicHeader("Vary", "User-Agent") };
|
||||||
|
@ -140,11 +132,24 @@ public class TestHttpCacheEntry {
|
||||||
assertTrue(entry.hasVariants());
|
assertTrue(entry.hasVariants());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetMethodReturnsCorrectRequestMethod() {
|
||||||
|
final Header[] headers = { new BasicHeader("foo", "fooValue"),
|
||||||
|
new BasicHeader("bar", "barValue1"),
|
||||||
|
new BasicHeader("bar", "barValue2")
|
||||||
|
};
|
||||||
|
entry = makeEntry(headers);
|
||||||
|
assertEquals(HeaderConstants.GET_METHOD, entry.getRequestMethod());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
@Test
|
@Test
|
||||||
public void mustProvideRequestDate() {
|
public void mustProvideRequestDate() {
|
||||||
try {
|
try {
|
||||||
new HttpCacheEntry(null, new Date(), HttpStatus.SC_OK, new Header[]{}, mockResource);
|
new HttpCacheEntry(null, Instant.now(), HttpStatus.SC_OK, new Header[]{}, mockResource);
|
||||||
fail("Should have thrown exception");
|
fail("Should have thrown exception");
|
||||||
} catch (final NullPointerException expected) {
|
} catch (final NullPointerException expected) {
|
||||||
}
|
}
|
||||||
|
@ -154,7 +159,7 @@ public class TestHttpCacheEntry {
|
||||||
@Test
|
@Test
|
||||||
public void mustProvideResponseDate() {
|
public void mustProvideResponseDate() {
|
||||||
try {
|
try {
|
||||||
new HttpCacheEntry(new Date(), null, HttpStatus.SC_OK, new Header[]{}, mockResource);
|
new HttpCacheEntry(Instant.now(), null, HttpStatus.SC_OK, new Header[]{}, mockResource);
|
||||||
fail("Should have thrown exception");
|
fail("Should have thrown exception");
|
||||||
} catch (final NullPointerException expected) {
|
} catch (final NullPointerException expected) {
|
||||||
}
|
}
|
||||||
|
@ -164,7 +169,7 @@ public class TestHttpCacheEntry {
|
||||||
@Test
|
@Test
|
||||||
public void mustProvideResponseHeaders() {
|
public void mustProvideResponseHeaders() {
|
||||||
try {
|
try {
|
||||||
new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK, null, mockResource);
|
new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK, null, mockResource);
|
||||||
fail("Should have thrown exception");
|
fail("Should have thrown exception");
|
||||||
} catch (final NullPointerException expected) {
|
} catch (final NullPointerException expected) {
|
||||||
}
|
}
|
||||||
|
@ -172,27 +177,27 @@ public class TestHttpCacheEntry {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void statusCodeComesFromOriginalStatusLine() {
|
public void statusCodeComesFromOriginalStatusLine() {
|
||||||
entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK, new Header[]{}, mockResource);
|
entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK, new Header[]{}, mockResource);
|
||||||
assertEquals(HttpStatus.SC_OK, entry.getStatus());
|
assertEquals(HttpStatus.SC_OK, entry.getStatus());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void canGetOriginalRequestDate() {
|
public void canGetOriginalRequestDate() {
|
||||||
final Date requestDate = new Date();
|
final Instant requestDate = Instant.now();
|
||||||
entry = new HttpCacheEntry(requestDate, new Date(), HttpStatus.SC_OK, new Header[]{}, mockResource);
|
entry = new HttpCacheEntry(requestDate, Instant.now(), HttpStatus.SC_OK, new Header[]{}, mockResource);
|
||||||
assertSame(requestDate, entry.getRequestDate());
|
assertEquals(requestDate, entry.getRequestInstant());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void canGetOriginalResponseDate() {
|
public void canGetOriginalResponseDate() {
|
||||||
final Date responseDate = new Date();
|
final Instant responseDate = Instant.now();
|
||||||
entry = new HttpCacheEntry(new Date(), responseDate, HttpStatus.SC_OK, new Header[]{}, mockResource);
|
entry = new HttpCacheEntry(Instant.now(), responseDate, HttpStatus.SC_OK, new Header[]{}, mockResource);
|
||||||
assertSame(responseDate, entry.getResponseDate());
|
assertEquals(responseDate, entry.getResponseInstant());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void canGetOriginalResource() {
|
public void canGetOriginalResource() {
|
||||||
entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK, new Header[]{}, mockResource);
|
entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK, new Header[]{}, mockResource);
|
||||||
assertSame(mockResource, entry.getResource());
|
assertSame(mockResource, entry.getResource());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,7 +207,7 @@ public class TestHttpCacheEntry {
|
||||||
new BasicHeader("Server", "MockServer/1.0"),
|
new BasicHeader("Server", "MockServer/1.0"),
|
||||||
new BasicHeader("Date", DateUtils.formatStandardDate(now))
|
new BasicHeader("Date", DateUtils.formatStandardDate(now))
|
||||||
};
|
};
|
||||||
entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK, headers, mockResource);
|
entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK, headers, mockResource);
|
||||||
final Header[] result = entry.getHeaders();
|
final Header[] result = entry.getHeaders();
|
||||||
assertEquals(headers.length, result.length);
|
assertEquals(headers.length, result.length);
|
||||||
for(int i=0; i<headers.length; i++) {
|
for(int i=0; i<headers.length; i++) {
|
||||||
|
@ -213,13 +218,13 @@ public class TestHttpCacheEntry {
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
@Test
|
@Test
|
||||||
public void canConstructWithoutVariants() {
|
public void canConstructWithoutVariants() {
|
||||||
new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK, new Header[]{}, mockResource);
|
new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK, new Header[]{}, mockResource);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
@Test
|
@Test
|
||||||
public void canProvideVariantMap() {
|
public void canProvideVariantMap() {
|
||||||
new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
|
new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
|
||||||
new Header[]{}, mockResource,
|
new Header[]{}, mockResource,
|
||||||
new HashMap<>());
|
new HashMap<>());
|
||||||
}
|
}
|
||||||
|
@ -229,7 +234,7 @@ public class TestHttpCacheEntry {
|
||||||
final Map<String,String> variantMap = new HashMap<>();
|
final Map<String,String> variantMap = new HashMap<>();
|
||||||
variantMap.put("A","B");
|
variantMap.put("A","B");
|
||||||
variantMap.put("C","D");
|
variantMap.put("C","D");
|
||||||
entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
|
entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
|
||||||
new Header[]{}, mockResource,
|
new Header[]{}, mockResource,
|
||||||
variantMap);
|
variantMap);
|
||||||
final Map<String,String> result = entry.getVariantMap();
|
final Map<String,String> result = entry.getVariantMap();
|
||||||
|
@ -243,7 +248,7 @@ public class TestHttpCacheEntry {
|
||||||
final Map<String,String> variantMap = new HashMap<>();
|
final Map<String,String> variantMap = new HashMap<>();
|
||||||
variantMap.put("A","B");
|
variantMap.put("A","B");
|
||||||
variantMap.put("C","D");
|
variantMap.put("C","D");
|
||||||
entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
|
entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
|
||||||
new Header[]{}, mockResource,
|
new Header[]{}, mockResource,
|
||||||
variantMap);
|
variantMap);
|
||||||
final Map<String,String> result = entry.getVariantMap();
|
final Map<String,String> result = entry.getVariantMap();
|
||||||
|
@ -261,7 +266,7 @@ public class TestHttpCacheEntry {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void canConvertToString() {
|
public void canConvertToString() {
|
||||||
entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
|
entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
|
||||||
new Header[]{}, mockResource);
|
new Header[]{}, mockResource);
|
||||||
assertNotNull(entry.toString());
|
assertNotNull(entry.toString());
|
||||||
assertNotEquals("", entry.toString());
|
assertNotEquals("", entry.toString());
|
||||||
|
@ -270,16 +275,16 @@ public class TestHttpCacheEntry {
|
||||||
@Test
|
@Test
|
||||||
public void testMissingDateHeaderIsIgnored() {
|
public void testMissingDateHeaderIsIgnored() {
|
||||||
final Header[] headers = new Header[] {};
|
final Header[] headers = new Header[] {};
|
||||||
entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
|
entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
|
||||||
headers, mockResource);
|
headers, mockResource);
|
||||||
assertNull(entry.getDate());
|
assertNull(entry.getDate());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMalformedDateHeaderIsIgnored() {
|
public void testMalformedDateHeaderIsIgnored() {
|
||||||
final Header[] headers = new Header[] { new BasicHeader("Date", "asdf") };
|
final Header[] headers = new Header[] { new BasicHeader("Date", "asdf") };
|
||||||
entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
|
entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
|
||||||
headers, mockResource);
|
headers, mockResource);
|
||||||
assertNull(entry.getDate());
|
assertNull(entry.getDate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,20 +292,11 @@ public class TestHttpCacheEntry {
|
||||||
public void testValidDateHeaderIsParsed() {
|
public void testValidDateHeaderIsParsed() {
|
||||||
final Instant date = Instant.now().with(ChronoField.MILLI_OF_SECOND, 0);
|
final Instant date = Instant.now().with(ChronoField.MILLI_OF_SECOND, 0);
|
||||||
final Header[] headers = new Header[] { new BasicHeader("Date", DateUtils.formatStandardDate(date)) };
|
final Header[] headers = new Header[] { new BasicHeader("Date", DateUtils.formatStandardDate(date)) };
|
||||||
entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
|
entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
|
||||||
headers, mockResource);
|
headers, mockResource);
|
||||||
final Date dateHeaderValue = entry.getDate();
|
final Date dateHeaderValue = entry.getDate();
|
||||||
assertNotNull(dateHeaderValue);
|
assertNotNull(dateHeaderValue);
|
||||||
assertEquals(DateUtils.toDate(date), dateHeaderValue);
|
assertEquals(DateUtils.toDate(date), dateHeaderValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testGetMethodReturnsCorrectRequestMethod() {
|
|
||||||
final Header[] headers = { new BasicHeader("foo", "fooValue"),
|
|
||||||
new BasicHeader("bar", "barValue1"),
|
|
||||||
new BasicHeader("bar", "barValue2")
|
|
||||||
};
|
|
||||||
entry = makeEntry(headers);
|
|
||||||
assertEquals(HeaderConstants.GET_METHOD, entry.getRequestMethod());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,8 +34,8 @@ import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.hc.client5.http.cache.HttpCacheEntry;
|
import org.apache.hc.client5.http.cache.HttpCacheEntry;
|
||||||
|
@ -59,8 +59,8 @@ class HttpByteArrayCacheEntrySerializerTestUtils {
|
||||||
*/
|
*/
|
||||||
static class HttpCacheStorageEntryTestTemplate {
|
static class HttpCacheStorageEntryTestTemplate {
|
||||||
Resource resource;
|
Resource resource;
|
||||||
Date requestDate;
|
Instant requestDate;
|
||||||
Date responseDate;
|
Instant responseDate;
|
||||||
int responseCode;
|
int responseCode;
|
||||||
Header[] responseHeaders;
|
Header[] responseHeaders;
|
||||||
Map<String, String> variantMap;
|
Map<String, String> variantMap;
|
||||||
|
@ -120,8 +120,8 @@ class HttpByteArrayCacheEntrySerializerTestUtils {
|
||||||
private static final HttpCacheStorageEntryTestTemplate DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE = new HttpCacheStorageEntryTestTemplate();
|
private static final HttpCacheStorageEntryTestTemplate DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE = new HttpCacheStorageEntryTestTemplate();
|
||||||
static {
|
static {
|
||||||
DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.resource = new HeapResource("Hello World".getBytes(StandardCharsets.UTF_8));
|
DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.resource = new HeapResource("Hello World".getBytes(StandardCharsets.UTF_8));
|
||||||
DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.requestDate = new Date(165214800000L);
|
DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.requestDate = Instant.ofEpochMilli(165214800000L);
|
||||||
DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.responseDate = new Date(2611108800000L);
|
DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.responseDate = Instant.ofEpochMilli(2611108800000L);
|
||||||
DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.responseCode = 200;
|
DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.responseCode = 200;
|
||||||
DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.responseHeaders = new Header[]{
|
DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.responseHeaders = new Header[]{
|
||||||
new BasicHeader("Content-type", "text/html"),
|
new BasicHeader("Content-type", "text/html"),
|
||||||
|
@ -220,8 +220,9 @@ class HttpByteArrayCacheEntrySerializerTestUtils {
|
||||||
final HttpCacheEntry expectedContent = expected.getContent();
|
final HttpCacheEntry expectedContent = expected.getContent();
|
||||||
final HttpCacheEntry actualContent = actual.getContent();
|
final HttpCacheEntry actualContent = actual.getContent();
|
||||||
|
|
||||||
assertEquals(expectedContent.getRequestDate(), actualContent.getRequestDate());
|
assertEquals(expectedContent.getRequestInstant(), actualContent.getRequestInstant());
|
||||||
assertEquals(expectedContent.getResponseDate(), actualContent.getResponseDate());
|
assertEquals(expectedContent.getResponseInstant(), actualContent.getResponseInstant());
|
||||||
|
|
||||||
assertEquals(expectedContent.getStatus(), actualContent.getStatus());
|
assertEquals(expectedContent.getStatus(), actualContent.getStatus());
|
||||||
|
|
||||||
assertArrayEquals(expectedContent.getVariantMap().keySet().toArray(), actualContent.getVariantMap().keySet().toArray());
|
assertArrayEquals(expectedContent.getVariantMap().keySet().toArray(), actualContent.getVariantMap().keySet().toArray());
|
||||||
|
|
|
@ -26,8 +26,8 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hc.client5.http.impl.cache;
|
package org.apache.hc.client5.http.impl.cache;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import org.apache.hc.client5.http.cache.HttpCacheEntry;
|
import org.apache.hc.client5.http.cache.HttpCacheEntry;
|
||||||
import org.apache.hc.client5.http.cache.Resource;
|
import org.apache.hc.client5.http.cache.Resource;
|
||||||
|
@ -57,16 +57,17 @@ public class HttpCacheEntryMatcher extends BaseMatcher<HttpCacheEntry> {
|
||||||
if (expectedStatus != otherStatus) {
|
if (expectedStatus != otherStatus) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
final Date expectedRequestDate = expectedValue.getRequestDate();
|
final Instant expectedRequestInstant = expectedValue.getRequestInstant();
|
||||||
final Date otherRequestDate = otherValue.getRequestDate();
|
final Instant otherRequestInstant = otherValue.getRequestInstant();
|
||||||
if (!LangUtils.equals(expectedRequestDate, otherRequestDate)) {
|
if (!LangUtils.equals(expectedRequestInstant, otherRequestInstant)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
final Date expectedResponseDate = expectedValue.getResponseDate();
|
final Instant expectedResponseInstant = expectedValue.getResponseInstant();
|
||||||
final Date otherResponseDate = otherValue.getResponseDate();
|
final Instant otherResponseInstant = otherValue.getResponseInstant();
|
||||||
if (!LangUtils.equals(expectedResponseDate, otherResponseDate)) {
|
if (!LangUtils.equals(expectedResponseInstant, otherResponseInstant)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Header[] expectedHeaders = expectedValue.getHeaders();
|
final Header[] expectedHeaders = expectedValue.getHeaders();
|
||||||
final Header[] otherHeaders = otherValue.getHeaders();
|
final Header[] otherHeaders = otherValue.getHeaders();
|
||||||
if (expectedHeaders.length != otherHeaders.length) {
|
if (expectedHeaders.length != otherHeaders.length) {
|
||||||
|
|
|
@ -29,7 +29,6 @@ package org.apache.hc.client5.http.impl.cache;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -268,7 +267,7 @@ public class HttpTestUtils {
|
||||||
return makeCacheEntry(now, now, getStockHeaders(now),
|
return makeCacheEntry(now, now, getStockHeaders(now),
|
||||||
getRandomBytes(128), variantMap);
|
getRandomBytes(128), variantMap);
|
||||||
}
|
}
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public static HttpCacheEntry makeCacheEntry(final Instant requestDate,
|
public static HttpCacheEntry makeCacheEntry(final Instant requestDate,
|
||||||
final Instant responseDate, final Header[] headers, final byte[] bytes,
|
final Instant responseDate, final Header[] headers, final byte[] bytes,
|
||||||
final Map<String,String> variantMap) {
|
final Map<String,String> variantMap) {
|
||||||
|
@ -295,31 +294,6 @@ public class HttpTestUtils {
|
||||||
return makeCacheEntry(now, now);
|
return makeCacheEntry(now, now);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpCacheEntry makeCacheEntryWithNoRequestMethodOrEntity(final Header... headers) {
|
|
||||||
final Date now = new Date();
|
|
||||||
return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HttpCacheEntry makeCacheEntryWithNoRequestMethod(final Header... headers) {
|
|
||||||
final Date now = new Date();
|
|
||||||
return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, new HeapResource(getRandomBytes(128)), null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HttpCacheEntry make204CacheEntryWithNoRequestMethod(final Header... headers) {
|
|
||||||
final Date now = new Date();
|
|
||||||
return new HttpCacheEntry(now, now, HttpStatus.SC_NO_CONTENT, headers, null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HttpCacheEntry makeHeadCacheEntry(final Header... headers) {
|
|
||||||
final Date now = new Date();
|
|
||||||
return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HttpCacheEntry makeHeadCacheEntryWithNoRequestMethod(final Header... headers) {
|
|
||||||
final Date now = new Date();
|
|
||||||
return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ClassicHttpResponse make200Response() {
|
public static ClassicHttpResponse make200Response() {
|
||||||
final ClassicHttpResponse out = new BasicClassicHttpResponse(HttpStatus.SC_OK, "OK");
|
final ClassicHttpResponse out = new BasicClassicHttpResponse(HttpStatus.SC_OK, "OK");
|
||||||
out.setHeader("Date", DateUtils.formatStandardDate(Instant.now()));
|
out.setHeader("Date", DateUtils.formatStandardDate(Instant.now()));
|
||||||
|
@ -373,4 +347,30 @@ public class HttpTestUtils {
|
||||||
|
|
||||||
return variants;
|
return variants;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static HttpCacheEntry makeCacheEntryWithNoRequestMethodOrEntity(final Header... headers) {
|
||||||
|
final Instant now = Instant.now();
|
||||||
|
return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HttpCacheEntry makeCacheEntryWithNoRequestMethod(final Header... headers) {
|
||||||
|
final Instant now = Instant.now();
|
||||||
|
return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, new HeapResource(getRandomBytes(128)), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HttpCacheEntry make204CacheEntryWithNoRequestMethod(final Header... headers) {
|
||||||
|
final Instant now = Instant.now();
|
||||||
|
return new HttpCacheEntry(now, now, HttpStatus.SC_NO_CONTENT, headers, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HttpCacheEntry makeHeadCacheEntry(final Header... headers) {
|
||||||
|
final Instant now = Instant.now();
|
||||||
|
return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HttpCacheEntry makeHeadCacheEntryWithNoRequestMethod(final Header... headers) {
|
||||||
|
final Instant now = Instant.now();
|
||||||
|
return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, null, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,6 @@ import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertSame;
|
import static org.junit.jupiter.api.Assertions.assertSame;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.hc.client5.http.cache.HeaderConstants;
|
import org.apache.hc.client5.http.cache.HeaderConstants;
|
||||||
|
@ -231,7 +230,7 @@ public class TestBasicHttpCache {
|
||||||
origResponse.setHeader("Vary", "Accept-Encoding");
|
origResponse.setHeader("Vary", "Accept-Encoding");
|
||||||
origResponse.setHeader("Content-Encoding","gzip");
|
origResponse.setHeader("Content-Encoding","gzip");
|
||||||
|
|
||||||
impl.createCacheEntry(host, origRequest, origResponse, buf, new Date(), new Date());
|
impl.createCacheEntry(host, origRequest, origResponse, buf, Instant.now(), Instant.now());
|
||||||
|
|
||||||
final HttpRequest request = new HttpGet("http://foo.example.com/bar");
|
final HttpRequest request = new HttpGet("http://foo.example.com/bar");
|
||||||
final HttpCacheEntry result = impl.getCacheEntry(host, request);
|
final HttpCacheEntry result = impl.getCacheEntry(host, request);
|
||||||
|
@ -253,7 +252,7 @@ public class TestBasicHttpCache {
|
||||||
origResponse.setHeader("Vary", "Accept-Encoding");
|
origResponse.setHeader("Vary", "Accept-Encoding");
|
||||||
origResponse.setHeader("Content-Encoding","gzip");
|
origResponse.setHeader("Content-Encoding","gzip");
|
||||||
|
|
||||||
impl.createCacheEntry(host, origRequest, origResponse, buf, new Date(), new Date());
|
impl.createCacheEntry(host, origRequest, origResponse, buf, Instant.now(), Instant.now());
|
||||||
|
|
||||||
final HttpRequest request = new HttpGet("http://foo.example.com/bar");
|
final HttpRequest request = new HttpGet("http://foo.example.com/bar");
|
||||||
request.setHeader("Accept-Encoding","gzip");
|
request.setHeader("Accept-Encoding","gzip");
|
||||||
|
@ -297,8 +296,8 @@ public class TestBasicHttpCache {
|
||||||
resp2.setHeader("Content-Encoding","gzip");
|
resp2.setHeader("Content-Encoding","gzip");
|
||||||
resp2.setHeader("Vary", "Accept-Encoding");
|
resp2.setHeader("Vary", "Accept-Encoding");
|
||||||
|
|
||||||
impl.createCacheEntry(host, req1, resp1, null, new Date(), new Date());
|
impl.createCacheEntry(host, req1, resp1, null, Instant.now(), Instant.now());
|
||||||
impl.createCacheEntry(host, req2, resp2, null, new Date(), new Date());
|
impl.createCacheEntry(host, req2, resp2, null, Instant.now(), Instant.now());
|
||||||
|
|
||||||
final Map<String,Variant> variants = impl.getVariantCacheEntriesWithEtags(host, req1);
|
final Map<String,Variant> variants = impl.getVariantCacheEntriesWithEtags(host, req1);
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ import java.io.IOException;
|
||||||
import java.io.ObjectOutputStream;
|
import java.io.ObjectOutputStream;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -61,7 +62,12 @@ public class TestByteArrayCacheEntrySerializer {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void canSerializeEntriesWithVariantMaps() throws Exception {
|
public void canSerializeEntriesWithVariantMapsDeprecatedConstructor() throws Exception {
|
||||||
|
readWriteVerify(makeCacheEntryDeprecatedConstructorWithVariantMap("somekey"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void canSerializeEntriesWithVariantMapsAndInstant() throws Exception {
|
||||||
readWriteVerify(makeCacheEntryWithVariantMap("somekey"));
|
readWriteVerify(makeCacheEntryWithVariantMap("somekey"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,6 +91,11 @@ public class TestByteArrayCacheEntrySerializer {
|
||||||
assertIsAllowedClassNameTrue(Date.class.getName());
|
assertIsAllowedClassNameTrue(Date.class.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isAllowedClassNameInstantTrue() {
|
||||||
|
assertIsAllowedClassNameTrue(Instant.class.getName());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void isAllowedClassNameStatusLineTrue() {
|
public void isAllowedClassNameStatusLineTrue() {
|
||||||
assertIsAllowedClassNameTrue(StatusLine.class.getName());
|
assertIsAllowedClassNameTrue(StatusLine.class.getName());
|
||||||
|
@ -257,6 +268,27 @@ public class TestByteArrayCacheEntrySerializer {
|
||||||
assertThat(readEntry.getContent(), HttpCacheEntryMatcher.equivalent(writeEntry.getContent()));
|
assertThat(readEntry.getContent(), HttpCacheEntryMatcher.equivalent(writeEntry.getContent()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private HttpCacheStorageEntry makeCacheEntryDeprecatedConstructorWithVariantMap(final String key) {
|
||||||
|
final Header[] headers = new Header[5];
|
||||||
|
for (int i = 0; i < headers.length; i++) {
|
||||||
|
headers[i] = new BasicHeader("header" + i, "value" + i);
|
||||||
|
}
|
||||||
|
final String body = "Lorem ipsum dolor sit amet";
|
||||||
|
|
||||||
|
final Map<String,String> variantMap = new HashMap<>();
|
||||||
|
variantMap.put("test variant 1","true");
|
||||||
|
variantMap.put("test variant 2","true");
|
||||||
|
final HttpCacheEntry cacheEntry = new HttpCacheEntry(
|
||||||
|
Instant.now(),
|
||||||
|
Instant.now(),
|
||||||
|
HttpStatus.SC_OK,
|
||||||
|
headers,
|
||||||
|
new HeapResource(body.getBytes(StandardCharsets.UTF_8)), variantMap);
|
||||||
|
|
||||||
|
return new HttpCacheStorageEntry(key, cacheEntry);
|
||||||
|
}
|
||||||
|
|
||||||
private HttpCacheStorageEntry makeCacheEntryWithVariantMap(final String key) {
|
private HttpCacheStorageEntry makeCacheEntryWithVariantMap(final String key) {
|
||||||
final Header[] headers = new Header[5];
|
final Header[] headers = new Header[5];
|
||||||
for (int i = 0; i < headers.length; i++) {
|
for (int i = 0; i < headers.length; i++) {
|
||||||
|
@ -268,8 +300,8 @@ public class TestByteArrayCacheEntrySerializer {
|
||||||
variantMap.put("test variant 1","true");
|
variantMap.put("test variant 1","true");
|
||||||
variantMap.put("test variant 2","true");
|
variantMap.put("test variant 2","true");
|
||||||
final HttpCacheEntry cacheEntry = new HttpCacheEntry(
|
final HttpCacheEntry cacheEntry = new HttpCacheEntry(
|
||||||
new Date(),
|
Instant.now(),
|
||||||
new Date(),
|
Instant.now(),
|
||||||
HttpStatus.SC_OK,
|
HttpStatus.SC_OK,
|
||||||
headers,
|
headers,
|
||||||
new HeapResource(body.getBytes(StandardCharsets.UTF_8)), variantMap);
|
new HeapResource(body.getBytes(StandardCharsets.UTF_8)), variantMap);
|
||||||
|
|
|
@ -34,7 +34,6 @@ import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ -83,7 +82,7 @@ public class TestCacheUpdateHandler {
|
||||||
throws IOException {
|
throws IOException {
|
||||||
entry = HttpTestUtils.makeCacheEntry();
|
entry = HttpTestUtils.makeCacheEntry();
|
||||||
final HttpCacheEntry newEntry = impl.updateCacheEntry(null, entry,
|
final HttpCacheEntry newEntry = impl.updateCacheEntry(null, entry,
|
||||||
DateUtils.toDate(requestDate), DateUtils.toDate(responseDate), response);
|
requestDate, responseDate, response);
|
||||||
assertNotSame(newEntry, entry);
|
assertNotSame(newEntry, entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +95,7 @@ public class TestCacheUpdateHandler {
|
||||||
response.setHeaders();
|
response.setHeaders();
|
||||||
|
|
||||||
final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
|
final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
|
||||||
new Date(), new Date(), response);
|
Instant.now(), Instant.now(), response);
|
||||||
|
|
||||||
assertThat(updatedEntry, ContainsHeaderMatcher.contains("Date", DateUtils.formatStandardDate(responseDate)));
|
assertThat(updatedEntry, ContainsHeaderMatcher.contains("Date", DateUtils.formatStandardDate(responseDate)));
|
||||||
assertThat(updatedEntry, ContainsHeaderMatcher.contains("ETag", "\"etag\""));
|
assertThat(updatedEntry, ContainsHeaderMatcher.contains("ETag", "\"etag\""));
|
||||||
|
@ -116,7 +115,7 @@ public class TestCacheUpdateHandler {
|
||||||
new BasicHeader("Cache-Control", "public"));
|
new BasicHeader("Cache-Control", "public"));
|
||||||
|
|
||||||
final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
|
final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
|
||||||
new Date(), new Date(), response);
|
Instant.now(), Instant.now(), response);
|
||||||
|
|
||||||
assertThat(updatedEntry, ContainsHeaderMatcher.contains("Date", DateUtils.formatStandardDate(requestDate)));
|
assertThat(updatedEntry, ContainsHeaderMatcher.contains("Date", DateUtils.formatStandardDate(requestDate)));
|
||||||
assertThat(updatedEntry, ContainsHeaderMatcher.contains("ETag", "\"etag\""));
|
assertThat(updatedEntry, ContainsHeaderMatcher.contains("ETag", "\"etag\""));
|
||||||
|
@ -136,7 +135,7 @@ public class TestCacheUpdateHandler {
|
||||||
new BasicHeader("Cache-Control", "public"));
|
new BasicHeader("Cache-Control", "public"));
|
||||||
|
|
||||||
final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
|
final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
|
||||||
new Date(), new Date(), response);
|
Instant.now(), Instant.now(), response);
|
||||||
|
|
||||||
assertThat(updatedEntry, ContainsHeaderMatcher.contains("Date", DateUtils.formatStandardDate(requestDate)));
|
assertThat(updatedEntry, ContainsHeaderMatcher.contains("Date", DateUtils.formatStandardDate(requestDate)));
|
||||||
assertThat(updatedEntry, ContainsHeaderMatcher.contains("ETag", "\"etag\""));
|
assertThat(updatedEntry, ContainsHeaderMatcher.contains("ETag", "\"etag\""));
|
||||||
|
@ -154,8 +153,8 @@ public class TestCacheUpdateHandler {
|
||||||
entry = HttpTestUtils.makeCacheEntry(twoSecondsAgo, now, headers);
|
entry = HttpTestUtils.makeCacheEntry(twoSecondsAgo, now, headers);
|
||||||
response.setHeader("Date", DateUtils.formatStandardDate(tenSecondsAgo));
|
response.setHeader("Date", DateUtils.formatStandardDate(tenSecondsAgo));
|
||||||
response.setHeader("ETag", "\"old-etag\"");
|
response.setHeader("ETag", "\"old-etag\"");
|
||||||
final HttpCacheEntry result = impl.updateCacheEntry("A", entry, new Date(),
|
final HttpCacheEntry result = impl.updateCacheEntry("A", entry, Instant.now(),
|
||||||
new Date(), response);
|
Instant.now(), response);
|
||||||
assertThat(result, ContainsHeaderMatcher.contains("Date", DateUtils.formatStandardDate(oneSecondAgo)));
|
assertThat(result, ContainsHeaderMatcher.contains("Date", DateUtils.formatStandardDate(oneSecondAgo)));
|
||||||
assertThat(result, ContainsHeaderMatcher.contains("ETag", "\"new-etag\""));
|
assertThat(result, ContainsHeaderMatcher.contains("ETag", "\"new-etag\""));
|
||||||
}
|
}
|
||||||
|
@ -165,10 +164,10 @@ public class TestCacheUpdateHandler {
|
||||||
throws IOException {
|
throws IOException {
|
||||||
entry = HttpTestUtils.makeCacheEntry(tenSecondsAgo, eightSecondsAgo);
|
entry = HttpTestUtils.makeCacheEntry(tenSecondsAgo, eightSecondsAgo);
|
||||||
final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
|
final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
|
||||||
DateUtils.toDate(twoSecondsAgo), DateUtils.toDate(oneSecondAgo), response);
|
twoSecondsAgo, oneSecondAgo, response);
|
||||||
|
|
||||||
assertEquals(DateUtils.toDate(twoSecondsAgo), updated.getRequestDate());
|
assertEquals(twoSecondsAgo, updated.getRequestInstant());
|
||||||
assertEquals(DateUtils.toDate(oneSecondAgo), updated.getResponseDate());
|
assertEquals(oneSecondAgo, updated.getResponseInstant());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -182,7 +181,7 @@ public class TestCacheUpdateHandler {
|
||||||
response.setHeader("ETag", "\"new\"");
|
response.setHeader("ETag", "\"new\"");
|
||||||
response.setHeader("Date", DateUtils.formatStandardDate(twoSecondsAgo));
|
response.setHeader("Date", DateUtils.formatStandardDate(twoSecondsAgo));
|
||||||
final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
|
final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
|
||||||
DateUtils.toDate(twoSecondsAgo), DateUtils.toDate(oneSecondAgo), response);
|
twoSecondsAgo, oneSecondAgo, response);
|
||||||
|
|
||||||
assertEquals(0, updated.getHeaders("Warning").length);
|
assertEquals(0, updated.getHeaders("Warning").length);
|
||||||
}
|
}
|
||||||
|
@ -197,7 +196,7 @@ public class TestCacheUpdateHandler {
|
||||||
response.setHeader("ETag", "\"new\"");
|
response.setHeader("ETag", "\"new\"");
|
||||||
response.setHeader("Date", DateUtils.formatStandardDate(twoSecondsAgo));
|
response.setHeader("Date", DateUtils.formatStandardDate(twoSecondsAgo));
|
||||||
final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
|
final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
|
||||||
DateUtils.toDate(twoSecondsAgo), DateUtils.toDate(oneSecondAgo), response);
|
twoSecondsAgo, oneSecondAgo, response);
|
||||||
|
|
||||||
assertEquals("\"new\"", updated.getFirstHeader("ETag").getValue());
|
assertEquals("\"new\"", updated.getFirstHeader("ETag").getValue());
|
||||||
}
|
}
|
||||||
|
@ -211,8 +210,8 @@ public class TestCacheUpdateHandler {
|
||||||
entry = HttpTestUtils.makeCacheEntry(tenSecondsAgo, eightSecondsAgo, headers);
|
entry = HttpTestUtils.makeCacheEntry(tenSecondsAgo, eightSecondsAgo, headers);
|
||||||
response.setHeader("ETag", "\"new\"");
|
response.setHeader("ETag", "\"new\"");
|
||||||
response.setHeader("Date", "bad-date");
|
response.setHeader("Date", "bad-date");
|
||||||
final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
|
final HttpCacheEntry updated = impl.updateCacheEntry(null, entry, twoSecondsAgo,
|
||||||
DateUtils.toDate(twoSecondsAgo), DateUtils.toDate(oneSecondAgo), response);
|
oneSecondAgo, response);
|
||||||
|
|
||||||
assertEquals("\"new\"", updated.getFirstHeader("ETag").getValue());
|
assertEquals("\"new\"", updated.getFirstHeader("ETag").getValue());
|
||||||
}
|
}
|
||||||
|
@ -222,7 +221,7 @@ public class TestCacheUpdateHandler {
|
||||||
entry = HttpTestUtils.makeCacheEntry();
|
entry = HttpTestUtils.makeCacheEntry();
|
||||||
response = new BasicHttpResponse(HttpStatus.SC_OK, "OK");
|
response = new BasicHttpResponse(HttpStatus.SC_OK, "OK");
|
||||||
try {
|
try {
|
||||||
impl.updateCacheEntry("A", entry, new Date(), new Date(),
|
impl.updateCacheEntry("A", entry, Instant.now(), Instant.now(),
|
||||||
response);
|
response);
|
||||||
fail("should have thrown exception");
|
fail("should have thrown exception");
|
||||||
} catch (final IllegalArgumentException expected) {
|
} catch (final IllegalArgumentException expected) {
|
||||||
|
@ -261,7 +260,7 @@ public class TestCacheUpdateHandler {
|
||||||
new BasicHeader("Content-Encoding", "gzip"));
|
new BasicHeader("Content-Encoding", "gzip"));
|
||||||
|
|
||||||
final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
|
final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
|
||||||
new Date(), new Date(), response);
|
Instant.now(), Instant.now(), response);
|
||||||
|
|
||||||
final Header[] updatedHeaders = updatedEntry.getHeaders();
|
final Header[] updatedHeaders = updatedEntry.getHeaders();
|
||||||
headersContain(updatedHeaders, "Content-Encoding", "identity");
|
headersContain(updatedHeaders, "Content-Encoding", "identity");
|
||||||
|
@ -281,7 +280,7 @@ public class TestCacheUpdateHandler {
|
||||||
new BasicHeader("Content-Length", "0"));
|
new BasicHeader("Content-Length", "0"));
|
||||||
|
|
||||||
final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
|
final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
|
||||||
new Date(), new Date(), response);
|
Instant.now(), Instant.now(), response);
|
||||||
|
|
||||||
final Header[] updatedHeaders = updatedEntry.getHeaders();
|
final Header[] updatedHeaders = updatedEntry.getHeaders();
|
||||||
headersContain(updatedHeaders, "Transfer-Encoding", "chunked");
|
headersContain(updatedHeaders, "Transfer-Encoding", "chunked");
|
||||||
|
|
|
@ -33,7 +33,6 @@ import static org.junit.jupiter.api.Assertions.assertSame;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import org.apache.hc.client5.http.cache.HttpCacheEntry;
|
import org.apache.hc.client5.http.cache.HttpCacheEntry;
|
||||||
import org.apache.hc.client5.http.utils.DateUtils;
|
import org.apache.hc.client5.http.utils.DateUtils;
|
||||||
|
@ -141,7 +140,7 @@ public class TestCacheValidityPolicy {
|
||||||
@Test
|
@Test
|
||||||
public void testResidentTimeSecondsIsTimeSinceResponseTime() {
|
public void testResidentTimeSecondsIsTimeSinceResponseTime() {
|
||||||
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, sixSecondsAgo);
|
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, sixSecondsAgo);
|
||||||
assertEquals(TimeValue.ofSeconds(6), impl.getResidentTime(entry, DateUtils.toDate(now)));
|
assertEquals(TimeValue.ofSeconds(6), impl.getResidentTime(entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -153,11 +152,11 @@ public class TestCacheValidityPolicy {
|
||||||
return TimeValue.ofSeconds(11);
|
return TimeValue.ofSeconds(11);
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
protected TimeValue getResidentTime(final HttpCacheEntry ent, final Date d) {
|
protected TimeValue getResidentTime(final HttpCacheEntry ent, final Instant d) {
|
||||||
return TimeValue.ofSeconds(17);
|
return TimeValue.ofSeconds(17);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
assertEquals(TimeValue.ofSeconds(28), impl.getCurrentAge(entry, new Date()));
|
assertEquals(TimeValue.ofSeconds(28), impl.getCurrentAge(entry, Instant.now()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -250,9 +249,9 @@ public class TestCacheValidityPolicy {
|
||||||
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry();
|
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry();
|
||||||
impl = new CacheValidityPolicy() {
|
impl = new CacheValidityPolicy() {
|
||||||
@Override
|
@Override
|
||||||
public TimeValue getCurrentAge(final HttpCacheEntry e, final Date d) {
|
public TimeValue getCurrentAge(final HttpCacheEntry e, final Instant d) {
|
||||||
assertSame(entry, e);
|
assertSame(entry, e);
|
||||||
assertEquals(DateUtils.toDate(now), d);
|
assertEquals(now, d);
|
||||||
return TimeValue.ofSeconds(6);
|
return TimeValue.ofSeconds(6);
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
|
@ -261,7 +260,7 @@ public class TestCacheValidityPolicy {
|
||||||
return TimeValue.ofSeconds(10);
|
return TimeValue.ofSeconds(10);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
assertTrue(impl.isResponseFresh(entry, DateUtils.toDate(now)));
|
assertTrue(impl.isResponseFresh(entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -269,8 +268,8 @@ public class TestCacheValidityPolicy {
|
||||||
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry();
|
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry();
|
||||||
impl = new CacheValidityPolicy() {
|
impl = new CacheValidityPolicy() {
|
||||||
@Override
|
@Override
|
||||||
public TimeValue getCurrentAge(final HttpCacheEntry e, final Date d) {
|
public TimeValue getCurrentAge(final HttpCacheEntry e, final Instant d) {
|
||||||
assertEquals(DateUtils.toDate(now), d);
|
assertEquals(now, d);
|
||||||
assertSame(entry, e);
|
assertSame(entry, e);
|
||||||
return TimeValue.ofSeconds(6);
|
return TimeValue.ofSeconds(6);
|
||||||
}
|
}
|
||||||
|
@ -280,7 +279,7 @@ public class TestCacheValidityPolicy {
|
||||||
return TimeValue.ofSeconds(6);
|
return TimeValue.ofSeconds(6);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
assertFalse(impl.isResponseFresh(entry, DateUtils.toDate(now)));
|
assertFalse(impl.isResponseFresh(entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -288,8 +287,8 @@ public class TestCacheValidityPolicy {
|
||||||
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry();
|
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry();
|
||||||
impl = new CacheValidityPolicy() {
|
impl = new CacheValidityPolicy() {
|
||||||
@Override
|
@Override
|
||||||
public TimeValue getCurrentAge(final HttpCacheEntry e, final Date d) {
|
public TimeValue getCurrentAge(final HttpCacheEntry e, final Instant d) {
|
||||||
assertEquals(DateUtils.toDate(now), d);
|
assertEquals(now, d);
|
||||||
assertSame(entry, e);
|
assertSame(entry, e);
|
||||||
return TimeValue.ofSeconds(10);
|
return TimeValue.ofSeconds(10);
|
||||||
}
|
}
|
||||||
|
@ -299,7 +298,7 @@ public class TestCacheValidityPolicy {
|
||||||
return TimeValue.ofSeconds(6);
|
return TimeValue.ofSeconds(6);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
assertFalse(impl.isResponseFresh(entry, DateUtils.toDate(now)));
|
assertFalse(impl.isResponseFresh(entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -421,7 +420,7 @@ public class TestCacheValidityPolicy {
|
||||||
};
|
};
|
||||||
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
|
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
|
||||||
final HttpRequest req = new BasicHttpRequest("GET","/");
|
final HttpRequest req = new BasicHttpRequest("GET","/");
|
||||||
assertTrue(impl.mayReturnStaleIfError(req, entry, DateUtils.toDate(now)));
|
assertTrue(impl.mayReturnStaleIfError(req, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -433,7 +432,7 @@ public class TestCacheValidityPolicy {
|
||||||
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
|
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
|
||||||
final HttpRequest req = new BasicHttpRequest("GET","/");
|
final HttpRequest req = new BasicHttpRequest("GET","/");
|
||||||
req.setHeader("Cache-Control","stale-if-error=15");
|
req.setHeader("Cache-Control","stale-if-error=15");
|
||||||
assertTrue(impl.mayReturnStaleIfError(req, entry, DateUtils.toDate(now)));
|
assertTrue(impl.mayReturnStaleIfError(req, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -444,7 +443,7 @@ public class TestCacheValidityPolicy {
|
||||||
};
|
};
|
||||||
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
|
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
|
||||||
final HttpRequest req = new BasicHttpRequest("GET","/");
|
final HttpRequest req = new BasicHttpRequest("GET","/");
|
||||||
assertFalse(impl.mayReturnStaleIfError(req, entry, DateUtils.toDate(now)));
|
assertFalse(impl.mayReturnStaleIfError(req, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -456,7 +455,7 @@ public class TestCacheValidityPolicy {
|
||||||
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
|
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
|
||||||
final HttpRequest req = new BasicHttpRequest("GET","/");
|
final HttpRequest req = new BasicHttpRequest("GET","/");
|
||||||
req.setHeader("Cache-Control","stale-if-error=1");
|
req.setHeader("Cache-Control","stale-if-error=1");
|
||||||
assertFalse(impl.mayReturnStaleIfError(req, entry, DateUtils.toDate(now)));
|
assertFalse(impl.mayReturnStaleIfError(req, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -464,7 +463,7 @@ public class TestCacheValidityPolicy {
|
||||||
final Header[] headers = new Header[] { new BasicHeader("Cache-control", "public") };
|
final Header[] headers = new Header[] { new BasicHeader("Cache-control", "public") };
|
||||||
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(headers);
|
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(headers);
|
||||||
|
|
||||||
assertFalse(impl.mayReturnStaleWhileRevalidating(entry, DateUtils.toDate(now)));
|
assertFalse(impl.mayReturnStaleWhileRevalidating(entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -475,7 +474,7 @@ public class TestCacheValidityPolicy {
|
||||||
};
|
};
|
||||||
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
|
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
|
||||||
|
|
||||||
assertTrue(impl.mayReturnStaleWhileRevalidating(entry, DateUtils.toDate(now)));
|
assertTrue(impl.mayReturnStaleWhileRevalidating(entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -487,7 +486,7 @@ public class TestCacheValidityPolicy {
|
||||||
};
|
};
|
||||||
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
|
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
|
||||||
|
|
||||||
assertFalse(impl.mayReturnStaleWhileRevalidating(entry, DateUtils.toDate(now)));
|
assertFalse(impl.mayReturnStaleWhileRevalidating(entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -498,6 +497,6 @@ public class TestCacheValidityPolicy {
|
||||||
};
|
};
|
||||||
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
|
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
|
||||||
|
|
||||||
assertFalse(impl.mayReturnStaleWhileRevalidating(entry, DateUtils.toDate(now)));
|
assertFalse(impl.mayReturnStaleWhileRevalidating(entry, now));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.time.Instant;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
|
import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
|
||||||
|
@ -112,7 +112,7 @@ public class TestCachedHttpResponseGenerator {
|
||||||
|
|
||||||
final SimpleHttpResponse response = impl.generateResponse(request, entry);
|
final SimpleHttpResponse response = impl.generateResponse(request, entry);
|
||||||
|
|
||||||
verify(mockValidityPolicy).getCurrentAge(same(entry), isA(Date.class));
|
verify(mockValidityPolicy).getCurrentAge(same(entry), isA(Instant.class));
|
||||||
|
|
||||||
final Header ageHdr = response.getFirstHeader("Age");
|
final Header ageHdr = response.getFirstHeader("Age");
|
||||||
Assertions.assertNotNull(ageHdr);
|
Assertions.assertNotNull(ageHdr);
|
||||||
|
@ -125,7 +125,7 @@ public class TestCachedHttpResponseGenerator {
|
||||||
|
|
||||||
final SimpleHttpResponse response = impl.generateResponse(request, entry);
|
final SimpleHttpResponse response = impl.generateResponse(request, entry);
|
||||||
|
|
||||||
verify(mockValidityPolicy).getCurrentAge(same(entry), isA(Date.class));
|
verify(mockValidityPolicy).getCurrentAge(same(entry), isA(Instant.class));
|
||||||
|
|
||||||
final Header ageHdr = response.getFirstHeader("Age");
|
final Header ageHdr = response.getFirstHeader("Age");
|
||||||
Assertions.assertNull(ageHdr);
|
Assertions.assertNull(ageHdr);
|
||||||
|
@ -137,7 +137,7 @@ public class TestCachedHttpResponseGenerator {
|
||||||
|
|
||||||
final SimpleHttpResponse response = impl.generateResponse(request, entry);
|
final SimpleHttpResponse response = impl.generateResponse(request, entry);
|
||||||
|
|
||||||
verify(mockValidityPolicy).getCurrentAge(same(entry), isA(Date.class));
|
verify(mockValidityPolicy).getCurrentAge(same(entry), isA(Instant.class));
|
||||||
|
|
||||||
final Header ageHdr = response.getFirstHeader("Age");
|
final Header ageHdr = response.getFirstHeader("Age");
|
||||||
Assertions.assertNotNull(ageHdr);
|
Assertions.assertNotNull(ageHdr);
|
||||||
|
@ -147,7 +147,7 @@ public class TestCachedHttpResponseGenerator {
|
||||||
private void currentAge(final TimeValue age) {
|
private void currentAge(final TimeValue age) {
|
||||||
when(
|
when(
|
||||||
mockValidityPolicy.getCurrentAge(same(entry),
|
mockValidityPolicy.getCurrentAge(same(entry),
|
||||||
isA(Date.class))).thenReturn(age);
|
isA(Instant.class))).thenReturn(age);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -78,7 +78,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
new BasicHeader("Content-Length","1")
|
new BasicHeader("Content-Length","1")
|
||||||
};
|
};
|
||||||
entry = getEntry(headers);
|
entry = getEntry(headers);
|
||||||
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -89,7 +89,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
new BasicHeader("Content-Length","128")
|
new BasicHeader("Content-Length","128")
|
||||||
};
|
};
|
||||||
entry = getEntry(headers);
|
entry = getEntry(headers);
|
||||||
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -100,7 +100,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
new BasicHeader("Content-Length","128")
|
new BasicHeader("Content-Length","128")
|
||||||
};
|
};
|
||||||
entry = getEntry(headers);
|
entry = getEntry(headers);
|
||||||
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -112,7 +112,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
new BasicHeader("Content-Length","128")
|
new BasicHeader("Content-Length","128")
|
||||||
};
|
};
|
||||||
entry = getEntry(headers);
|
entry = getEntry(headers);
|
||||||
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -124,7 +124,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
new BasicHeader("Content-Length","128")
|
new BasicHeader("Content-Length","128")
|
||||||
};
|
};
|
||||||
entry = getEntry(headers);
|
entry = getEntry(headers);
|
||||||
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -136,7 +136,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
new BasicHeader("Content-Length","128")
|
new BasicHeader("Content-Length","128")
|
||||||
};
|
};
|
||||||
entry = getEntry(headers);
|
entry = getEntry(headers);
|
||||||
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -148,7 +148,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
new BasicHeader("Content-Length","128")
|
new BasicHeader("Content-Length","128")
|
||||||
};
|
};
|
||||||
entry = getEntry(headers);
|
entry = getEntry(headers);
|
||||||
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -160,7 +160,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
new BasicHeader("Content-Length","128")
|
new BasicHeader("Content-Length","128")
|
||||||
};
|
};
|
||||||
entry = getEntry(headers);
|
entry = getEntry(headers);
|
||||||
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -172,7 +172,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
new BasicHeader("Content-Length","128")
|
new BasicHeader("Content-Length","128")
|
||||||
};
|
};
|
||||||
entry = getEntry(headers);
|
entry = getEntry(headers);
|
||||||
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -184,7 +184,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
new BasicHeader("Content-Length","128")
|
new BasicHeader("Content-Length","128")
|
||||||
};
|
};
|
||||||
entry = getEntry(headers);
|
entry = getEntry(headers);
|
||||||
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
new BasicHeader("Content-Length","128")
|
new BasicHeader("Content-Length","128")
|
||||||
};
|
};
|
||||||
entry = getEntry(headers);
|
entry = getEntry(headers);
|
||||||
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -209,7 +209,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
new BasicHeader("Content-Length","128")
|
new BasicHeader("Content-Length","128")
|
||||||
};
|
};
|
||||||
entry = getEntry(headers);
|
entry = getEntry(headers);
|
||||||
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -230,7 +230,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
.setHeuristicCoefficient(0.1f).build();
|
.setHeuristicCoefficient(0.1f).build();
|
||||||
impl = new CachedResponseSuitabilityChecker(config);
|
impl = new CachedResponseSuitabilityChecker(config);
|
||||||
|
|
||||||
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -248,7 +248,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
.build();
|
.build();
|
||||||
impl = new CachedResponseSuitabilityChecker(config);
|
impl = new CachedResponseSuitabilityChecker(config);
|
||||||
|
|
||||||
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -261,7 +261,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
};
|
};
|
||||||
entry = getEntry(headers);
|
entry = getEntry(headers);
|
||||||
|
|
||||||
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, headRequest, entry, DateUtils.toDate(now)));
|
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, headRequest, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -273,7 +273,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
};
|
};
|
||||||
entry = HttpTestUtils.makeHeadCacheEntry(headers);
|
entry = HttpTestUtils.makeHeadCacheEntry(headers);
|
||||||
|
|
||||||
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -286,7 +286,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
};
|
};
|
||||||
entry = HttpTestUtils.makeCacheEntryWithNoRequestMethodOrEntity(headers);
|
entry = HttpTestUtils.makeCacheEntryWithNoRequestMethodOrEntity(headers);
|
||||||
|
|
||||||
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -299,7 +299,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
};
|
};
|
||||||
entry = HttpTestUtils.makeCacheEntryWithNoRequestMethod(headers);
|
entry = HttpTestUtils.makeCacheEntryWithNoRequestMethod(headers);
|
||||||
|
|
||||||
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -311,7 +311,7 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
};
|
};
|
||||||
entry = HttpTestUtils.make204CacheEntryWithNoRequestMethod(headers);
|
entry = HttpTestUtils.make204CacheEntryWithNoRequestMethod(headers);
|
||||||
|
|
||||||
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
|
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -325,6 +325,6 @@ public class TestCachedResponseSuitabilityChecker {
|
||||||
};
|
};
|
||||||
entry = HttpTestUtils.makeHeadCacheEntryWithNoRequestMethod(headers);
|
entry = HttpTestUtils.makeHeadCacheEntryWithNoRequestMethod(headers);
|
||||||
|
|
||||||
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, headRequest, entry, DateUtils.toDate(now)));
|
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, headRequest, entry, now));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1009,8 +1009,7 @@ public class TestCachingExecChain {
|
||||||
originResponse.setHeader("ETag", "\"etag\"");
|
originResponse.setHeader("ETag", "\"etag\"");
|
||||||
|
|
||||||
final ExecChain.Scope scope = new ExecChain.Scope("test", route, request, mockExecRuntime, context);
|
final ExecChain.Scope scope = new ExecChain.Scope("test", route, request, mockExecRuntime, context);
|
||||||
impl.cacheAndReturnResponse(host, request, originResponse, scope,
|
impl.cacheAndReturnResponse(host, request, originResponse, scope, requestSent, responseReceived);
|
||||||
DateUtils.toDate(requestSent), DateUtils.toDate(responseReceived));
|
|
||||||
|
|
||||||
Mockito.verify(cache, Mockito.never()).createCacheEntry(
|
Mockito.verify(cache, Mockito.never()).createCacheEntry(
|
||||||
Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any());
|
Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any());
|
||||||
|
@ -1043,12 +1042,11 @@ public class TestCachingExecChain {
|
||||||
RequestEquivalent.eq(request),
|
RequestEquivalent.eq(request),
|
||||||
ResponseEquivalent.eq(response),
|
ResponseEquivalent.eq(response),
|
||||||
Mockito.any(),
|
Mockito.any(),
|
||||||
Mockito.eq(DateUtils.toDate(requestSent)),
|
Mockito.eq(requestSent),
|
||||||
Mockito.eq(DateUtils.toDate(responseReceived)))).thenReturn(httpCacheEntry);
|
Mockito.eq(responseReceived))).thenReturn(httpCacheEntry);
|
||||||
|
|
||||||
final ExecChain.Scope scope = new ExecChain.Scope("test", route, request, mockExecRuntime, context);
|
final ExecChain.Scope scope = new ExecChain.Scope("test", route, request, mockExecRuntime, context);
|
||||||
impl.cacheAndReturnResponse(host, request, originResponse, scope,
|
impl.cacheAndReturnResponse(host, request, originResponse, scope, requestSent, responseReceived);
|
||||||
DateUtils.toDate(requestSent), DateUtils.toDate(responseReceived));
|
|
||||||
|
|
||||||
Mockito.verify(mockCache).createCacheEntry(
|
Mockito.verify(mockCache).createCacheEntry(
|
||||||
Mockito.any(),
|
Mockito.any(),
|
||||||
|
|
|
@ -82,6 +82,98 @@ public class TestHttpByteArrayCacheEntrySerializer {
|
||||||
serializer = HttpByteArrayCacheEntrySerializer.INSTANCE;
|
serializer = HttpByteArrayCacheEntrySerializer.INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deserialize a cache entry in a bad format, expecting an exception.
|
||||||
|
*
|
||||||
|
* @throws Exception is expected
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testInvalidCacheEntry() throws Exception {
|
||||||
|
// This file is a JPEG not a cache entry, so should fail to deserialize
|
||||||
|
final byte[] bytes = readTestFileBytes(TEST_CONTENT_FILE_NAME);
|
||||||
|
Assertions.assertThrows(ResourceIOException.class, () ->
|
||||||
|
httpCacheStorageEntryFromBytes(serializer, bytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deserialize a cache entry with a missing header, from a previously saved file.
|
||||||
|
*
|
||||||
|
* @throws Exception is expected
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testMissingHeaderCacheEntry() throws Exception {
|
||||||
|
// This file hand-edited to be missing a necessary header
|
||||||
|
final byte[] bytes = readTestFileBytes(MISSING_HEADER_TEST_SERIALIZED_NAME);
|
||||||
|
Assertions.assertThrows(ResourceIOException.class, () ->
|
||||||
|
httpCacheStorageEntryFromBytes(serializer, bytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deserialize a cache entry with an invalid header value, from a previously saved file.
|
||||||
|
*
|
||||||
|
* @throws Exception is expected
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testInvalidHeaderCacheEntry() throws Exception {
|
||||||
|
// This file hand-edited to have an invalid header
|
||||||
|
final byte[] bytes = readTestFileBytes(INVALID_HEADER_TEST_SERIALIZED_NAME);
|
||||||
|
Assertions.assertThrows(ResourceIOException.class, () ->
|
||||||
|
httpCacheStorageEntryFromBytes(serializer, bytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deserialize a cache entry with a missing variant map key, from a previously saved file.
|
||||||
|
*
|
||||||
|
* @throws Exception is expected
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testVariantMapMissingKeyCacheEntry() throws Exception {
|
||||||
|
// This file hand-edited to be missing a VariantCache key
|
||||||
|
final byte[] bytes = readTestFileBytes(VARIANTMAP_MISSING_KEY_TEST_SERIALIZED_NAME);
|
||||||
|
Assertions.assertThrows(ResourceIOException.class, () ->
|
||||||
|
httpCacheStorageEntryFromBytes(serializer, bytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deserialize a cache entry with a missing variant map value, from a previously saved file.
|
||||||
|
*
|
||||||
|
* @throws Exception is expected
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testVariantMapMissingValueCacheEntry() throws Exception {
|
||||||
|
// This file hand-edited to be missing a VariantCache value
|
||||||
|
final byte[] bytes = readTestFileBytes(VARIANTMAP_MISSING_VALUE_TEST_SERIALIZED_NAME);
|
||||||
|
Assertions.assertThrows(ResourceIOException.class, () ->
|
||||||
|
httpCacheStorageEntryFromBytes(serializer, bytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test an IOException being thrown while deserializing.
|
||||||
|
*
|
||||||
|
* @throws Exception is expected
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testDeserializeWithIOException() throws Exception {
|
||||||
|
final AbstractMessageParser<ClassicHttpResponse> throwyParser = Mockito.mock(AbstractMessageParser.class);
|
||||||
|
Mockito.
|
||||||
|
doThrow(new IOException("Test Exception")).
|
||||||
|
when(throwyParser).
|
||||||
|
parse(Mockito.any(SessionInputBuffer.class), Mockito.any(InputStream.class));
|
||||||
|
|
||||||
|
final HttpByteArrayCacheEntrySerializer testSerializer = new HttpByteArrayCacheEntrySerializer() {
|
||||||
|
@Override
|
||||||
|
protected AbstractMessageParser<ClassicHttpResponse> makeHttpResponseParser() {
|
||||||
|
return throwyParser;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Assertions.assertThrows(ResourceIOException.class, () ->
|
||||||
|
testSerializer.deserialize(new byte[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////// Using new Constructor with Instant //////////////
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serialize and deserialize a simple object with a tiny body.
|
* Serialize and deserialize a simple object with a tiny body.
|
||||||
*
|
*
|
||||||
|
@ -194,10 +286,9 @@ public class TestHttpByteArrayCacheEntrySerializer {
|
||||||
/**
|
/**
|
||||||
* Attempt to store a cache entry with a null storage key.
|
* Attempt to store a cache entry with a null storage key.
|
||||||
*
|
*
|
||||||
* @throws Exception is expected
|
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testNullStorageKey() throws Exception {
|
public void testNullStorageKey() {
|
||||||
final HttpCacheStorageEntryTestTemplate cacheObjectValues = HttpCacheStorageEntryTestTemplate.makeDefault();
|
final HttpCacheStorageEntryTestTemplate cacheObjectValues = HttpCacheStorageEntryTestTemplate.makeDefault();
|
||||||
cacheObjectValues.storageKey = null;
|
cacheObjectValues.storageKey = null;
|
||||||
|
|
||||||
|
@ -291,71 +382,6 @@ public class TestHttpByteArrayCacheEntrySerializer {
|
||||||
verifyHttpCacheEntryFromTestFile(serializer, testEntry, NO_BODY_TEST_SERIALIZED_NAME, reserializeFiles);
|
verifyHttpCacheEntryFromTestFile(serializer, testEntry, NO_BODY_TEST_SERIALIZED_NAME, reserializeFiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Deserialize a cache entry in a bad format, expecting an exception.
|
|
||||||
*
|
|
||||||
* @throws Exception is expected
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testInvalidCacheEntry() throws Exception {
|
|
||||||
// This file is a JPEG not a cache entry, so should fail to deserialize
|
|
||||||
final byte[] bytes = readTestFileBytes(TEST_CONTENT_FILE_NAME);
|
|
||||||
Assertions.assertThrows(ResourceIOException.class, () ->
|
|
||||||
httpCacheStorageEntryFromBytes(serializer, bytes));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deserialize a cache entry with a missing header, from a previously saved file.
|
|
||||||
*
|
|
||||||
* @throws Exception is expected
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testMissingHeaderCacheEntry() throws Exception {
|
|
||||||
// This file hand-edited to be missing a necessary header
|
|
||||||
final byte[] bytes = readTestFileBytes(MISSING_HEADER_TEST_SERIALIZED_NAME);
|
|
||||||
Assertions.assertThrows(ResourceIOException.class, () ->
|
|
||||||
httpCacheStorageEntryFromBytes(serializer, bytes));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deserialize a cache entry with an invalid header value, from a previously saved file.
|
|
||||||
*
|
|
||||||
* @throws Exception is expected
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testInvalidHeaderCacheEntry() throws Exception {
|
|
||||||
// This file hand-edited to have an invalid header
|
|
||||||
final byte[] bytes = readTestFileBytes(INVALID_HEADER_TEST_SERIALIZED_NAME);
|
|
||||||
Assertions.assertThrows(ResourceIOException.class, () ->
|
|
||||||
httpCacheStorageEntryFromBytes(serializer, bytes));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deserialize a cache entry with a missing variant map key, from a previously saved file.
|
|
||||||
*
|
|
||||||
* @throws Exception is expected
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testVariantMapMissingKeyCacheEntry() throws Exception {
|
|
||||||
// This file hand-edited to be missing a VariantCache key
|
|
||||||
final byte[] bytes = readTestFileBytes(VARIANTMAP_MISSING_KEY_TEST_SERIALIZED_NAME);
|
|
||||||
Assertions.assertThrows(ResourceIOException.class, () ->
|
|
||||||
httpCacheStorageEntryFromBytes(serializer, bytes));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deserialize a cache entry with a missing variant map value, from a previously saved file.
|
|
||||||
*
|
|
||||||
* @throws Exception is expected
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testVariantMapMissingValueCacheEntry() throws Exception {
|
|
||||||
// This file hand-edited to be missing a VariantCache value
|
|
||||||
final byte[] bytes = readTestFileBytes(VARIANTMAP_MISSING_VALUE_TEST_SERIALIZED_NAME);
|
|
||||||
Assertions.assertThrows(ResourceIOException.class, () ->
|
|
||||||
httpCacheStorageEntryFromBytes(serializer, bytes));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test an HttpException being thrown while serializing.
|
* Test an HttpException being thrown while serializing.
|
||||||
*
|
*
|
||||||
|
@ -382,26 +408,5 @@ public class TestHttpByteArrayCacheEntrySerializer {
|
||||||
testSerializer.serialize(testEntry));
|
testSerializer.serialize(testEntry));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Test an IOException being thrown while deserializing.
|
|
||||||
*
|
|
||||||
* @throws Exception is expected
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testDeserializeWithIOException() throws Exception {
|
|
||||||
final AbstractMessageParser<ClassicHttpResponse> throwyParser = Mockito.mock(AbstractMessageParser.class);
|
|
||||||
Mockito.
|
|
||||||
doThrow(new IOException("Test Exception")).
|
|
||||||
when(throwyParser).
|
|
||||||
parse(Mockito.any(SessionInputBuffer.class), Mockito.any(InputStream.class));
|
|
||||||
|
|
||||||
final HttpByteArrayCacheEntrySerializer testSerializer = new HttpByteArrayCacheEntrySerializer() {
|
|
||||||
@Override
|
|
||||||
protected AbstractMessageParser<ClassicHttpResponse> makeHttpResponseParser() {
|
|
||||||
return throwyParser;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Assertions.assertThrows(ResourceIOException.class, () ->
|
|
||||||
testSerializer.deserialize(new byte[0]));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -204,7 +204,7 @@ public class TestWarningValue {
|
||||||
Assertions.assertEquals("fred", impl.getWarnAgent());
|
Assertions.assertEquals("fred", impl.getWarnAgent());
|
||||||
Assertions.assertEquals("\"stale\"", impl.getWarnText());
|
Assertions.assertEquals("\"stale\"", impl.getWarnText());
|
||||||
final Instant target = DateUtils.parseStandardDate("Sun Nov 6 08:49:37 1994");
|
final Instant target = DateUtils.parseStandardDate("Sun Nov 6 08:49:37 1994");
|
||||||
Assertions.assertEquals(target, DateUtils.toInstant(impl.getWarnDate()));
|
Assertions.assertEquals(target, impl.getWarnDate());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -214,7 +214,7 @@ public class TestWarningValue {
|
||||||
Assertions.assertEquals("fred", impl.getWarnAgent());
|
Assertions.assertEquals("fred", impl.getWarnAgent());
|
||||||
Assertions.assertEquals("\"stale\"", impl.getWarnText());
|
Assertions.assertEquals("\"stale\"", impl.getWarnText());
|
||||||
final Instant target = DateUtils.parseStandardDate("Sunday, 06-Nov-94 08:49:37 GMT");
|
final Instant target = DateUtils.parseStandardDate("Sunday, 06-Nov-94 08:49:37 GMT");
|
||||||
Assertions.assertEquals(target, DateUtils.toInstant(impl.getWarnDate()));
|
Assertions.assertEquals(target, impl.getWarnDate());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -224,7 +224,7 @@ public class TestWarningValue {
|
||||||
Assertions.assertEquals("fred", impl.getWarnAgent());
|
Assertions.assertEquals("fred", impl.getWarnAgent());
|
||||||
Assertions.assertEquals("\"stale\"", impl.getWarnText());
|
Assertions.assertEquals("\"stale\"", impl.getWarnText());
|
||||||
final Instant target = DateUtils.parseStandardDate("Sun, 06 Nov 1994 08:49:37 GMT");
|
final Instant target = DateUtils.parseStandardDate("Sun, 06 Nov 1994 08:49:37 GMT");
|
||||||
Assertions.assertEquals(target, DateUtils.toInstant(impl.getWarnDate()));
|
Assertions.assertEquals(target, impl.getWarnDate());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
@ -260,21 +261,48 @@ public class Request {
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use {@link #setDate(Instant)}
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public Request setDate(final Date date) {
|
public Request setDate(final Date date) {
|
||||||
this.request.setHeader(HttpHeader.DATE, DateUtils.formatStandardDate(DateUtils.toInstant(date)));
|
this.request.setHeader(HttpHeader.DATE, DateUtils.formatStandardDate(DateUtils.toInstant(date)));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use {@link #setIfModifiedSince(Instant)}
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public Request setIfModifiedSince(final Date date) {
|
public Request setIfModifiedSince(final Date date) {
|
||||||
this.request.setHeader(HttpHeader.IF_MODIFIED_SINCE, DateUtils.formatStandardDate(DateUtils.toInstant(date)));
|
this.request.setHeader(HttpHeader.IF_MODIFIED_SINCE, DateUtils.formatStandardDate(DateUtils.toInstant(date)));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use {@link #setIfUnmodifiedSince(Instant)}
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public Request setIfUnmodifiedSince(final Date date) {
|
public Request setIfUnmodifiedSince(final Date date) {
|
||||||
this.request.setHeader(HttpHeader.IF_UNMODIFIED_SINCE, DateUtils.formatStandardDate(DateUtils.toInstant(date)));
|
this.request.setHeader(HttpHeader.IF_UNMODIFIED_SINCE, DateUtils.formatStandardDate(DateUtils.toInstant(date)));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Request setDate(final Instant instant) {
|
||||||
|
this.request.setHeader(HttpHeader.DATE, DateUtils.formatStandardDate(instant));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Request setIfModifiedSince(final Instant instant) {
|
||||||
|
this.request.setHeader(HttpHeader.IF_MODIFIED_SINCE, DateUtils.formatStandardDate(instant));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Request setIfUnmodifiedSince(final Instant instant) {
|
||||||
|
this.request.setHeader(HttpHeader.IF_UNMODIFIED_SINCE, DateUtils.formatStandardDate(instant));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
//// HTTP protocol parameter operations
|
//// HTTP protocol parameter operations
|
||||||
|
|
||||||
public Request version(final HttpVersion version) {
|
public Request version(final HttpVersion version) {
|
||||||
|
|
|
@ -248,7 +248,7 @@ public class RequestConfig implements Cloneable {
|
||||||
public static RequestConfig.Builder custom() {
|
public static RequestConfig.Builder custom() {
|
||||||
return new Builder();
|
return new Builder();
|
||||||
}
|
}
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public static RequestConfig.Builder copy(final RequestConfig config) {
|
public static RequestConfig.Builder copy(final RequestConfig config) {
|
||||||
return new Builder()
|
return new Builder()
|
||||||
.setExpectContinueEnabled(config.isExpectContinueEnabled())
|
.setExpectContinueEnabled(config.isExpectContinueEnabled())
|
||||||
|
|
|
@ -29,6 +29,7 @@ package org.apache.hc.client5.http.cookie;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.ObjectInputStream;
|
import java.io.ObjectInputStream;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
@ -83,7 +84,7 @@ public class BasicCookieStore implements CookieStore, Serializable {
|
||||||
try {
|
try {
|
||||||
// first remove any old cookie that is equivalent
|
// first remove any old cookie that is equivalent
|
||||||
cookies.remove(cookie);
|
cookies.remove(cookie);
|
||||||
if (!cookie.isExpired(new Date())) {
|
if (!cookie.isExpired(Instant.now())) {
|
||||||
cookies.add(cookie);
|
cookies.add(cookie);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -136,6 +137,7 @@ public class BasicCookieStore implements CookieStore, Serializable {
|
||||||
* @see Cookie#isExpired(Date)
|
* @see Cookie#isExpired(Date)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public boolean clearExpired(final Date date) {
|
public boolean clearExpired(final Date date) {
|
||||||
if (date == null) {
|
if (date == null) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -155,6 +157,34 @@ public class BasicCookieStore implements CookieStore, Serializable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes all of {@link Cookie cookies} in this HTTP state that have expired by the specified
|
||||||
|
* {@link Instant date}.
|
||||||
|
*
|
||||||
|
* @return true if any cookies were purged.
|
||||||
|
* @see Cookie#isExpired(Instant)
|
||||||
|
* @since 5.2
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean clearExpired(final Instant instant) {
|
||||||
|
if (instant == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
lock.writeLock().lock();
|
||||||
|
try {
|
||||||
|
boolean removed = false;
|
||||||
|
for (final Iterator<Cookie> it = cookies.iterator(); it.hasNext(); ) {
|
||||||
|
if (it.next().isExpired(instant)) {
|
||||||
|
it.remove();
|
||||||
|
removed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return removed;
|
||||||
|
} finally {
|
||||||
|
lock.writeLock().unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clears all cookies.
|
* Clears all cookies.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
package org.apache.hc.client5.http.cookie;
|
package org.apache.hc.client5.http.cookie;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -77,9 +78,26 @@ public interface Cookie {
|
||||||
* considered immutable. Changing it (e.g. using setTime()) could result
|
* considered immutable. Changing it (e.g. using setTime()) could result
|
||||||
* in undefined behaviour. Do so at your peril. </p>
|
* in undefined behaviour. Do so at your peril. </p>
|
||||||
* @return Expiration {@link Date}, or {@code null}.
|
* @return Expiration {@link Date}, or {@code null}.
|
||||||
|
* @deprecated Use {{@link #getExpiryInstant()}}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
Date getExpiryDate();
|
Date getExpiryDate();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the expiration {@link Instant} of the cookie, or {@code null} if none exists.
|
||||||
|
* <p><strong>Note:</strong> the object returned by this method is
|
||||||
|
* considered immutable. Changing it (e.g. using setTime()) could result in undefined behaviour.
|
||||||
|
* Do so at your peril. </p>
|
||||||
|
*
|
||||||
|
* @return Expiration {@link Instant}, or {@code null}.
|
||||||
|
* @since 5.2
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("deprecated")
|
||||||
|
default Instant getExpiryInstant() {
|
||||||
|
final Date date = getExpiryDate();
|
||||||
|
return date != null ? Instant.ofEpochMilli(date.getTime()) : null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns {@code false} if the cookie should be discarded at the end
|
* Returns {@code false} if the cookie should be discarded at the end
|
||||||
* of the "session"; {@code true} otherwise.
|
* of the "session"; {@code true} otherwise.
|
||||||
|
@ -119,13 +137,34 @@ public interface Cookie {
|
||||||
* @param date Current time
|
* @param date Current time
|
||||||
*
|
*
|
||||||
* @return {@code true} if the cookie has expired.
|
* @return {@code true} if the cookie has expired.
|
||||||
|
* @deprecated Use {{@link #isExpired(Instant)}}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
boolean isExpired(final Date date);
|
boolean isExpired(final Date date);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if this cookie has expired.
|
||||||
|
*
|
||||||
|
* @param date Current time
|
||||||
|
* @return {@code true} if the cookie has expired.
|
||||||
|
* @since 5.2
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
default boolean isExpired(final Instant date) {
|
||||||
|
return isExpired(date != null ? new Date(date.toEpochMilli()) : null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns creation time of the cookie.
|
||||||
|
* @deprecated Use {@link #getCreationInstant()}
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
Date getCreationDate();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns creation time of the cookie.
|
* Returns creation time of the cookie.
|
||||||
*/
|
*/
|
||||||
Date getCreationDate();
|
default Instant getCreationInstant() { return null; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether this Cookie has been marked as {@code httpOnly}.
|
* Checks whether this Cookie has been marked as {@code httpOnly}.
|
||||||
|
|
|
@ -27,8 +27,8 @@
|
||||||
|
|
||||||
package org.apache.hc.client5.http.cookie;
|
package org.apache.hc.client5.http.cookie;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import org.apache.hc.core5.annotation.Contract;
|
import org.apache.hc.core5.annotation.Contract;
|
||||||
import org.apache.hc.core5.annotation.ThreadingBehavior;
|
import org.apache.hc.core5.annotation.ThreadingBehavior;
|
||||||
|
@ -56,10 +56,10 @@ public class CookiePriorityComparator implements Comparator<Cookie> {
|
||||||
final int l2 = getPathLength(c2);
|
final int l2 = getPathLength(c2);
|
||||||
final int result = l2 - l1;
|
final int result = l2 - l1;
|
||||||
if (result == 0) {
|
if (result == 0) {
|
||||||
final Date d1 = c1.getCreationDate();
|
final Instant d1 = c1.getCreationInstant();
|
||||||
final Date d2 = c2.getCreationDate();
|
final Instant d2 = c2.getCreationInstant();
|
||||||
if (d1 != null && d2 != null) {
|
if (d1 != null && d2 != null) {
|
||||||
return (int) (d1.getTime() - d2.getTime());
|
return (int) (d1.toEpochMilli() - d2.toEpochMilli());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hc.client5.http.cookie;
|
package org.apache.hc.client5.http.cookie;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -58,9 +59,22 @@ public interface CookieStore {
|
||||||
* the specified {@link java.util.Date}.
|
* the specified {@link java.util.Date}.
|
||||||
*
|
*
|
||||||
* @return true if any cookies were purged.
|
* @return true if any cookies were purged.
|
||||||
|
* @deprecated Use {@link #clearExpired(Instant)}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
boolean clearExpired(Date date);
|
boolean clearExpired(Date date);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes all of {@link Cookie}s in this store that have expired by
|
||||||
|
* the specified {@link Instant}.
|
||||||
|
*
|
||||||
|
* @return true if any cookies were purged.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
default boolean clearExpired(Instant date) {
|
||||||
|
return clearExpired(date != null ? new Date(date.toEpochMilli()) : null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clears all cookies.
|
* Clears all cookies.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -27,8 +27,11 @@
|
||||||
|
|
||||||
package org.apache.hc.client5.http.cookie;
|
package org.apache.hc.client5.http.cookie;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
import org.apache.hc.client5.http.utils.DateUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This interface represents a {@code Set-Cookie} response header sent by the
|
* This interface represents a {@code Set-Cookie} response header sent by the
|
||||||
* origin server to the HTTP agent in order to maintain a conversational state.
|
* origin server to the HTTP agent in order to maintain a conversational state.
|
||||||
|
@ -48,10 +51,26 @@ public interface SetCookie extends Cookie {
|
||||||
* @param expiryDate the {@link Date} after which this cookie is no longer valid.
|
* @param expiryDate the {@link Date} after which this cookie is no longer valid.
|
||||||
*
|
*
|
||||||
* @see Cookie#getExpiryDate
|
* @see Cookie#getExpiryDate
|
||||||
*
|
* @deprecated Use {{@link #setExpiryDate(Instant)}}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
void setExpiryDate (Date expiryDate);
|
void setExpiryDate (Date expiryDate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets expiration date.
|
||||||
|
* <p><strong>Note:</strong> the object returned by this method is considered
|
||||||
|
* immutable. Changing it (e.g. using setTime()) could result in undefined behaviour. Do so at
|
||||||
|
* your peril.</p>
|
||||||
|
*
|
||||||
|
* @param expiryDate the {@link Instant} after which this cookie is no longer valid.
|
||||||
|
* @see Cookie#getExpiryInstant()
|
||||||
|
* @since 5.2
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("deprecated")
|
||||||
|
default void setExpiryDate(Instant expiryDate) {
|
||||||
|
setExpiryDate(DateUtils.toDate(expiryDate));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the domain attribute.
|
* Sets the domain attribute.
|
||||||
*
|
*
|
||||||
|
|
|
@ -749,7 +749,7 @@ public class HttpAsyncClientBuilder {
|
||||||
}
|
}
|
||||||
closeables.add(closeable);
|
closeables.add(closeable);
|
||||||
}
|
}
|
||||||
|
@SuppressWarnings("deprecated")
|
||||||
public CloseableHttpAsyncClient build() {
|
public CloseableHttpAsyncClient build() {
|
||||||
AsyncClientConnectionManager connManagerCopy = this.connManager;
|
AsyncClientConnectionManager connManagerCopy = this.connManager;
|
||||||
if (connManagerCopy == null) {
|
if (connManagerCopy == null) {
|
||||||
|
|
|
@ -28,12 +28,14 @@
|
||||||
package org.apache.hc.client5.http.impl.cookie;
|
package org.apache.hc.client5.http.impl.cookie;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.hc.client5.http.cookie.SetCookie;
|
import org.apache.hc.client5.http.cookie.SetCookie;
|
||||||
|
import org.apache.hc.client5.http.utils.DateUtils;
|
||||||
import org.apache.hc.core5.util.Args;
|
import org.apache.hc.core5.util.Args;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -99,9 +101,19 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
|
||||||
*
|
*
|
||||||
* @see #setExpiryDate(java.util.Date)
|
* @see #setExpiryDate(java.util.Date)
|
||||||
*
|
*
|
||||||
|
* @deprecated Use {@link #getExpiryInstant()}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public Date getExpiryDate() {
|
public Date getExpiryDate() {
|
||||||
|
return DateUtils.toDate(cookieExpiryDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Instant getExpiryInstant() {
|
||||||
return cookieExpiryDate;
|
return cookieExpiryDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,12 +125,28 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
|
||||||
*
|
*
|
||||||
* @param expiryDate the {@link Date} after which this cookie is no longer valid.
|
* @param expiryDate the {@link Date} after which this cookie is no longer valid.
|
||||||
*
|
*
|
||||||
* @see #getExpiryDate
|
* @deprecated Use {{@link #setExpiryDate(Instant)}}
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public void setExpiryDate (final Date expiryDate) {
|
public void setExpiryDate (final Date expiryDate) {
|
||||||
cookieExpiryDate = expiryDate;
|
cookieExpiryDate = DateUtils.toInstant(expiryDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets expiration date.
|
||||||
|
* <p><strong>Note:</strong> the object returned by this method is considered
|
||||||
|
* immutable. Changing it (e.g. using setTime()) could result in undefined behaviour. Do so at
|
||||||
|
* your peril.</p>
|
||||||
|
*
|
||||||
|
* @param expiryInstant the {@link Instant} after which this cookie is no longer valid.
|
||||||
|
* @see #getExpiryInstant()
|
||||||
|
* @since 5.2
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setExpiryDate (final Instant expiryInstant) {
|
||||||
|
cookieExpiryDate = expiryInstant;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -233,19 +261,46 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
|
||||||
* @param date Current time
|
* @param date Current time
|
||||||
*
|
*
|
||||||
* @return {@code true} if the cookie has expired.
|
* @return {@code true} if the cookie has expired.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link #isExpired(Instant)}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public boolean isExpired(final Date date) {
|
public boolean isExpired(final Date date) {
|
||||||
Args.notNull(date, "Date");
|
Args.notNull(date, "Date");
|
||||||
return (cookieExpiryDate != null
|
return (cookieExpiryDate != null
|
||||||
&& cookieExpiryDate.getTime() <= date.getTime());
|
&& cookieExpiryDate.toEpochMilli() <= DateUtils.toInstant(date).toEpochMilli());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if this cookie has expired.
|
||||||
|
* @param instant Current time
|
||||||
|
*
|
||||||
|
* @return {@code true} if the cookie has expired.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean isExpired(final Instant instant) {
|
||||||
|
Args.notNull(instant, "Instant");
|
||||||
|
return (cookieExpiryDate != null
|
||||||
|
&& cookieExpiryDate.toEpochMilli() <= instant.toEpochMilli());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 4.4
|
* @since 4.4
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link #getCreationInstant()}.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public Date getCreationDate() {
|
public Date getCreationDate() {
|
||||||
|
return DateUtils.toDate(creationDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 5.2
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Instant getCreationInstant() {
|
||||||
return creationDate;
|
return creationDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,8 +316,17 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 4.4
|
* @since 4.4
|
||||||
|
* @deprecated Use {@link #setCreationDate(Instant)}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public void setCreationDate(final Date creationDate) {
|
public void setCreationDate(final Date creationDate) {
|
||||||
|
this.creationDate = DateUtils.toInstant(creationDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 5.2
|
||||||
|
*/
|
||||||
|
public void setCreationDate(final Instant creationDate) {
|
||||||
this.creationDate = creationDate;
|
this.creationDate = creationDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,8 +393,8 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
|
||||||
/** Domain attribute. */
|
/** Domain attribute. */
|
||||||
private String cookieDomain;
|
private String cookieDomain;
|
||||||
|
|
||||||
/** Expiration {@link Date}. */
|
/** Expiration {@link Instant}. */
|
||||||
private Date cookieExpiryDate;
|
private Instant cookieExpiryDate;
|
||||||
|
|
||||||
/** Path attribute. */
|
/** Path attribute. */
|
||||||
private String cookiePath;
|
private String cookiePath;
|
||||||
|
@ -338,7 +402,7 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
|
||||||
/** My secure flag. */
|
/** My secure flag. */
|
||||||
private boolean isSecure;
|
private boolean isSecure;
|
||||||
|
|
||||||
private Date creationDate;
|
private Instant creationDate;
|
||||||
|
|
||||||
/** The {@code httpOnly} flag. */
|
/** The {@code httpOnly} flag. */
|
||||||
private boolean httpOnly;
|
private boolean httpOnly;
|
||||||
|
|
|
@ -86,7 +86,7 @@ public class BasicExpiresHandler extends AbstractCookieAttributeHandler implemen
|
||||||
throw new MalformedCookieException("Invalid 'expires' attribute: "
|
throw new MalformedCookieException("Invalid 'expires' attribute: "
|
||||||
+ value);
|
+ value);
|
||||||
}
|
}
|
||||||
cookie.setExpiryDate(DateUtils.toDate(expiry));
|
cookie.setExpiryDate(expiry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hc.client5.http.impl.cookie;
|
package org.apache.hc.client5.http.impl.cookie;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.time.Instant;
|
||||||
|
|
||||||
import org.apache.hc.client5.http.cookie.CommonCookieAttributeHandler;
|
import org.apache.hc.client5.http.cookie.CommonCookieAttributeHandler;
|
||||||
import org.apache.hc.client5.http.cookie.Cookie;
|
import org.apache.hc.client5.http.cookie.Cookie;
|
||||||
|
@ -66,7 +66,7 @@ public class BasicMaxAgeHandler extends AbstractCookieAttributeHandler implement
|
||||||
throw new MalformedCookieException ("Negative 'max-age' attribute: "
|
throw new MalformedCookieException ("Negative 'max-age' attribute: "
|
||||||
+ value);
|
+ value);
|
||||||
}
|
}
|
||||||
cookie.setExpiryDate(new Date(System.currentTimeMillis() + age * 1000L));
|
cookie.setExpiryDate(Instant.now().plusSeconds(age));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -41,7 +41,6 @@ import org.apache.hc.client5.http.cookie.CommonCookieAttributeHandler;
|
||||||
import org.apache.hc.client5.http.cookie.Cookie;
|
import org.apache.hc.client5.http.cookie.Cookie;
|
||||||
import org.apache.hc.client5.http.cookie.MalformedCookieException;
|
import org.apache.hc.client5.http.cookie.MalformedCookieException;
|
||||||
import org.apache.hc.client5.http.cookie.SetCookie;
|
import org.apache.hc.client5.http.cookie.SetCookie;
|
||||||
import org.apache.hc.client5.http.utils.DateUtils;
|
|
||||||
import org.apache.hc.core5.annotation.Contract;
|
import org.apache.hc.core5.annotation.Contract;
|
||||||
import org.apache.hc.core5.annotation.ThreadingBehavior;
|
import org.apache.hc.core5.annotation.ThreadingBehavior;
|
||||||
import org.apache.hc.core5.util.Args;
|
import org.apache.hc.core5.util.Args;
|
||||||
|
@ -180,7 +179,7 @@ public class LaxExpiresHandler extends AbstractCookieAttributeHandler implements
|
||||||
|
|
||||||
final Instant expiryDate = ZonedDateTime.of(year, month.getValue(), day, hour, minute, second, 0,
|
final Instant expiryDate = ZonedDateTime.of(year, month.getValue(), day, hour, minute, second, 0,
|
||||||
ZoneId.of("UTC")).toInstant();
|
ZoneId.of("UTC")).toInstant();
|
||||||
cookie.setExpiryDate(DateUtils.toDate(expiryDate));
|
cookie.setExpiryDate(expiryDate);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void skipDelims(final CharSequence buf, final Tokenizer.Cursor cursor) {
|
private void skipDelims(final CharSequence buf, final Tokenizer.Cursor cursor) {
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hc.client5.http.impl.cookie;
|
package org.apache.hc.client5.http.impl.cookie;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.time.Instant;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
@ -68,8 +68,8 @@ public class LaxMaxAgeHandler extends AbstractCookieAttributeHandler implements
|
||||||
} catch (final NumberFormatException e) {
|
} catch (final NumberFormatException e) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final Date expiryDate = age >= 0 ? new Date(System.currentTimeMillis() + age * 1000L) :
|
final Instant expiryDate = age >= 0 ? Instant.now().plusSeconds(age) :
|
||||||
new Date(Long.MIN_VALUE);
|
Instant.EPOCH;
|
||||||
cookie.setExpiryDate(expiryDate);
|
cookie.setExpiryDate(expiryDate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,10 +27,10 @@
|
||||||
|
|
||||||
package org.apache.hc.client5.http.impl.cookie;
|
package org.apache.hc.client5.http.impl.cookie;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
@ -146,7 +146,7 @@ public class RFC6265CookieSpec implements CookieSpec {
|
||||||
final BasicClientCookie cookie = new BasicClientCookie(name, value);
|
final BasicClientCookie cookie = new BasicClientCookie(name, value);
|
||||||
cookie.setPath(getDefaultPath(origin));
|
cookie.setPath(getDefaultPath(origin));
|
||||||
cookie.setDomain(getDefaultDomain(origin));
|
cookie.setDomain(getDefaultDomain(origin));
|
||||||
cookie.setCreationDate(new Date());
|
cookie.setCreationDate(Instant.now());
|
||||||
|
|
||||||
final Map<String, String> attribMap = new LinkedHashMap<>();
|
final Map<String, String> attribMap = new LinkedHashMap<>();
|
||||||
while (!cursor.atEnd()) {
|
while (!cursor.atEnd()) {
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
package org.apache.hc.client5.http.impl.io;
|
package org.apache.hc.client5.http.impl.io;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Date;
|
import java.time.Instant;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
@ -259,7 +259,7 @@ public class BasicHttpClientConnectionManager implements HttpClientConnectionMan
|
||||||
private void checkExpiry() {
|
private void checkExpiry() {
|
||||||
if (this.conn != null && System.currentTimeMillis() >= this.expiry) {
|
if (this.conn != null && System.currentTimeMillis() >= this.expiry) {
|
||||||
if (LOG.isDebugEnabled()) {
|
if (LOG.isDebugEnabled()) {
|
||||||
LOG.debug("{} Connection expired @ {}", id, new Date(this.expiry));
|
LOG.debug("{} Connection expired @ {}", id, Instant.ofEpochMilli(this.expiry));
|
||||||
}
|
}
|
||||||
closeConnection(CloseMode.GRACEFUL);
|
closeConnection(CloseMode.GRACEFUL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,8 +28,8 @@
|
||||||
package org.apache.hc.client5.http.protocol;
|
package org.apache.hc.client5.http.protocol;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.hc.client5.http.RouteInfo;
|
import org.apache.hc.client5.http.RouteInfo;
|
||||||
|
@ -150,7 +150,7 @@ public class RequestAddCookies implements HttpRequestInterceptor {
|
||||||
final List<Cookie> cookies = cookieStore.getCookies();
|
final List<Cookie> cookies = cookieStore.getCookies();
|
||||||
// Find cookies matching the given origin
|
// Find cookies matching the given origin
|
||||||
final List<Cookie> matchedCookies = new ArrayList<>();
|
final List<Cookie> matchedCookies = new ArrayList<>();
|
||||||
final Date now = new Date();
|
final Instant now = Instant.now();
|
||||||
boolean expired = false;
|
boolean expired = false;
|
||||||
for (final Cookie cookie : cookies) {
|
for (final Cookie cookie : cookies) {
|
||||||
if (!cookie.isExpired(now)) {
|
if (!cookie.isExpired(now)) {
|
||||||
|
|
|
@ -149,7 +149,7 @@ public class ResponseProcessCookies implements HttpResponseInterceptor {
|
||||||
buf.append(", path:");
|
buf.append(", path:");
|
||||||
buf.append(cookie.getPath());
|
buf.append(cookie.getPath());
|
||||||
buf.append(", expiry:");
|
buf.append(", expiry:");
|
||||||
buf.append(cookie.getExpiryDate());
|
buf.append(cookie.getExpiryInstant());
|
||||||
return buf.toString();
|
return buf.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -110,6 +110,7 @@ public class DefaultClientTlsStrategy extends AbstractClientTlsStrategy {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecated")
|
||||||
TlsDetails createTlsDetails(final SSLEngine sslEngine) {
|
TlsDetails createTlsDetails(final SSLEngine sslEngine) {
|
||||||
return tlsDetailsFactory != null ? tlsDetailsFactory.create(sslEngine) : null;
|
return tlsDetailsFactory != null ? tlsDetailsFactory.create(sslEngine) : null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,8 +27,8 @@
|
||||||
|
|
||||||
package org.apache.hc.client5.http.cookie;
|
package org.apache.hc.client5.http.cookie;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import org.apache.hc.client5.http.impl.cookie.BasicClientCookie;
|
import org.apache.hc.client5.http.impl.cookie.BasicClientCookie;
|
||||||
import org.junit.jupiter.api.Assertions;
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
@ -101,10 +101,10 @@ public class TestCookiePriorityComparator {
|
||||||
public void testUnequalityCreationDate() {
|
public void testUnequalityCreationDate() {
|
||||||
final BasicClientCookie cookie1 = new BasicClientCookie("name1", "value");
|
final BasicClientCookie cookie1 = new BasicClientCookie("name1", "value");
|
||||||
cookie1.setPath("/blah");
|
cookie1.setPath("/blah");
|
||||||
cookie1.setCreationDate(new Date(System.currentTimeMillis() - 200000));
|
cookie1.setCreationDate(Instant.now().minusMillis(200000));
|
||||||
final BasicClientCookie cookie2 = new BasicClientCookie("name1", "value");
|
final BasicClientCookie cookie2 = new BasicClientCookie("name1", "value");
|
||||||
cookie2.setPath("/blah");
|
cookie2.setPath("/blah");
|
||||||
cookie2.setCreationDate(new Date(System.currentTimeMillis()));
|
cookie2.setCreationDate(Instant.now());
|
||||||
Assertions.assertTrue(comparator.compare(cookie1, cookie2) < 0);
|
Assertions.assertTrue(comparator.compare(cookie1, cookie2) < 0);
|
||||||
Assertions.assertTrue(comparator.compare(cookie2, cookie1) > 0);
|
Assertions.assertTrue(comparator.compare(cookie2, cookie1) > 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -267,7 +267,7 @@ public class TestBasicCookieAttribHandlers {
|
||||||
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
||||||
final CookieAttributeHandler h = new BasicMaxAgeHandler();
|
final CookieAttributeHandler h = new BasicMaxAgeHandler();
|
||||||
h.parse(cookie, "2000");
|
h.parse(cookie, "2000");
|
||||||
Assertions.assertNotNull(cookie.getExpiryDate());
|
Assertions.assertNotNull(cookie.getExpiryInstant());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -327,7 +327,7 @@ public class TestBasicCookieAttribHandlers {
|
||||||
final CookieAttributeHandler h = new BasicExpiresHandler(DateUtils.FORMATTER_RFC1123);
|
final CookieAttributeHandler h = new BasicExpiresHandler(DateUtils.FORMATTER_RFC1123);
|
||||||
|
|
||||||
h.parse(cookie, DateUtils.formatStandardDate(Instant.now()));
|
h.parse(cookie, DateUtils.formatStandardDate(Instant.now()));
|
||||||
Assertions.assertNotNull(cookie.getExpiryDate());
|
Assertions.assertNotNull(cookie.getExpiryInstant());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -31,7 +31,8 @@ import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.ObjectInputStream;
|
import java.io.ObjectInputStream;
|
||||||
import java.io.ObjectOutputStream;
|
import java.io.ObjectOutputStream;
|
||||||
import java.util.Calendar;
|
import java.time.Instant;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.hc.client5.http.cookie.BasicCookieStore;
|
import org.apache.hc.client5.http.cookie.BasicCookieStore;
|
||||||
|
@ -65,9 +66,8 @@ public class TestBasicCookieStore {
|
||||||
final BasicCookieStore store = new BasicCookieStore();
|
final BasicCookieStore store = new BasicCookieStore();
|
||||||
final BasicClientCookie cookie = new BasicClientCookie("name1", "value1");
|
final BasicClientCookie cookie = new BasicClientCookie("name1", "value1");
|
||||||
|
|
||||||
final Calendar c = Calendar.getInstance();
|
final Instant minus_10_days = Instant.now().minus(10, ChronoUnit.DAYS);
|
||||||
c.add(Calendar.DAY_OF_YEAR, -10);
|
cookie.setExpiryDate(minus_10_days);
|
||||||
cookie.setExpiryDate(c.getTime());
|
|
||||||
store.addCookie(cookie);
|
store.addCookie(cookie);
|
||||||
final List<Cookie> list = store.getCookies();
|
final List<Cookie> list = store.getCookies();
|
||||||
Assertions.assertNotNull(list);
|
Assertions.assertNotNull(list);
|
||||||
|
|
|
@ -43,7 +43,7 @@ public class TestLaxCookieAttribHandlers {
|
||||||
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
||||||
final CookieAttributeHandler h = new LaxMaxAgeHandler();
|
final CookieAttributeHandler h = new LaxMaxAgeHandler();
|
||||||
h.parse(cookie, "2000");
|
h.parse(cookie, "2000");
|
||||||
Assertions.assertNotNull(cookie.getExpiryDate());
|
Assertions.assertNotNull(cookie.getExpiryInstant());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -51,7 +51,7 @@ public class TestLaxCookieAttribHandlers {
|
||||||
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
||||||
final CookieAttributeHandler h = new LaxMaxAgeHandler();
|
final CookieAttributeHandler h = new LaxMaxAgeHandler();
|
||||||
h.parse(cookie, "-2000");
|
h.parse(cookie, "-2000");
|
||||||
Assertions.assertNotNull(cookie.getExpiryDate());
|
Assertions.assertNotNull(cookie.getExpiryInstant());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -59,7 +59,7 @@ public class TestLaxCookieAttribHandlers {
|
||||||
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
||||||
final CookieAttributeHandler h = new LaxMaxAgeHandler();
|
final CookieAttributeHandler h = new LaxMaxAgeHandler();
|
||||||
h.parse(cookie, "0000");
|
h.parse(cookie, "0000");
|
||||||
Assertions.assertNotNull(cookie.getExpiryDate());
|
Assertions.assertNotNull(cookie.getExpiryInstant());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -67,7 +67,7 @@ public class TestLaxCookieAttribHandlers {
|
||||||
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
||||||
final CookieAttributeHandler h = new LaxMaxAgeHandler();
|
final CookieAttributeHandler h = new LaxMaxAgeHandler();
|
||||||
h.parse(cookie, " ");
|
h.parse(cookie, " ");
|
||||||
Assertions.assertNull(cookie.getExpiryDate());
|
Assertions.assertNull(cookie.getExpiryInstant());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -75,7 +75,7 @@ public class TestLaxCookieAttribHandlers {
|
||||||
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
||||||
final CookieAttributeHandler h = new LaxMaxAgeHandler();
|
final CookieAttributeHandler h = new LaxMaxAgeHandler();
|
||||||
h.parse(cookie, "garbage");
|
h.parse(cookie, "garbage");
|
||||||
Assertions.assertNull(cookie.getExpiryDate());
|
Assertions.assertNull(cookie.getExpiryInstant());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -98,7 +98,25 @@ public class TestLaxCookieAttribHandlers {
|
||||||
final CookieAttributeHandler h = new LaxExpiresHandler();
|
final CookieAttributeHandler h = new LaxExpiresHandler();
|
||||||
h.parse(cookie, "1:0:12 8-jan-2012");
|
h.parse(cookie, "1:0:12 8-jan-2012");
|
||||||
|
|
||||||
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
|
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
|
||||||
|
Assertions.assertNotNull(expiryDate);
|
||||||
|
|
||||||
|
Assertions.assertEquals(2012, expiryDate.get(ChronoField.YEAR));
|
||||||
|
Assertions.assertEquals(1, expiryDate.get(ChronoField.MONTH_OF_YEAR));
|
||||||
|
Assertions.assertEquals(8, expiryDate.get(ChronoField.DAY_OF_MONTH));
|
||||||
|
Assertions.assertEquals(1, expiryDate.get(ChronoField.HOUR_OF_DAY));
|
||||||
|
Assertions.assertEquals(0, expiryDate.get(ChronoField.MINUTE_OF_HOUR));
|
||||||
|
Assertions.assertEquals(12, expiryDate.get(ChronoField.SECOND_OF_MINUTE));
|
||||||
|
Assertions.assertEquals(0, expiryDate.get(ChronoField.MILLI_OF_SECOND));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParseExpiryInstant() throws Exception {
|
||||||
|
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
||||||
|
final CookieAttributeHandler h = new LaxExpiresHandler();
|
||||||
|
h.parse(cookie, "1:0:12 8-jan-2012");
|
||||||
|
|
||||||
|
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
|
||||||
Assertions.assertNotNull(expiryDate);
|
Assertions.assertNotNull(expiryDate);
|
||||||
|
|
||||||
Assertions.assertEquals(2012, expiryDate.get(ChronoField.YEAR));
|
Assertions.assertEquals(2012, expiryDate.get(ChronoField.YEAR));
|
||||||
|
@ -115,7 +133,7 @@ public class TestLaxCookieAttribHandlers {
|
||||||
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
||||||
final CookieAttributeHandler h = new LaxExpiresHandler();
|
final CookieAttributeHandler h = new LaxExpiresHandler();
|
||||||
h.parse(cookie, null);
|
h.parse(cookie, null);
|
||||||
Assertions.assertNull(cookie.getExpiryDate());
|
Assertions.assertNull(cookie.getExpiryInstant());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -156,7 +174,25 @@ public class TestLaxCookieAttribHandlers {
|
||||||
final CookieAttributeHandler h = new LaxExpiresHandler();
|
final CookieAttributeHandler h = new LaxExpiresHandler();
|
||||||
h.parse(cookie, "1:59:00blah; 8-feb-2000");
|
h.parse(cookie, "1:59:00blah; 8-feb-2000");
|
||||||
|
|
||||||
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
|
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
|
||||||
|
Assertions.assertNotNull(expiryDate);
|
||||||
|
|
||||||
|
Assertions.assertEquals(2000, expiryDate.get(ChronoField.YEAR_OF_ERA));
|
||||||
|
Assertions.assertEquals(2, expiryDate.get(ChronoField.MONTH_OF_YEAR));
|
||||||
|
Assertions.assertEquals(8, expiryDate.get(ChronoField.DAY_OF_MONTH));
|
||||||
|
Assertions.assertEquals(1, expiryDate.get(ChronoField.HOUR_OF_DAY));
|
||||||
|
Assertions.assertEquals(59, expiryDate.get(ChronoField.MINUTE_OF_HOUR));
|
||||||
|
Assertions.assertEquals(0, expiryDate.get(ChronoField.SECOND_OF_MINUTE));
|
||||||
|
Assertions.assertEquals(0, expiryDate.get(ChronoField.MILLI_OF_SECOND));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParseExpiryFunnyTimeInstant() throws Exception {
|
||||||
|
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
||||||
|
final CookieAttributeHandler h = new LaxExpiresHandler();
|
||||||
|
h.parse(cookie, "1:59:00blah; 8-feb-2000");
|
||||||
|
|
||||||
|
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
|
||||||
Assertions.assertNotNull(expiryDate);
|
Assertions.assertNotNull(expiryDate);
|
||||||
|
|
||||||
Assertions.assertEquals(2000, expiryDate.get(ChronoField.YEAR_OF_ERA));
|
Assertions.assertEquals(2000, expiryDate.get(ChronoField.YEAR_OF_ERA));
|
||||||
|
@ -198,7 +234,25 @@ public class TestLaxCookieAttribHandlers {
|
||||||
final CookieAttributeHandler h = new LaxExpiresHandler();
|
final CookieAttributeHandler h = new LaxExpiresHandler();
|
||||||
h.parse(cookie, "12:00:00 8blah;mar;1880");
|
h.parse(cookie, "12:00:00 8blah;mar;1880");
|
||||||
|
|
||||||
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
|
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
|
||||||
|
Assertions.assertNotNull(expiryDate);
|
||||||
|
|
||||||
|
Assertions.assertEquals(1880, expiryDate.get(ChronoField.YEAR));
|
||||||
|
Assertions.assertEquals(3, expiryDate.get(ChronoField.MONTH_OF_YEAR));
|
||||||
|
Assertions.assertEquals(8, expiryDate.get(ChronoField.DAY_OF_MONTH));
|
||||||
|
Assertions.assertEquals(12, expiryDate.get(ChronoField.HOUR_OF_DAY));
|
||||||
|
Assertions.assertEquals(0, expiryDate.get(ChronoField.MINUTE_OF_HOUR));
|
||||||
|
Assertions.assertEquals(0, expiryDate.get(ChronoField.SECOND_OF_MINUTE));
|
||||||
|
Assertions.assertEquals(0, expiryDate.get(ChronoField.MILLI_OF_SECOND));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParseExpiryFunnyDayOfMonthInstant() throws Exception {
|
||||||
|
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
||||||
|
final CookieAttributeHandler h = new LaxExpiresHandler();
|
||||||
|
h.parse(cookie, "12:00:00 8blah;mar;1880");
|
||||||
|
|
||||||
|
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
|
||||||
Assertions.assertNotNull(expiryDate);
|
Assertions.assertNotNull(expiryDate);
|
||||||
|
|
||||||
Assertions.assertEquals(1880, expiryDate.get(ChronoField.YEAR));
|
Assertions.assertEquals(1880, expiryDate.get(ChronoField.YEAR));
|
||||||
|
@ -224,7 +278,25 @@ public class TestLaxCookieAttribHandlers {
|
||||||
final CookieAttributeHandler h = new LaxExpiresHandler();
|
final CookieAttributeHandler h = new LaxExpiresHandler();
|
||||||
h.parse(cookie, "23:59:59; 1-ApriLLLLL-2008");
|
h.parse(cookie, "23:59:59; 1-ApriLLLLL-2008");
|
||||||
|
|
||||||
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
|
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
|
||||||
|
Assertions.assertNotNull(expiryDate);
|
||||||
|
|
||||||
|
Assertions.assertEquals(2008, expiryDate.get(ChronoField.YEAR));
|
||||||
|
Assertions.assertEquals(4, expiryDate.get(ChronoField.MONTH_OF_YEAR));
|
||||||
|
Assertions.assertEquals(1, expiryDate.get(ChronoField.DAY_OF_MONTH));
|
||||||
|
Assertions.assertEquals(23, expiryDate.get(ChronoField.HOUR_OF_DAY));
|
||||||
|
Assertions.assertEquals(59, expiryDate.get(ChronoField.MINUTE_OF_HOUR));
|
||||||
|
Assertions.assertEquals(59, expiryDate.get(ChronoField.SECOND_OF_MINUTE));
|
||||||
|
Assertions.assertEquals(0, expiryDate.get(ChronoField.MILLI_OF_SECOND));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParseExpiryFunnyMonthInstant() throws Exception {
|
||||||
|
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
||||||
|
final CookieAttributeHandler h = new LaxExpiresHandler();
|
||||||
|
h.parse(cookie, "23:59:59; 1-ApriLLLLL-2008");
|
||||||
|
|
||||||
|
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
|
||||||
Assertions.assertNotNull(expiryDate);
|
Assertions.assertNotNull(expiryDate);
|
||||||
|
|
||||||
Assertions.assertEquals(2008, expiryDate.get(ChronoField.YEAR));
|
Assertions.assertEquals(2008, expiryDate.get(ChronoField.YEAR));
|
||||||
|
@ -266,7 +338,25 @@ public class TestLaxCookieAttribHandlers {
|
||||||
final CookieAttributeHandler h = new LaxExpiresHandler();
|
final CookieAttributeHandler h = new LaxExpiresHandler();
|
||||||
h.parse(cookie, "23:59:59; 1-Apr-2008blah");
|
h.parse(cookie, "23:59:59; 1-Apr-2008blah");
|
||||||
|
|
||||||
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
|
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
|
||||||
|
Assertions.assertNotNull(expiryDate);
|
||||||
|
|
||||||
|
Assertions.assertEquals(2008, expiryDate.get(ChronoField.YEAR));
|
||||||
|
Assertions.assertEquals(4, expiryDate.get(ChronoField.MONTH_OF_YEAR));
|
||||||
|
Assertions.assertEquals(1, expiryDate.get(ChronoField.DAY_OF_MONTH));
|
||||||
|
Assertions.assertEquals(23, expiryDate.get(ChronoField.HOUR_OF_DAY));
|
||||||
|
Assertions.assertEquals(59, expiryDate.get(ChronoField.MINUTE_OF_HOUR));
|
||||||
|
Assertions.assertEquals(59, expiryDate.get(ChronoField.SECOND_OF_MINUTE));
|
||||||
|
Assertions.assertEquals(0, expiryDate.get(ChronoField.MILLI_OF_SECOND));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParseExpiryFunnyYearInstant() throws Exception {
|
||||||
|
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
|
||||||
|
final CookieAttributeHandler h = new LaxExpiresHandler();
|
||||||
|
h.parse(cookie, "23:59:59; 1-Apr-2008blah");
|
||||||
|
|
||||||
|
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
|
||||||
Assertions.assertNotNull(expiryDate);
|
Assertions.assertNotNull(expiryDate);
|
||||||
|
|
||||||
Assertions.assertEquals(2008, expiryDate.get(ChronoField.YEAR));
|
Assertions.assertEquals(2008, expiryDate.get(ChronoField.YEAR));
|
||||||
|
@ -284,7 +374,7 @@ public class TestLaxCookieAttribHandlers {
|
||||||
final CookieAttributeHandler h = new LaxExpiresHandler();
|
final CookieAttributeHandler h = new LaxExpiresHandler();
|
||||||
h.parse(cookie, "23:59:59; 1-Apr-70");
|
h.parse(cookie, "23:59:59; 1-Apr-70");
|
||||||
|
|
||||||
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
|
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
|
||||||
Assertions.assertNotNull(expiryDate);
|
Assertions.assertNotNull(expiryDate);
|
||||||
|
|
||||||
Assertions.assertEquals(1970, expiryDate.get(ChronoField.YEAR));
|
Assertions.assertEquals(1970, expiryDate.get(ChronoField.YEAR));
|
||||||
|
@ -296,7 +386,7 @@ public class TestLaxCookieAttribHandlers {
|
||||||
final CookieAttributeHandler h = new LaxExpiresHandler();
|
final CookieAttributeHandler h = new LaxExpiresHandler();
|
||||||
h.parse(cookie, "23:59:59; 1-Apr-99");
|
h.parse(cookie, "23:59:59; 1-Apr-99");
|
||||||
|
|
||||||
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
|
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
|
||||||
Assertions.assertNotNull(expiryDate);
|
Assertions.assertNotNull(expiryDate);
|
||||||
|
|
||||||
Assertions.assertEquals(1999, expiryDate.get(ChronoField.YEAR));
|
Assertions.assertEquals(1999, expiryDate.get(ChronoField.YEAR));
|
||||||
|
@ -308,7 +398,7 @@ public class TestLaxCookieAttribHandlers {
|
||||||
final CookieAttributeHandler h = new LaxExpiresHandler();
|
final CookieAttributeHandler h = new LaxExpiresHandler();
|
||||||
h.parse(cookie, "23:59:59; 1-Apr-00");
|
h.parse(cookie, "23:59:59; 1-Apr-00");
|
||||||
|
|
||||||
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
|
final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
|
||||||
Assertions.assertNotNull(expiryDate);
|
Assertions.assertNotNull(expiryDate);
|
||||||
|
|
||||||
Assertions.assertEquals(2000, expiryDate.get(ChronoField.YEAR));
|
Assertions.assertEquals(2000, expiryDate.get(ChronoField.YEAR));
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hc.client5.http.protocol;
|
package org.apache.hc.client5.http.protocol;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.time.Instant;
|
||||||
|
|
||||||
import org.apache.hc.client5.http.HttpRoute;
|
import org.apache.hc.client5.http.HttpRoute;
|
||||||
import org.apache.hc.client5.http.RouteInfo.LayerType;
|
import org.apache.hc.client5.http.RouteInfo.LayerType;
|
||||||
|
@ -321,7 +321,7 @@ public class TestRequestAddCookies {
|
||||||
final BasicClientCookie cookie3 = new BasicClientCookie("name3", "value3");
|
final BasicClientCookie cookie3 = new BasicClientCookie("name3", "value3");
|
||||||
cookie3.setDomain("localhost.local");
|
cookie3.setDomain("localhost.local");
|
||||||
cookie3.setPath("/");
|
cookie3.setPath("/");
|
||||||
cookie3.setExpiryDate(new Date(System.currentTimeMillis() + 100));
|
cookie3.setExpiryDate(Instant.now().plusMillis(100));
|
||||||
this.cookieStore.addCookie(cookie3);
|
this.cookieStore.addCookie(cookie3);
|
||||||
|
|
||||||
Assertions.assertEquals(3, this.cookieStore.getCookies().size());
|
Assertions.assertEquals(3, this.cookieStore.getCookies().size());
|
||||||
|
@ -346,7 +346,7 @@ public class TestRequestAddCookies {
|
||||||
Assertions.assertEquals(1, headers.length);
|
Assertions.assertEquals(1, headers.length);
|
||||||
Assertions.assertEquals("name1=value1; name2=value2", headers[0].getValue());
|
Assertions.assertEquals("name1=value1; name2=value2", headers[0].getValue());
|
||||||
|
|
||||||
Mockito.verify(this.cookieStore, Mockito.times(1)).clearExpired(ArgumentMatchers.any());
|
Mockito.verify(this.cookieStore, Mockito.times(1)).clearExpired(ArgumentMatchers.any(Instant.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
Loading…
Reference in New Issue