HTTPCLIENT-2189 - Cookie and Cache APIs to use Java time primitives

This commit is contained in:
Arturo Bernal 2021-11-23 06:27:33 +01:00 committed by Oleg Kalnichevski
parent 0a42d173ef
commit d323e0d684
52 changed files with 832 additions and 436 deletions

View File

@ -27,6 +27,7 @@
package org.apache.hc.client5.http.cache;
import java.io.Serializable;
import java.time.Instant;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
@ -59,13 +60,13 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
private static final long serialVersionUID = -6300496422359477413L;
private static final String REQUEST_METHOD_HEADER_NAME = "Hc-Request-Method";
private final Date requestDate;
private final Date responseDate;
private final Instant requestDate;
private final Instant responseDate;
private final int status;
private final HeaderGroup responseHeaders;
private final Resource resource;
private final Map<String, String> variantMap;
private final Date date;
private final Instant date;
/**
* 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
* from the varying request headers) to a "cache key" (where
* in the cache storage the particular variant is located)
* @deprecated Use {{@link #HttpCacheEntry(Instant, Instant, int, Header[], Resource, Map)}}
*/
@Deprecated
public HttpCacheEntry(
final Date requestDate,
final Date responseDate,
@ -97,6 +100,42 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
Args.notNull(responseDate, "Response date");
Args.check(status >= HttpStatus.SC_SUCCESS, "Status code");
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.responseDate = responseDate;
this.status = status;
@ -107,6 +146,21 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
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}.
*
@ -122,17 +176,17 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
* Header[] from original HTTP Response
* @param resource representing origin response body
*/
public HttpCacheEntry(final Date requestDate, final Date responseDate, final int status,
final Header[] responseHeaders, final Resource resource) {
public HttpCacheEntry(final Instant requestDate, final Instant responseDate, final int status,
final Header[] responseHeaders, final Resource resource) {
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
*/
private Date parseDate() {
return DateUtils.toDate(DateUtils.parseStandardDate(this, HttpHeaders.DATE));
private Instant parseDate() {
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
* caching module.
* @return {@link Date}
* @deprecated USe {@link #getRequestInstant()}
*/
@Deprecated
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;
}
/**
* Returns the time the origin response was received by the caching module.
* @return {@link Date}
* @deprecated Use {@link #getResponseInstant()}
*/
@Deprecated
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;
}
@ -253,6 +331,10 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
* @since 4.3
*/
public Date getDate() {
return DateUtils.toDate(date);
}
public Instant getInstant() {
return date;
}

View File

@ -29,7 +29,7 @@ package org.apache.hc.client5.http.impl.cache;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.nio.ByteBuffer;
import java.util.Date;
import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
@ -309,7 +309,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
final AsyncExecChain chain,
final AsyncExecCallback asyncExecCallback) {
LOG.debug("Calling the backend");
final Date requestDate = getCurrentDate();
final Instant requestDate = getCurrentDate();
final AtomicReference<AsyncExecCallback> callbackRef = new AtomicReference<>();
chainProceed(request, entityProducer, scope, chain, new AsyncExecCallback() {
@ -317,7 +317,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
public AsyncDataConsumer handleResponse(
final HttpResponse backendResponse,
final EntityDetails entityDetails) throws HttpException, IOException {
final Date responseDate = getCurrentDate();
final Instant responseDate = getCurrentDate();
backendResponse.addHeader("Via", generateViaHeader(backendResponse));
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 HttpRequest request;
private final Date requestDate;
private final Date responseDate;
private final Instant requestDate;
private final Instant responseDate;
private final AsyncExecChain.Scope scope;
private final AsyncExecCallback asyncExecCallback;
private final AtomicReference<CachingAsyncDataConsumer> cachingConsumerRef;
@ -455,8 +455,8 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
BackendResponseHandler(
final HttpHost target,
final HttpRequest request,
final Date requestDate,
final Date responseDate,
final Instant requestDate,
final Instant responseDate,
final AsyncExecChain.Scope scope,
final AsyncExecCallback asyncExecCallback) {
this.target = target;
@ -525,7 +525,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
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;
operation.setDependency(responseCache.createCacheEntry(
target,
@ -622,7 +622,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
final HttpCacheEntry entry) {
final HttpClientContext context = scope.clientContext;
recordCacheHit(target, request);
final Date now = getCurrentDate();
final Instant now = getCurrentDate();
if (suitabilityChecker.canCachedResponseBeUsed(target, request, entry, now)) {
LOG.debug("Cache hit");
try {
@ -690,7 +690,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
final AsyncExecChain chain,
final AsyncExecCallback asyncExecCallback,
final HttpCacheEntry cacheEntry) {
final Date requestDate = getCurrentDate();
final Instant requestDate = getCurrentDate();
final HttpRequest conditionalRequest = conditionalRequestBuilder.buildConditionalRequest(
BasicRequestBuilder.copy(scope.originalRequest).build(),
cacheEntry);
@ -698,7 +698,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
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;
recordCacheUpdate(scope.clientContext);
operation.setDependency(responseCache.updateCacheEntry(
@ -713,7 +713,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
@Override
public void completed(final HttpCacheEntry updatedEntry) {
if (suitabilityChecker.isConditional(request)
&& suitabilityChecker.allConditionalsMatch(request, updatedEntry, new Date())) {
&& suitabilityChecker.allConditionalsMatch(request, updatedEntry, Instant.now())) {
final SimpleHttpResponse cacheResponse = responseGenerator.generateNotModifiedResponse(updatedEntry);
triggerResponse(cacheResponse, scope, asyncExecCallback);
} 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));
final int statusCode = backendResponse.getCode();
@ -772,7 +772,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
final HttpResponse backendResponse1,
final EntityDetails entityDetails) throws HttpException, IOException {
final Date responseDate1 = getCurrentDate();
final Instant responseDate1 = getCurrentDate();
final AsyncExecCallback callback1;
if (revalidationResponseIsTooOld(backendResponse1, cacheEntry)
@ -787,7 +787,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
public AsyncDataConsumer handleResponse(
final HttpResponse backendResponse2,
final EntityDetails entityDetails1) throws HttpException, IOException {
final Date responseDate2 = getCurrentDate();
final Instant responseDate2 = getCurrentDate();
final AsyncExecCallback callback2 = evaluateResponse(backendResponse2, responseDate2);
callbackRef.set(callback2);
return callback2.handleResponse(backendResponse2, entityDetails1);
@ -920,12 +920,12 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
BasicRequestBuilder.copy(request).build(),
variants);
final Date requestDate = getCurrentDate();
final Instant requestDate = getCurrentDate();
chainProceed(conditionalRequest, entityProducer, scope, chain, new AsyncExecCallback() {
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);
operation.setDependency(responseCache.updateVariantCacheEntry(
target,
@ -989,7 +989,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
public AsyncDataConsumer handleResponse(
final HttpResponse backendResponse,
final EntityDetails entityDetails) throws HttpException, IOException {
final Date responseDate = getCurrentDate();
final Instant responseDate = getCurrentDate();
backendResponse.addHeader("Via", generateViaHeader(backendResponse));
final AsyncExecCallback callback;

View File

@ -26,7 +26,7 @@
*/
package org.apache.hc.client5.http.impl.cache;
import java.util.Date;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
@ -309,8 +309,8 @@ class BasicHttpAsyncCache implements HttpAsyncCache {
final HttpRequest request,
final HttpCacheEntry stale,
final HttpResponse originResponse,
final Date requestSent,
final Date responseReceived,
final Instant requestSent,
final Instant responseReceived,
final FutureCallback<HttpCacheEntry> callback) {
if (LOG.isDebugEnabled()) {
LOG.debug("Update cache entry: {}; {}", host, new RequestLine(request));
@ -356,8 +356,8 @@ class BasicHttpAsyncCache implements HttpAsyncCache {
final HttpRequest request,
final HttpResponse originResponse,
final Variant variant,
final Date requestSent,
final Date responseReceived,
final Instant requestSent,
final Instant responseReceived,
final FutureCallback<HttpCacheEntry> callback) {
if (LOG.isDebugEnabled()) {
LOG.debug("Update variant cache entry: {}; {} / {}", host, new RequestLine(request), variant);
@ -404,8 +404,8 @@ class BasicHttpAsyncCache implements HttpAsyncCache {
final HttpRequest request,
final HttpResponse originResponse,
final ByteArrayBuffer content,
final Date requestSent,
final Date responseReceived,
final Instant requestSent,
final Instant responseReceived,
final FutureCallback<HttpCacheEntry> callback) {
if (LOG.isDebugEnabled()) {
LOG.debug("Create cache entry: {}; {}", host, new RequestLine(request));

View File

@ -26,7 +26,7 @@
*/
package org.apache.hc.client5.http.impl.cache;
import java.util.Date;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
@ -204,8 +204,8 @@ class BasicHttpCache implements HttpCache {
final HttpRequest request,
final HttpCacheEntry stale,
final HttpResponse originResponse,
final Date requestSent,
final Date responseReceived) {
final Instant requestSent,
final Instant responseReceived) {
if (LOG.isDebugEnabled()) {
LOG.debug("Update cache entry: {}; {}", host, new RequestLine(request));
}
@ -233,8 +233,8 @@ class BasicHttpCache implements HttpCache {
final HttpRequest request,
final HttpResponse originResponse,
final Variant variant,
final Date requestSent,
final Date responseReceived) {
final Instant requestSent,
final Instant responseReceived) {
if (LOG.isDebugEnabled()) {
LOG.debug("Update variant cache entry: {}; {} / {}", host, new RequestLine(request), variant);
}
@ -263,8 +263,8 @@ class BasicHttpCache implements HttpCache {
final HttpRequest request,
final HttpResponse originResponse,
final ByteArrayBuffer content,
final Date requestSent,
final Date responseReceived) {
final Instant requestSent,
final Instant responseReceived) {
if (LOG.isDebugEnabled()) {
LOG.debug("Create cache entry: {}; {}", host, new RequestLine(request));
}

View File

@ -90,6 +90,7 @@ public final class ByteArrayCacheEntrySerializer implements HttpCacheEntrySerial
Pattern.compile("^(\\[L)?org\\.apache\\.hc\\.(.*)"),
Pattern.compile("^(?:\\[+L)?java\\.util\\..*$"),
Pattern.compile("^(?:\\[+L)?java\\.lang\\..*$"),
Pattern.compile("^(?:\\[+L)?java\\.time\\..*$"), // java 8 time
Pattern.compile("^\\[+Z$"), // boolean
Pattern.compile("^\\[+B$"), // byte
Pattern.compile("^\\[+C$"), // char

View File

@ -26,7 +26,7 @@
*/
package org.apache.hc.client5.http.impl.cache;
import java.util.Date;
import java.time.Instant;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@ -69,8 +69,8 @@ class CacheUpdateHandler {
final HttpRequest request,
final HttpResponse originResponse,
final ByteArrayBuffer content,
final Date requestSent,
final Date responseReceived) throws ResourceIOException {
final Instant requestSent,
final Instant responseReceived) throws ResourceIOException {
return new HttpCacheEntry(
requestSent,
responseReceived,
@ -86,8 +86,8 @@ class CacheUpdateHandler {
public HttpCacheEntry updateCacheEntry(
final String requestId,
final HttpCacheEntry entry,
final Date requestDate,
final Date responseDate,
final Instant requestDate,
final Instant responseDate,
final HttpResponse response) throws ResourceIOException {
Args.check(response.getCode() == HttpStatus.SC_NOT_MODIFIED,
"Response must have 304 status code");
@ -103,7 +103,7 @@ class CacheUpdateHandler {
mergedHeaders,
resource);
}
@SuppressWarnings("deprecation")
public HttpCacheEntry updateParentCacheEntry(
final String requestId,
final HttpCacheEntry existing,
@ -122,8 +122,8 @@ class CacheUpdateHandler {
final Map<String,String> variantMap = new HashMap<>(src.getVariantMap());
variantMap.put(variantKey, variantCacheKey);
return new HttpCacheEntry(
src.getRequestDate(),
src.getResponseDate(),
src.getRequestInstant(),
src.getResponseInstant(),
src.getStatus(),
src.getHeaders(),
resource,

View File

@ -26,8 +26,8 @@
*/
package org.apache.hc.client5.http.impl.cache;
import java.time.Duration;
import java.time.Instant;
import java.util.Date;
import java.util.Iterator;
import org.apache.hc.client5.http.cache.HeaderConstants;
@ -50,7 +50,8 @@ class CacheValidityPolicy {
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());
}
@ -60,7 +61,7 @@ class CacheValidityPolicy {
return TimeValue.ofSeconds(maxAge);
}
final Date dateValue = entry.getDate();
final Instant dateValue = entry.getInstant();
if (dateValue == null) {
return TimeValue.ZERO_MILLISECONDS;
}
@ -69,11 +70,11 @@ class CacheValidityPolicy {
if (expiry == null) {
return TimeValue.ZERO_MILLISECONDS;
}
final long diff = expiry.toEpochMilli() - dateValue.getTime();
return TimeValue.ofSeconds(diff / 1000);
final Duration diff = Duration.between(dateValue, expiry);
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;
}
@ -92,21 +93,22 @@ class CacheValidityPolicy {
* @return {@code true} if the response is fresh
*/
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;
}
public TimeValue getHeuristicFreshnessLifetime(final HttpCacheEntry entry,
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);
if (dateValue != null && lastModifiedValue != null) {
final long diff = dateValue.getTime() - lastModifiedValue.toEpochMilli();
if (diff < 0) {
final Duration diff = Duration.between(lastModifiedValue, dateValue);
if (diff.isNegative()) {
return TimeValue.ZERO_MILLISECONDS;
}
return TimeValue.ofSeconds((long) (coefficient * diff / 1000));
return TimeValue.ofSeconds((long) (coefficient * diff.getSeconds()));
}
return defaultLifetime;
@ -125,7 +127,7 @@ class CacheValidityPolicy {
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);
while (it.hasNext()) {
final HeaderElement elt = it.next();
@ -145,7 +147,7 @@ class CacheValidityPolicy {
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);
return mayReturnStaleIfError(request, HeaderConstants.CACHE_CONTROL, staleness)
|| mayReturnStaleIfError(entry, HeaderConstants.CACHE_CONTROL, staleness);
@ -198,15 +200,15 @@ class CacheValidityPolicy {
}
protected TimeValue getApparentAge(final HttpCacheEntry entry) {
final Date dateValue = entry.getDate();
final Instant dateValue = entry.getInstant();
if (dateValue == null) {
return MAX_AGE;
}
final long diff = entry.getResponseDate().getTime() - dateValue.getTime();
if (diff < 0L) {
final Duration diff = Duration.between(dateValue, entry.getResponseInstant());
if (diff.isNegative()) {
return TimeValue.ZERO_MILLISECONDS;
}
return TimeValue.ofSeconds(diff / 1000);
return TimeValue.ofSeconds(diff.getSeconds());
}
protected long getAgeValue(final HttpCacheEntry entry) {
@ -234,19 +236,20 @@ class CacheValidityPolicy {
}
protected TimeValue getResponseDelay(final HttpCacheEntry entry) {
final long diff = entry.getResponseDate().getTime() - entry.getRequestDate().getTime();
return TimeValue.ofSeconds(diff / 1000);
final Duration diff = Duration.between(entry.getRequestInstant(), entry.getResponseInstant());
return TimeValue.ofSeconds(diff.getSeconds());
}
protected TimeValue getCorrectedInitialAge(final HttpCacheEntry entry) {
return TimeValue.ofSeconds(getCorrectedReceivedAge(entry).toSeconds() + getResponseDelay(entry).toSeconds());
}
protected TimeValue getResidentTime(final HttpCacheEntry entry, final Date now) {
final long diff = now.getTime() - entry.getResponseDate().getTime();
return TimeValue.ofSeconds(diff / 1000);
protected TimeValue getResidentTime(final HttpCacheEntry entry, final Instant now) {
final Duration diff = Duration.between(entry.getResponseInstant(), now);
return TimeValue.ofSeconds(diff.getSeconds());
}
protected long getMaxAge(final HttpCacheEntry entry) {
// This is a header value, we leave as-is
long maxAge = -1;
@ -279,7 +282,7 @@ class CacheValidityPolicy {
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 freshness = getFreshnessLifetime(entry);
if (age.compareTo(freshness) <= 0) {

View File

@ -27,7 +27,6 @@
package org.apache.hc.client5.http.impl.cache;
import java.time.Instant;
import java.util.Date;
import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
import org.apache.hc.client5.http.cache.HeaderConstants;
@ -65,7 +64,7 @@ class CachedHttpResponseGenerator {
* @return {@link SimpleHttpResponse} constructed response
*/
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());
response.setVersion(HttpVersion.DEFAULT);

View File

@ -27,7 +27,6 @@
package org.apache.hc.client5.http.impl.cache;
import java.time.Instant;
import java.util.Date;
import java.util.Iterator;
import org.apache.hc.client5.http.cache.HeaderConstants;
@ -71,7 +70,7 @@ class CachedResponseSuitabilityChecker {
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)) {
return true;
}
@ -142,7 +141,7 @@ class CachedResponseSuitabilityChecker {
* Right now in time
* @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)) {
LOG.debug("Cache entry is not fresh enough");
return false;
@ -274,13 +273,12 @@ class CachedResponseSuitabilityChecker {
* @param now right NOW in time
* @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 hasLastModifiedValidator = hasSupportedLastModifiedValidator(request);
final boolean etagValidatorMatches = (hasEtagValidator) && etagValidatorMatches(request, entry);
final boolean lastModifiedValidatorMatches = (hasLastModifiedValidator) && lastModifiedValidatorMatches(request, entry,
DateUtils.toInstant(now));
final boolean lastModifiedValidatorMatches = (hasLastModifiedValidator) && lastModifiedValidatorMatches(request, entry, now);
if ((hasEtagValidator && hasLastModifiedValidator)
&& !(etagValidatorMatches && lastModifiedValidatorMatches)) {

View File

@ -28,7 +28,7 @@ package org.apache.hc.client5.http.impl.cache;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.time.Instant;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
@ -231,7 +231,7 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
final ExecChain.Scope scope,
final ExecChain chain) throws IOException, HttpException {
final Date requestDate = getCurrentDate();
final Instant requestDate = getCurrentDate();
LOG.debug("Calling the backend");
final ClassicHttpResponse backendResponse = chain.proceed(request, scope);
@ -253,7 +253,7 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
final HttpClientContext context = scope.clientContext;
context.setAttribute(HttpCoreContext.HTTP_REQUEST, request);
recordCacheHit(target, request);
final Date now = getCurrentDate();
final Instant now = getCurrentDate();
if (suitabilityChecker.canCachedResponseBeUsed(target, request, entry, now)) {
LOG.debug("Cache hit");
try {
@ -306,13 +306,13 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
final ExecChain.Scope scope,
final ExecChain chain,
final HttpCacheEntry cacheEntry) throws IOException, HttpException {
Date requestDate = getCurrentDate();
Instant requestDate = getCurrentDate();
final ClassicHttpRequest conditionalRequest = conditionalRequestBuilder.buildConditionalRequest(
scope.originalRequest, cacheEntry);
ClassicHttpResponse backendResponse = chain.proceed(conditionalRequest, scope);
try {
Date responseDate = getCurrentDate();
Instant responseDate = getCurrentDate();
if (revalidationResponseIsTooOld(backendResponse, cacheEntry)) {
backendResponse.close();
@ -334,7 +334,7 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
final HttpCacheEntry updatedEntry = responseCache.updateCacheEntry(
target, request, cacheEntry, backendResponse, requestDate, responseDate);
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.generateResponse(request, updatedEntry), scope);
@ -362,8 +362,8 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
final HttpHost target,
final ClassicHttpRequest request,
final ExecChain.Scope scope,
final Date requestDate,
final Date responseDate,
final Instant requestDate,
final Instant responseDate,
final ClassicHttpResponse backendResponse) throws IOException {
responseCompliance.ensureProtocolCompliance(scope.originalRequest, request, backendResponse);
@ -384,8 +384,8 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
final HttpRequest request,
final ClassicHttpResponse backendResponse,
final ExecChain.Scope scope,
final Date requestSent,
final Date responseReceived) throws IOException {
final Instant requestSent,
final Instant responseReceived) throws IOException {
LOG.debug("Caching backend response");
final ByteArrayBuffer buf;
final HttpEntity entity = backendResponse.getEntity();
@ -453,10 +453,10 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
final Map<String, Variant> variants) throws IOException, HttpException {
final ClassicHttpRequest conditionalRequest = conditionalRequestBuilder.buildConditionalRequestFromVariants(request, variants);
final Date requestDate = getCurrentDate();
final Instant requestDate = getCurrentDate();
final ClassicHttpResponse backendResponse = chain.proceed(conditionalRequest, scope);
try {
final Date responseDate = getCurrentDate();
final Instant responseDate = getCurrentDate();
backendResponse.addHeader("Via", generateViaHeader(backendResponse));

View File

@ -27,7 +27,7 @@
package org.apache.hc.client5.http.impl.cache;
import java.io.IOException;
import java.util.Date;
import java.time.Instant;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@ -183,7 +183,7 @@ public class CachingExecBase {
final HttpRequest request,
final HttpContext context,
final HttpCacheEntry entry,
final Date now) throws ResourceIOException {
final Instant now) throws ResourceIOException {
final SimpleHttpResponse cachedResponse;
if (request.containsHeader(HeaderConstants.IF_NONE_MATCH)
|| request.containsHeader(HeaderConstants.IF_MODIFIED_SINCE)) {
@ -202,7 +202,7 @@ public class CachingExecBase {
final HttpRequest request,
final HttpContext context,
final HttpCacheEntry entry,
final Date now) throws IOException {
final Instant now) throws IOException {
if (staleResponseNotAllowed(request, entry, now)) {
return generateGatewayTimeout(context);
} else {
@ -226,7 +226,7 @@ public class CachingExecBase {
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)
|| (cacheConfig.isSharedCache() && validityPolicy.proxyRevalidate(entry))
|| explicitFreshnessRequest(request, entry, now);
@ -244,7 +244,7 @@ public class CachingExecBase {
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);
while (it.hasNext()) {
final HeaderElement elt = it.next();
@ -313,8 +313,8 @@ public class CachingExecBase {
return SUPPORTS_RANGE_AND_CONTENT_RANGE_HEADERS;
}
Date getCurrentDate() {
return new Date();
Instant getCurrentDate() {
return Instant.now();
}
boolean clientRequestsOurOptions(final HttpRequest request) {
@ -340,7 +340,7 @@ public class CachingExecBase {
boolean shouldSendNotModifiedResponse(final HttpRequest request, final HttpCacheEntry responseEntry) {
return (suitabilityChecker.isConditional(request)
&& suitabilityChecker.allConditionalsMatch(request, responseEntry, new Date()));
&& suitabilityChecker.allConditionalsMatch(request, responseEntry, Instant.now()));
}
boolean staleIfErrorAppliesTo(final int statusCode) {

View File

@ -26,7 +26,7 @@
*/
package org.apache.hc.client5.http.impl.cache;
import java.util.Date;
import java.time.Instant;
import java.util.Map;
import org.apache.hc.client5.http.cache.HttpCacheEntry;
@ -79,8 +79,8 @@ interface HttpAsyncCache {
HttpRequest request,
HttpResponse originResponse,
ByteArrayBuffer content,
Date requestSent,
Date responseReceived,
Instant requestSent,
Instant responseReceived,
FutureCallback<HttpCacheEntry> callback);
/**
@ -91,8 +91,8 @@ interface HttpAsyncCache {
HttpRequest request,
HttpCacheEntry stale,
HttpResponse originResponse,
Date requestSent,
Date responseReceived,
Instant requestSent,
Instant responseReceived,
FutureCallback<HttpCacheEntry> callback);
/**
@ -104,8 +104,8 @@ interface HttpAsyncCache {
HttpRequest request,
HttpResponse originResponse,
Variant variant,
Date requestSent,
Date responseReceived,
Instant requestSent,
Instant responseReceived,
FutureCallback<HttpCacheEntry> callback);
/**

View File

@ -32,7 +32,7 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
@ -150,8 +150,8 @@ public class HttpByteArrayCacheEntrySerializer implements HttpCacheEntrySerializ
// Extract metadata pseudo-headers
final String storageKey = getCachePseudoHeaderAndRemove(response, SC_HEADER_NAME_STORAGE_KEY);
final Date requestDate = getCachePseudoHeaderDateAndRemove(response, SC_HEADER_NAME_REQUEST_DATE);
final Date responseDate = getCachePseudoHeaderDateAndRemove(response, SC_HEADER_NAME_RESPONSE_DATE);
final Instant requestDate = getCachePseudoHeaderDateAndRemove(response, SC_HEADER_NAME_REQUEST_DATE);
final Instant responseDate = getCachePseudoHeaderDateAndRemove(response, SC_HEADER_NAME_RESPONSE_DATE);
final boolean noBody = getCachePseudoHeaderBooleanAndRemove(response, SC_HEADER_NAME_NO_CONTENT);
final Map<String, String> variantMap = getVariantMapPseudoHeadersAndRemove(response);
unescapeHeaders(response);
@ -255,8 +255,8 @@ public class HttpByteArrayCacheEntrySerializer implements HttpCacheEntrySerializ
*/
private void addMetadataPseudoHeaders(final HttpResponse httpResponse, final HttpCacheStorageEntry httpCacheEntry) {
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_REQUEST_DATE, Long.toString(httpCacheEntry.getContent().getRequestDate().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().getRequestInstant().toEpochMilli()));
// 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}
@ -308,12 +308,12 @@ public class HttpByteArrayCacheEntrySerializer implements HttpCacheEntrySerializ
* @return Value for metadata pseudo-header
* @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);
response.removeHeaders(name);
try {
final long timestamp = Long.parseLong(value);
return new Date(timestamp);
return Instant.ofEpochMilli(timestamp);
} catch (final NumberFormatException 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 {
@Override
public TimeValue getCurrentAge(final HttpCacheEntry entry, final Date now) {
public TimeValue getCurrentAge(final HttpCacheEntry entry, final Instant now) {
return TimeValue.ZERO_MILLISECONDS;
}
}

View File

@ -26,7 +26,7 @@
*/
package org.apache.hc.client5.http.impl.cache;
import java.util.Date;
import java.time.Instant;
import java.util.Map;
import org.apache.hc.client5.http.cache.HttpCacheEntry;
@ -73,8 +73,8 @@ interface HttpCache {
HttpRequest request,
HttpResponse originResponse,
ByteArrayBuffer content,
Date requestSent,
Date responseReceived);
Instant requestSent,
Instant responseReceived);
/**
* Update a {@link HttpCacheEntry} using a 304 {@link HttpResponse}.
@ -84,8 +84,8 @@ interface HttpCache {
HttpRequest request,
HttpCacheEntry stale,
HttpResponse originResponse,
Date requestSent,
Date responseReceived);
Instant requestSent,
Instant responseReceived);
/**
* Update a specific {@link HttpCacheEntry} representing a cached variant
@ -96,8 +96,8 @@ interface HttpCache {
HttpRequest request,
HttpResponse originResponse,
Variant variant,
Date requestSent,
Date responseReceived);
Instant requestSent,
Instant responseReceived);
/**
* Specifies cache should reuse the given cached variant to satisfy

View File

@ -29,7 +29,6 @@ package org.apache.hc.client5.http.impl.cache;
import java.io.IOException;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.hc.client5.http.ClientProtocolException;
@ -101,8 +100,8 @@ class ResponseProtocolCompliance {
boolean modified = false;
for(final Header h : warningHeaders) {
for(final WarningValue wv : WarningValue.getWarningValues(h)) {
final Date warnDate = wv.getWarnDate();
if (warnDate == null || warnDate.equals(responseDate)) {
final Instant warnInstant = wv.getWarnDate();
if (warnInstant == null || warnInstant.equals(responseDate)) {
newWarningHeaders.add(new BasicHeader(HeaderConstants.WARNING,wv.toString()));
} else {
modified = true;

View File

@ -26,8 +26,8 @@
*/
package org.apache.hc.client5.http.impl.cache;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -48,7 +48,7 @@ class WarningValue {
private int warnCode;
private String warnAgent;
private String warnText;
private Date warnDate;
private Instant warnDate;
WarningValue(final String s) {
this(s, 0);
@ -265,7 +265,7 @@ class WarningValue {
parseError();
}
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
* {@code null} if a warning date was not supplied in the
* 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}
* suitable for including in a header. For example, you can:
@ -359,7 +359,7 @@ class WarningValue {
public String toString() {
if (warnDate != null) {
return String.format("%d %s %s \"%s\"", warnCode,
warnAgent, warnText, DateUtils.formatStandardDate(DateUtils.toInstant(warnDate)));
warnAgent, warnText, DateUtils.formatStandardDate(warnDate));
} else {
return String.format("%d %s %s", warnCode, warnAgent, warnText);
}

View File

@ -27,7 +27,6 @@
package org.apache.hc.client5.http.cache;
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.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
@ -66,7 +65,7 @@ public class TestHttpCacheEntry {
}
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);
}
@ -110,13 +109,6 @@ public class TestHttpCacheEntry {
assertNull(entry.getFirstHeader("quux"));
}
@Test
public void testCacheEntryWithNoVaryHeaderDoesNotHaveVariants() {
final Header[] headers = new Header[0];
entry = makeEntry(headers);
assertFalse(entry.hasVariants());
}
@Test
public void testCacheEntryWithOneVaryHeaderHasVariants() {
final Header[] headers = { new BasicHeader("Vary", "User-Agent") };
@ -140,11 +132,24 @@ public class TestHttpCacheEntry {
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")
@Test
public void mustProvideRequestDate() {
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");
} catch (final NullPointerException expected) {
}
@ -154,7 +159,7 @@ public class TestHttpCacheEntry {
@Test
public void mustProvideResponseDate() {
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");
} catch (final NullPointerException expected) {
}
@ -164,7 +169,7 @@ public class TestHttpCacheEntry {
@Test
public void mustProvideResponseHeaders() {
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");
} catch (final NullPointerException expected) {
}
@ -172,27 +177,27 @@ public class TestHttpCacheEntry {
@Test
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());
}
@Test
public void canGetOriginalRequestDate() {
final Date requestDate = new Date();
entry = new HttpCacheEntry(requestDate, new Date(), HttpStatus.SC_OK, new Header[]{}, mockResource);
assertSame(requestDate, entry.getRequestDate());
final Instant requestDate = Instant.now();
entry = new HttpCacheEntry(requestDate, Instant.now(), HttpStatus.SC_OK, new Header[]{}, mockResource);
assertEquals(requestDate, entry.getRequestInstant());
}
@Test
public void canGetOriginalResponseDate() {
final Date responseDate = new Date();
entry = new HttpCacheEntry(new Date(), responseDate, HttpStatus.SC_OK, new Header[]{}, mockResource);
assertSame(responseDate, entry.getResponseDate());
final Instant responseDate = Instant.now();
entry = new HttpCacheEntry(Instant.now(), responseDate, HttpStatus.SC_OK, new Header[]{}, mockResource);
assertEquals(responseDate, entry.getResponseInstant());
}
@Test
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());
}
@ -202,7 +207,7 @@ public class TestHttpCacheEntry {
new BasicHeader("Server", "MockServer/1.0"),
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();
assertEquals(headers.length, result.length);
for(int i=0; i<headers.length; i++) {
@ -213,13 +218,13 @@ public class TestHttpCacheEntry {
@SuppressWarnings("unused")
@Test
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")
@Test
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 HashMap<>());
}
@ -229,7 +234,7 @@ public class TestHttpCacheEntry {
final Map<String,String> variantMap = new HashMap<>();
variantMap.put("A","B");
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,
variantMap);
final Map<String,String> result = entry.getVariantMap();
@ -243,7 +248,7 @@ public class TestHttpCacheEntry {
final Map<String,String> variantMap = new HashMap<>();
variantMap.put("A","B");
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,
variantMap);
final Map<String,String> result = entry.getVariantMap();
@ -261,7 +266,7 @@ public class TestHttpCacheEntry {
@Test
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);
assertNotNull(entry.toString());
assertNotEquals("", entry.toString());
@ -270,16 +275,16 @@ public class TestHttpCacheEntry {
@Test
public void testMissingDateHeaderIsIgnored() {
final Header[] headers = new Header[] {};
entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
headers, mockResource);
entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
headers, mockResource);
assertNull(entry.getDate());
}
@Test
public void testMalformedDateHeaderIsIgnored() {
final Header[] headers = new Header[] { new BasicHeader("Date", "asdf") };
entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
headers, mockResource);
entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
headers, mockResource);
assertNull(entry.getDate());
}
@ -287,20 +292,11 @@ public class TestHttpCacheEntry {
public void testValidDateHeaderIsParsed() {
final Instant date = Instant.now().with(ChronoField.MILLI_OF_SECOND, 0);
final Header[] headers = new Header[] { new BasicHeader("Date", DateUtils.formatStandardDate(date)) };
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 Date dateHeaderValue = entry.getDate();
assertNotNull(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());
}
}

View File

@ -34,8 +34,8 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.util.Collections;
import java.util.Date;
import java.util.Map;
import org.apache.hc.client5.http.cache.HttpCacheEntry;
@ -59,8 +59,8 @@ class HttpByteArrayCacheEntrySerializerTestUtils {
*/
static class HttpCacheStorageEntryTestTemplate {
Resource resource;
Date requestDate;
Date responseDate;
Instant requestDate;
Instant responseDate;
int responseCode;
Header[] responseHeaders;
Map<String, String> variantMap;
@ -120,8 +120,8 @@ class HttpByteArrayCacheEntrySerializerTestUtils {
private static final HttpCacheStorageEntryTestTemplate DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE = new HttpCacheStorageEntryTestTemplate();
static {
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.responseDate = new Date(2611108800000L);
DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.requestDate = Instant.ofEpochMilli(165214800000L);
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.responseHeaders = new Header[]{
new BasicHeader("Content-type", "text/html"),
@ -220,8 +220,9 @@ class HttpByteArrayCacheEntrySerializerTestUtils {
final HttpCacheEntry expectedContent = expected.getContent();
final HttpCacheEntry actualContent = actual.getContent();
assertEquals(expectedContent.getRequestDate(), actualContent.getRequestDate());
assertEquals(expectedContent.getResponseDate(), actualContent.getResponseDate());
assertEquals(expectedContent.getRequestInstant(), actualContent.getRequestInstant());
assertEquals(expectedContent.getResponseInstant(), actualContent.getResponseInstant());
assertEquals(expectedContent.getStatus(), actualContent.getStatus());
assertArrayEquals(expectedContent.getVariantMap().keySet().toArray(), actualContent.getVariantMap().keySet().toArray());

View File

@ -26,8 +26,8 @@
*/
package org.apache.hc.client5.http.impl.cache;
import java.time.Instant;
import java.util.Arrays;
import java.util.Date;
import org.apache.hc.client5.http.cache.HttpCacheEntry;
import org.apache.hc.client5.http.cache.Resource;
@ -57,16 +57,17 @@ public class HttpCacheEntryMatcher extends BaseMatcher<HttpCacheEntry> {
if (expectedStatus != otherStatus) {
return false;
}
final Date expectedRequestDate = expectedValue.getRequestDate();
final Date otherRequestDate = otherValue.getRequestDate();
if (!LangUtils.equals(expectedRequestDate, otherRequestDate)) {
final Instant expectedRequestInstant = expectedValue.getRequestInstant();
final Instant otherRequestInstant = otherValue.getRequestInstant();
if (!LangUtils.equals(expectedRequestInstant, otherRequestInstant)) {
return false;
}
final Date expectedResponseDate = expectedValue.getResponseDate();
final Date otherResponseDate = otherValue.getResponseDate();
if (!LangUtils.equals(expectedResponseDate, otherResponseDate)) {
final Instant expectedResponseInstant = expectedValue.getResponseInstant();
final Instant otherResponseInstant = otherValue.getResponseInstant();
if (!LangUtils.equals(expectedResponseInstant, otherResponseInstant)) {
return false;
}
final Header[] expectedHeaders = expectedValue.getHeaders();
final Header[] otherHeaders = otherValue.getHeaders();
if (expectedHeaders.length != otherHeaders.length) {

View File

@ -29,7 +29,6 @@ package org.apache.hc.client5.http.impl.cache;
import java.io.InputStream;
import java.time.Duration;
import java.time.Instant;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@ -268,7 +267,7 @@ public class HttpTestUtils {
return makeCacheEntry(now, now, getStockHeaders(now),
getRandomBytes(128), variantMap);
}
@SuppressWarnings("deprecation")
public static HttpCacheEntry makeCacheEntry(final Instant requestDate,
final Instant responseDate, final Header[] headers, final byte[] bytes,
final Map<String,String> variantMap) {
@ -295,31 +294,6 @@ public class HttpTestUtils {
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() {
final ClassicHttpResponse out = new BasicClassicHttpResponse(HttpStatus.SC_OK, "OK");
out.setHeader("Date", DateUtils.formatStandardDate(Instant.now()));
@ -373,4 +347,30 @@ public class HttpTestUtils {
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);
}
}

View File

@ -34,7 +34,6 @@ import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import java.time.Instant;
import java.util.Date;
import java.util.Map;
import org.apache.hc.client5.http.cache.HeaderConstants;
@ -231,7 +230,7 @@ public class TestBasicHttpCache {
origResponse.setHeader("Vary", "Accept-Encoding");
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 HttpCacheEntry result = impl.getCacheEntry(host, request);
@ -253,7 +252,7 @@ public class TestBasicHttpCache {
origResponse.setHeader("Vary", "Accept-Encoding");
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");
request.setHeader("Accept-Encoding","gzip");
@ -297,8 +296,8 @@ public class TestBasicHttpCache {
resp2.setHeader("Content-Encoding","gzip");
resp2.setHeader("Vary", "Accept-Encoding");
impl.createCacheEntry(host, req1, resp1, null, new Date(), new Date());
impl.createCacheEntry(host, req2, resp2, null, new Date(), new Date());
impl.createCacheEntry(host, req1, resp1, null, Instant.now(), Instant.now());
impl.createCacheEntry(host, req2, resp2, null, Instant.now(), Instant.now());
final Map<String,Variant> variants = impl.getVariantCacheEntriesWithEtags(host, req1);

View File

@ -37,6 +37,7 @@ import java.io.IOException;
import java.io.ObjectOutputStream;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@ -61,7 +62,12 @@ public class TestByteArrayCacheEntrySerializer {
}
@Test
public void canSerializeEntriesWithVariantMaps() throws Exception {
public void canSerializeEntriesWithVariantMapsDeprecatedConstructor() throws Exception {
readWriteVerify(makeCacheEntryDeprecatedConstructorWithVariantMap("somekey"));
}
@Test
public void canSerializeEntriesWithVariantMapsAndInstant() throws Exception {
readWriteVerify(makeCacheEntryWithVariantMap("somekey"));
}
@ -85,6 +91,11 @@ public class TestByteArrayCacheEntrySerializer {
assertIsAllowedClassNameTrue(Date.class.getName());
}
@Test
public void isAllowedClassNameInstantTrue() {
assertIsAllowedClassNameTrue(Instant.class.getName());
}
@Test
public void isAllowedClassNameStatusLineTrue() {
assertIsAllowedClassNameTrue(StatusLine.class.getName());
@ -257,6 +268,27 @@ public class TestByteArrayCacheEntrySerializer {
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) {
final Header[] headers = new Header[5];
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 2","true");
final HttpCacheEntry cacheEntry = new HttpCacheEntry(
new Date(),
new Date(),
Instant.now(),
Instant.now(),
HttpStatus.SC_OK,
headers,
new HeapResource(body.getBytes(StandardCharsets.UTF_8)), variantMap);

View File

@ -34,7 +34,6 @@ import static org.junit.jupiter.api.Assertions.fail;
import java.io.IOException;
import java.time.Instant;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@ -83,7 +82,7 @@ public class TestCacheUpdateHandler {
throws IOException {
entry = HttpTestUtils.makeCacheEntry();
final HttpCacheEntry newEntry = impl.updateCacheEntry(null, entry,
DateUtils.toDate(requestDate), DateUtils.toDate(responseDate), response);
requestDate, responseDate, response);
assertNotSame(newEntry, entry);
}
@ -96,7 +95,7 @@ public class TestCacheUpdateHandler {
response.setHeaders();
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("ETag", "\"etag\""));
@ -116,7 +115,7 @@ public class TestCacheUpdateHandler {
new BasicHeader("Cache-Control", "public"));
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("ETag", "\"etag\""));
@ -136,7 +135,7 @@ public class TestCacheUpdateHandler {
new BasicHeader("Cache-Control", "public"));
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("ETag", "\"etag\""));
@ -154,8 +153,8 @@ public class TestCacheUpdateHandler {
entry = HttpTestUtils.makeCacheEntry(twoSecondsAgo, now, headers);
response.setHeader("Date", DateUtils.formatStandardDate(tenSecondsAgo));
response.setHeader("ETag", "\"old-etag\"");
final HttpCacheEntry result = impl.updateCacheEntry("A", entry, new Date(),
new Date(), response);
final HttpCacheEntry result = impl.updateCacheEntry("A", entry, Instant.now(),
Instant.now(), response);
assertThat(result, ContainsHeaderMatcher.contains("Date", DateUtils.formatStandardDate(oneSecondAgo)));
assertThat(result, ContainsHeaderMatcher.contains("ETag", "\"new-etag\""));
}
@ -165,10 +164,10 @@ public class TestCacheUpdateHandler {
throws IOException {
entry = HttpTestUtils.makeCacheEntry(tenSecondsAgo, eightSecondsAgo);
final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
DateUtils.toDate(twoSecondsAgo), DateUtils.toDate(oneSecondAgo), response);
twoSecondsAgo, oneSecondAgo, response);
assertEquals(DateUtils.toDate(twoSecondsAgo), updated.getRequestDate());
assertEquals(DateUtils.toDate(oneSecondAgo), updated.getResponseDate());
assertEquals(twoSecondsAgo, updated.getRequestInstant());
assertEquals(oneSecondAgo, updated.getResponseInstant());
}
@Test
@ -182,7 +181,7 @@ public class TestCacheUpdateHandler {
response.setHeader("ETag", "\"new\"");
response.setHeader("Date", DateUtils.formatStandardDate(twoSecondsAgo));
final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
DateUtils.toDate(twoSecondsAgo), DateUtils.toDate(oneSecondAgo), response);
twoSecondsAgo, oneSecondAgo, response);
assertEquals(0, updated.getHeaders("Warning").length);
}
@ -197,7 +196,7 @@ public class TestCacheUpdateHandler {
response.setHeader("ETag", "\"new\"");
response.setHeader("Date", DateUtils.formatStandardDate(twoSecondsAgo));
final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
DateUtils.toDate(twoSecondsAgo), DateUtils.toDate(oneSecondAgo), response);
twoSecondsAgo, oneSecondAgo, response);
assertEquals("\"new\"", updated.getFirstHeader("ETag").getValue());
}
@ -211,8 +210,8 @@ public class TestCacheUpdateHandler {
entry = HttpTestUtils.makeCacheEntry(tenSecondsAgo, eightSecondsAgo, headers);
response.setHeader("ETag", "\"new\"");
response.setHeader("Date", "bad-date");
final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
DateUtils.toDate(twoSecondsAgo), DateUtils.toDate(oneSecondAgo), response);
final HttpCacheEntry updated = impl.updateCacheEntry(null, entry, twoSecondsAgo,
oneSecondAgo, response);
assertEquals("\"new\"", updated.getFirstHeader("ETag").getValue());
}
@ -222,7 +221,7 @@ public class TestCacheUpdateHandler {
entry = HttpTestUtils.makeCacheEntry();
response = new BasicHttpResponse(HttpStatus.SC_OK, "OK");
try {
impl.updateCacheEntry("A", entry, new Date(), new Date(),
impl.updateCacheEntry("A", entry, Instant.now(), Instant.now(),
response);
fail("should have thrown exception");
} catch (final IllegalArgumentException expected) {
@ -261,7 +260,7 @@ public class TestCacheUpdateHandler {
new BasicHeader("Content-Encoding", "gzip"));
final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
new Date(), new Date(), response);
Instant.now(), Instant.now(), response);
final Header[] updatedHeaders = updatedEntry.getHeaders();
headersContain(updatedHeaders, "Content-Encoding", "identity");
@ -281,7 +280,7 @@ public class TestCacheUpdateHandler {
new BasicHeader("Content-Length", "0"));
final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
new Date(), new Date(), response);
Instant.now(), Instant.now(), response);
final Header[] updatedHeaders = updatedEntry.getHeaders();
headersContain(updatedHeaders, "Transfer-Encoding", "chunked");

View File

@ -33,7 +33,6 @@ import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.time.Instant;
import java.util.Date;
import org.apache.hc.client5.http.cache.HttpCacheEntry;
import org.apache.hc.client5.http.utils.DateUtils;
@ -141,7 +140,7 @@ public class TestCacheValidityPolicy {
@Test
public void testResidentTimeSecondsIsTimeSinceResponseTime() {
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
@ -153,11 +152,11 @@ public class TestCacheValidityPolicy {
return TimeValue.ofSeconds(11);
}
@Override
protected TimeValue getResidentTime(final HttpCacheEntry ent, final Date d) {
protected TimeValue getResidentTime(final HttpCacheEntry ent, final Instant d) {
return TimeValue.ofSeconds(17);
}
};
assertEquals(TimeValue.ofSeconds(28), impl.getCurrentAge(entry, new Date()));
assertEquals(TimeValue.ofSeconds(28), impl.getCurrentAge(entry, Instant.now()));
}
@Test
@ -250,9 +249,9 @@ public class TestCacheValidityPolicy {
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry();
impl = new CacheValidityPolicy() {
@Override
public TimeValue getCurrentAge(final HttpCacheEntry e, final Date d) {
public TimeValue getCurrentAge(final HttpCacheEntry e, final Instant d) {
assertSame(entry, e);
assertEquals(DateUtils.toDate(now), d);
assertEquals(now, d);
return TimeValue.ofSeconds(6);
}
@Override
@ -261,7 +260,7 @@ public class TestCacheValidityPolicy {
return TimeValue.ofSeconds(10);
}
};
assertTrue(impl.isResponseFresh(entry, DateUtils.toDate(now)));
assertTrue(impl.isResponseFresh(entry, now));
}
@Test
@ -269,8 +268,8 @@ public class TestCacheValidityPolicy {
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry();
impl = new CacheValidityPolicy() {
@Override
public TimeValue getCurrentAge(final HttpCacheEntry e, final Date d) {
assertEquals(DateUtils.toDate(now), d);
public TimeValue getCurrentAge(final HttpCacheEntry e, final Instant d) {
assertEquals(now, d);
assertSame(entry, e);
return TimeValue.ofSeconds(6);
}
@ -280,7 +279,7 @@ public class TestCacheValidityPolicy {
return TimeValue.ofSeconds(6);
}
};
assertFalse(impl.isResponseFresh(entry, DateUtils.toDate(now)));
assertFalse(impl.isResponseFresh(entry, now));
}
@Test
@ -288,8 +287,8 @@ public class TestCacheValidityPolicy {
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry();
impl = new CacheValidityPolicy() {
@Override
public TimeValue getCurrentAge(final HttpCacheEntry e, final Date d) {
assertEquals(DateUtils.toDate(now), d);
public TimeValue getCurrentAge(final HttpCacheEntry e, final Instant d) {
assertEquals(now, d);
assertSame(entry, e);
return TimeValue.ofSeconds(10);
}
@ -299,7 +298,7 @@ public class TestCacheValidityPolicy {
return TimeValue.ofSeconds(6);
}
};
assertFalse(impl.isResponseFresh(entry, DateUtils.toDate(now)));
assertFalse(impl.isResponseFresh(entry, now));
}
@Test
@ -421,7 +420,7 @@ public class TestCacheValidityPolicy {
};
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
final HttpRequest req = new BasicHttpRequest("GET","/");
assertTrue(impl.mayReturnStaleIfError(req, entry, DateUtils.toDate(now)));
assertTrue(impl.mayReturnStaleIfError(req, entry, now));
}
@Test
@ -433,7 +432,7 @@ public class TestCacheValidityPolicy {
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
final HttpRequest req = new BasicHttpRequest("GET","/");
req.setHeader("Cache-Control","stale-if-error=15");
assertTrue(impl.mayReturnStaleIfError(req, entry, DateUtils.toDate(now)));
assertTrue(impl.mayReturnStaleIfError(req, entry, now));
}
@Test
@ -444,7 +443,7 @@ public class TestCacheValidityPolicy {
};
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
final HttpRequest req = new BasicHttpRequest("GET","/");
assertFalse(impl.mayReturnStaleIfError(req, entry, DateUtils.toDate(now)));
assertFalse(impl.mayReturnStaleIfError(req, entry, now));
}
@Test
@ -456,7 +455,7 @@ public class TestCacheValidityPolicy {
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
final HttpRequest req = new BasicHttpRequest("GET","/");
req.setHeader("Cache-Control","stale-if-error=1");
assertFalse(impl.mayReturnStaleIfError(req, entry, DateUtils.toDate(now)));
assertFalse(impl.mayReturnStaleIfError(req, entry, now));
}
@Test
@ -464,7 +463,7 @@ public class TestCacheValidityPolicy {
final Header[] headers = new Header[] { new BasicHeader("Cache-control", "public") };
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(headers);
assertFalse(impl.mayReturnStaleWhileRevalidating(entry, DateUtils.toDate(now)));
assertFalse(impl.mayReturnStaleWhileRevalidating(entry, now));
}
@Test
@ -475,7 +474,7 @@ public class TestCacheValidityPolicy {
};
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
assertTrue(impl.mayReturnStaleWhileRevalidating(entry, DateUtils.toDate(now)));
assertTrue(impl.mayReturnStaleWhileRevalidating(entry, now));
}
@Test
@ -487,7 +486,7 @@ public class TestCacheValidityPolicy {
};
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
assertFalse(impl.mayReturnStaleWhileRevalidating(entry, DateUtils.toDate(now)));
assertFalse(impl.mayReturnStaleWhileRevalidating(entry, now));
}
@Test
@ -498,6 +497,6 @@ public class TestCacheValidityPolicy {
};
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
assertFalse(impl.mayReturnStaleWhileRevalidating(entry, DateUtils.toDate(now)));
assertFalse(impl.mayReturnStaleWhileRevalidating(entry, now));
}
}

View File

@ -32,7 +32,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Date;
import java.time.Instant;
import java.util.HashMap;
import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
@ -112,7 +112,7 @@ public class TestCachedHttpResponseGenerator {
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");
Assertions.assertNotNull(ageHdr);
@ -125,7 +125,7 @@ public class TestCachedHttpResponseGenerator {
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");
Assertions.assertNull(ageHdr);
@ -137,7 +137,7 @@ public class TestCachedHttpResponseGenerator {
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");
Assertions.assertNotNull(ageHdr);
@ -147,7 +147,7 @@ public class TestCachedHttpResponseGenerator {
private void currentAge(final TimeValue age) {
when(
mockValidityPolicy.getCurrentAge(same(entry),
isA(Date.class))).thenReturn(age);
isA(Instant.class))).thenReturn(age);
}
@Test

View File

@ -78,7 +78,7 @@ public class TestCachedResponseSuitabilityChecker {
new BasicHeader("Content-Length","1")
};
entry = getEntry(headers);
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -89,7 +89,7 @@ public class TestCachedResponseSuitabilityChecker {
new BasicHeader("Content-Length","128")
};
entry = getEntry(headers);
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -100,7 +100,7 @@ public class TestCachedResponseSuitabilityChecker {
new BasicHeader("Content-Length","128")
};
entry = getEntry(headers);
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -112,7 +112,7 @@ public class TestCachedResponseSuitabilityChecker {
new BasicHeader("Content-Length","128")
};
entry = getEntry(headers);
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -124,7 +124,7 @@ public class TestCachedResponseSuitabilityChecker {
new BasicHeader("Content-Length","128")
};
entry = getEntry(headers);
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -136,7 +136,7 @@ public class TestCachedResponseSuitabilityChecker {
new BasicHeader("Content-Length","128")
};
entry = getEntry(headers);
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -148,7 +148,7 @@ public class TestCachedResponseSuitabilityChecker {
new BasicHeader("Content-Length","128")
};
entry = getEntry(headers);
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -160,7 +160,7 @@ public class TestCachedResponseSuitabilityChecker {
new BasicHeader("Content-Length","128")
};
entry = getEntry(headers);
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -172,7 +172,7 @@ public class TestCachedResponseSuitabilityChecker {
new BasicHeader("Content-Length","128")
};
entry = getEntry(headers);
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -184,7 +184,7 @@ public class TestCachedResponseSuitabilityChecker {
new BasicHeader("Content-Length","128")
};
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")
};
entry = getEntry(headers);
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -209,7 +209,7 @@ public class TestCachedResponseSuitabilityChecker {
new BasicHeader("Content-Length","128")
};
entry = getEntry(headers);
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -230,7 +230,7 @@ public class TestCachedResponseSuitabilityChecker {
.setHeuristicCoefficient(0.1f).build();
impl = new CachedResponseSuitabilityChecker(config);
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -248,7 +248,7 @@ public class TestCachedResponseSuitabilityChecker {
.build();
impl = new CachedResponseSuitabilityChecker(config);
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -261,7 +261,7 @@ public class TestCachedResponseSuitabilityChecker {
};
entry = getEntry(headers);
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, headRequest, entry, DateUtils.toDate(now)));
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, headRequest, entry, now));
}
@Test
@ -273,7 +273,7 @@ public class TestCachedResponseSuitabilityChecker {
};
entry = HttpTestUtils.makeHeadCacheEntry(headers);
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -286,7 +286,7 @@ public class TestCachedResponseSuitabilityChecker {
};
entry = HttpTestUtils.makeCacheEntryWithNoRequestMethodOrEntity(headers);
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -299,7 +299,7 @@ public class TestCachedResponseSuitabilityChecker {
};
entry = HttpTestUtils.makeCacheEntryWithNoRequestMethod(headers);
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -311,7 +311,7 @@ public class TestCachedResponseSuitabilityChecker {
};
entry = HttpTestUtils.make204CacheEntryWithNoRequestMethod(headers);
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
}
@Test
@ -325,6 +325,6 @@ public class TestCachedResponseSuitabilityChecker {
};
entry = HttpTestUtils.makeHeadCacheEntryWithNoRequestMethod(headers);
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, headRequest, entry, DateUtils.toDate(now)));
Assertions.assertTrue(impl.canCachedResponseBeUsed(host, headRequest, entry, now));
}
}

View File

@ -1009,8 +1009,7 @@ public class TestCachingExecChain {
originResponse.setHeader("ETag", "\"etag\"");
final ExecChain.Scope scope = new ExecChain.Scope("test", route, request, mockExecRuntime, context);
impl.cacheAndReturnResponse(host, request, originResponse, scope,
DateUtils.toDate(requestSent), DateUtils.toDate(responseReceived));
impl.cacheAndReturnResponse(host, request, originResponse, scope, requestSent, responseReceived);
Mockito.verify(cache, Mockito.never()).createCacheEntry(
Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any());
@ -1043,12 +1042,11 @@ public class TestCachingExecChain {
RequestEquivalent.eq(request),
ResponseEquivalent.eq(response),
Mockito.any(),
Mockito.eq(DateUtils.toDate(requestSent)),
Mockito.eq(DateUtils.toDate(responseReceived)))).thenReturn(httpCacheEntry);
Mockito.eq(requestSent),
Mockito.eq(responseReceived))).thenReturn(httpCacheEntry);
final ExecChain.Scope scope = new ExecChain.Scope("test", route, request, mockExecRuntime, context);
impl.cacheAndReturnResponse(host, request, originResponse, scope,
DateUtils.toDate(requestSent), DateUtils.toDate(responseReceived));
impl.cacheAndReturnResponse(host, request, originResponse, scope, requestSent, responseReceived);
Mockito.verify(mockCache).createCacheEntry(
Mockito.any(),

View File

@ -82,6 +82,98 @@ public class TestHttpByteArrayCacheEntrySerializer {
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.
*
@ -194,10 +286,9 @@ public class TestHttpByteArrayCacheEntrySerializer {
/**
* Attempt to store a cache entry with a null storage key.
*
* @throws Exception is expected
*/
@Test
public void testNullStorageKey() throws Exception {
public void testNullStorageKey() {
final HttpCacheStorageEntryTestTemplate cacheObjectValues = HttpCacheStorageEntryTestTemplate.makeDefault();
cacheObjectValues.storageKey = null;
@ -291,71 +382,6 @@ public class TestHttpByteArrayCacheEntrySerializer {
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.
*
@ -382,26 +408,5 @@ public class TestHttpByteArrayCacheEntrySerializer {
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]));
}
}

View File

@ -204,7 +204,7 @@ public class TestWarningValue {
Assertions.assertEquals("fred", impl.getWarnAgent());
Assertions.assertEquals("\"stale\"", impl.getWarnText());
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
@ -214,7 +214,7 @@ public class TestWarningValue {
Assertions.assertEquals("fred", impl.getWarnAgent());
Assertions.assertEquals("\"stale\"", impl.getWarnText());
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
@ -224,7 +224,7 @@ public class TestWarningValue {
Assertions.assertEquals("fred", impl.getWarnAgent());
Assertions.assertEquals("\"stale\"", impl.getWarnText());
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());
}
}

View File

@ -33,6 +33,7 @@ import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
@ -260,21 +261,48 @@ public class Request {
return request;
}
/**
* @deprecated Use {@link #setDate(Instant)}
*/
@Deprecated
public Request setDate(final Date date) {
this.request.setHeader(HttpHeader.DATE, DateUtils.formatStandardDate(DateUtils.toInstant(date)));
return this;
}
/**
* @deprecated Use {@link #setIfModifiedSince(Instant)}
*/
@Deprecated
public Request setIfModifiedSince(final Date date) {
this.request.setHeader(HttpHeader.IF_MODIFIED_SINCE, DateUtils.formatStandardDate(DateUtils.toInstant(date)));
return this;
}
/**
* @deprecated Use {@link #setIfUnmodifiedSince(Instant)}
*/
@Deprecated
public Request setIfUnmodifiedSince(final Date date) {
this.request.setHeader(HttpHeader.IF_UNMODIFIED_SINCE, DateUtils.formatStandardDate(DateUtils.toInstant(date)));
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
public Request version(final HttpVersion version) {

View File

@ -248,7 +248,7 @@ public class RequestConfig implements Cloneable {
public static RequestConfig.Builder custom() {
return new Builder();
}
@SuppressWarnings("deprecation")
public static RequestConfig.Builder copy(final RequestConfig config) {
return new Builder()
.setExpectContinueEnabled(config.isExpectContinueEnabled())

View File

@ -29,6 +29,7 @@ package org.apache.hc.client5.http.cookie;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
@ -83,7 +84,7 @@ public class BasicCookieStore implements CookieStore, Serializable {
try {
// first remove any old cookie that is equivalent
cookies.remove(cookie);
if (!cookie.isExpired(new Date())) {
if (!cookie.isExpired(Instant.now())) {
cookies.add(cookie);
}
} finally {
@ -136,6 +137,7 @@ public class BasicCookieStore implements CookieStore, Serializable {
* @see Cookie#isExpired(Date)
*/
@Override
@SuppressWarnings("deprecation")
public boolean clearExpired(final Date date) {
if (date == null) {
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.
*/

View File

@ -27,6 +27,7 @@
package org.apache.hc.client5.http.cookie;
import java.time.Instant;
import java.util.Date;
/**
@ -77,9 +78,26 @@ public interface Cookie {
* considered immutable. Changing it (e.g. using setTime()) could result
* in undefined behaviour. Do so at your peril. </p>
* @return Expiration {@link Date}, or {@code null}.
* @deprecated Use {{@link #getExpiryInstant()}}
*/
@Deprecated
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
* of the "session"; {@code true} otherwise.
@ -119,13 +137,34 @@ public interface Cookie {
* @param date Current time
*
* @return {@code true} if the cookie has expired.
* @deprecated Use {{@link #isExpired(Instant)}}
*/
@Deprecated
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.
*/
Date getCreationDate();
default Instant getCreationInstant() { return null; }
/**
* Checks whether this Cookie has been marked as {@code httpOnly}.

View File

@ -27,8 +27,8 @@
package org.apache.hc.client5.http.cookie;
import java.time.Instant;
import java.util.Comparator;
import java.util.Date;
import org.apache.hc.core5.annotation.Contract;
import org.apache.hc.core5.annotation.ThreadingBehavior;
@ -56,10 +56,10 @@ public class CookiePriorityComparator implements Comparator<Cookie> {
final int l2 = getPathLength(c2);
final int result = l2 - l1;
if (result == 0) {
final Date d1 = c1.getCreationDate();
final Date d2 = c2.getCreationDate();
final Instant d1 = c1.getCreationInstant();
final Instant d2 = c2.getCreationInstant();
if (d1 != null && d2 != null) {
return (int) (d1.getTime() - d2.getTime());
return (int) (d1.toEpochMilli() - d2.toEpochMilli());
}
}
return result;

View File

@ -26,6 +26,7 @@
*/
package org.apache.hc.client5.http.cookie;
import java.time.Instant;
import java.util.Date;
import java.util.List;
@ -58,9 +59,22 @@ public interface CookieStore {
* the specified {@link java.util.Date}.
*
* @return true if any cookies were purged.
* @deprecated Use {@link #clearExpired(Instant)}
*/
@Deprecated
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.
*/

View File

@ -27,8 +27,11 @@
package org.apache.hc.client5.http.cookie;
import java.time.Instant;
import java.util.Date;
import org.apache.hc.client5.http.utils.DateUtils;
/**
* 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.
@ -48,10 +51,26 @@ public interface SetCookie extends Cookie {
* @param expiryDate the {@link Date} after which this cookie is no longer valid.
*
* @see Cookie#getExpiryDate
*
* @deprecated Use {{@link #setExpiryDate(Instant)}}
*/
@Deprecated
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.
*

View File

@ -749,7 +749,7 @@ public class HttpAsyncClientBuilder {
}
closeables.add(closeable);
}
@SuppressWarnings("deprecated")
public CloseableHttpAsyncClient build() {
AsyncClientConnectionManager connManagerCopy = this.connManager;
if (connManagerCopy == null) {

View File

@ -28,12 +28,14 @@
package org.apache.hc.client5.http.impl.cookie;
import java.io.Serializable;
import java.time.Instant;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import org.apache.hc.client5.http.cookie.SetCookie;
import org.apache.hc.client5.http.utils.DateUtils;
import org.apache.hc.core5.util.Args;
/**
@ -99,9 +101,19 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
*
* @see #setExpiryDate(java.util.Date)
*
* @deprecated Use {@link #getExpiryInstant()}
*/
@Deprecated
@Override
public Date getExpiryDate() {
return DateUtils.toDate(cookieExpiryDate);
}
/**
* {@inheritDoc}
*/
@Override
public Instant getExpiryInstant() {
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.
*
* @see #getExpiryDate
* @deprecated Use {{@link #setExpiryDate(Instant)}}
*
*/
@Deprecated
@Override
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
*
* @return {@code true} if the cookie has expired.
*
* @deprecated Use {@link #isExpired(Instant)}
*/
@Deprecated
@Override
public boolean isExpired(final Date date) {
Args.notNull(date, "Date");
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
*
* @deprecated Use {@link #getCreationInstant()}.
*/
@Deprecated
@Override
public Date getCreationDate() {
return DateUtils.toDate(creationDate);
}
/**
* @since 5.2
*/
@Override
public Instant getCreationInstant() {
return creationDate;
}
@ -261,8 +316,17 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
/**
* @since 4.4
* @deprecated Use {@link #setCreationDate(Instant)}
*/
@Deprecated
public void setCreationDate(final Date creationDate) {
this.creationDate = DateUtils.toInstant(creationDate);
}
/**
* @since 5.2
*/
public void setCreationDate(final Instant creationDate) {
this.creationDate = creationDate;
}
@ -329,8 +393,8 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
/** Domain attribute. */
private String cookieDomain;
/** Expiration {@link Date}. */
private Date cookieExpiryDate;
/** Expiration {@link Instant}. */
private Instant cookieExpiryDate;
/** Path attribute. */
private String cookiePath;
@ -338,7 +402,7 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
/** My secure flag. */
private boolean isSecure;
private Date creationDate;
private Instant creationDate;
/** The {@code httpOnly} flag. */
private boolean httpOnly;

View File

@ -86,7 +86,7 @@ public class BasicExpiresHandler extends AbstractCookieAttributeHandler implemen
throw new MalformedCookieException("Invalid 'expires' attribute: "
+ value);
}
cookie.setExpiryDate(DateUtils.toDate(expiry));
cookie.setExpiryDate(expiry);
}
@Override

View File

@ -26,7 +26,7 @@
*/
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.Cookie;
@ -66,7 +66,7 @@ public class BasicMaxAgeHandler extends AbstractCookieAttributeHandler implement
throw new MalformedCookieException ("Negative 'max-age' attribute: "
+ value);
}
cookie.setExpiryDate(new Date(System.currentTimeMillis() + age * 1000L));
cookie.setExpiryDate(Instant.now().plusSeconds(age));
}
@Override

View File

@ -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.MalformedCookieException;
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.ThreadingBehavior;
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,
ZoneId.of("UTC")).toInstant();
cookie.setExpiryDate(DateUtils.toDate(expiryDate));
cookie.setExpiryDate(expiryDate);
}
private void skipDelims(final CharSequence buf, final Tokenizer.Cursor cursor) {

View File

@ -26,7 +26,7 @@
*/
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.Pattern;
@ -68,8 +68,8 @@ public class LaxMaxAgeHandler extends AbstractCookieAttributeHandler implements
} catch (final NumberFormatException e) {
return;
}
final Date expiryDate = age >= 0 ? new Date(System.currentTimeMillis() + age * 1000L) :
new Date(Long.MIN_VALUE);
final Instant expiryDate = age >= 0 ? Instant.now().plusSeconds(age) :
Instant.EPOCH;
cookie.setExpiryDate(expiryDate);
}
}

View File

@ -27,10 +27,10 @@
package org.apache.hc.client5.http.impl.cookie;
import java.time.Instant;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
@ -146,7 +146,7 @@ public class RFC6265CookieSpec implements CookieSpec {
final BasicClientCookie cookie = new BasicClientCookie(name, value);
cookie.setPath(getDefaultPath(origin));
cookie.setDomain(getDefaultDomain(origin));
cookie.setCreationDate(new Date());
cookie.setCreationDate(Instant.now());
final Map<String, String> attribMap = new LinkedHashMap<>();
while (!cursor.atEnd()) {

View File

@ -28,7 +28,7 @@
package org.apache.hc.client5.http.impl.io;
import java.io.IOException;
import java.util.Date;
import java.time.Instant;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
@ -259,7 +259,7 @@ public class BasicHttpClientConnectionManager implements HttpClientConnectionMan
private void checkExpiry() {
if (this.conn != null && System.currentTimeMillis() >= this.expiry) {
if (LOG.isDebugEnabled()) {
LOG.debug("{} Connection expired @ {}", id, new Date(this.expiry));
LOG.debug("{} Connection expired @ {}", id, Instant.ofEpochMilli(this.expiry));
}
closeConnection(CloseMode.GRACEFUL);
}

View File

@ -28,8 +28,8 @@
package org.apache.hc.client5.http.protocol;
import java.io.IOException;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.hc.client5.http.RouteInfo;
@ -150,7 +150,7 @@ public class RequestAddCookies implements HttpRequestInterceptor {
final List<Cookie> cookies = cookieStore.getCookies();
// Find cookies matching the given origin
final List<Cookie> matchedCookies = new ArrayList<>();
final Date now = new Date();
final Instant now = Instant.now();
boolean expired = false;
for (final Cookie cookie : cookies) {
if (!cookie.isExpired(now)) {

View File

@ -149,7 +149,7 @@ public class ResponseProcessCookies implements HttpResponseInterceptor {
buf.append(", path:");
buf.append(cookie.getPath());
buf.append(", expiry:");
buf.append(cookie.getExpiryDate());
buf.append(cookie.getExpiryInstant());
return buf.toString();
}

View File

@ -110,6 +110,7 @@ public class DefaultClientTlsStrategy extends AbstractClientTlsStrategy {
}
@Override
@SuppressWarnings("deprecated")
TlsDetails createTlsDetails(final SSLEngine sslEngine) {
return tlsDetailsFactory != null ? tlsDetailsFactory.create(sslEngine) : null;
}

View File

@ -27,8 +27,8 @@
package org.apache.hc.client5.http.cookie;
import java.time.Instant;
import java.util.Comparator;
import java.util.Date;
import org.apache.hc.client5.http.impl.cookie.BasicClientCookie;
import org.junit.jupiter.api.Assertions;
@ -101,10 +101,10 @@ public class TestCookiePriorityComparator {
public void testUnequalityCreationDate() {
final BasicClientCookie cookie1 = new BasicClientCookie("name1", "value");
cookie1.setPath("/blah");
cookie1.setCreationDate(new Date(System.currentTimeMillis() - 200000));
cookie1.setCreationDate(Instant.now().minusMillis(200000));
final BasicClientCookie cookie2 = new BasicClientCookie("name1", "value");
cookie2.setPath("/blah");
cookie2.setCreationDate(new Date(System.currentTimeMillis()));
cookie2.setCreationDate(Instant.now());
Assertions.assertTrue(comparator.compare(cookie1, cookie2) < 0);
Assertions.assertTrue(comparator.compare(cookie2, cookie1) > 0);
}

View File

@ -267,7 +267,7 @@ public class TestBasicCookieAttribHandlers {
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
final CookieAttributeHandler h = new BasicMaxAgeHandler();
h.parse(cookie, "2000");
Assertions.assertNotNull(cookie.getExpiryDate());
Assertions.assertNotNull(cookie.getExpiryInstant());
}
@Test
@ -327,7 +327,7 @@ public class TestBasicCookieAttribHandlers {
final CookieAttributeHandler h = new BasicExpiresHandler(DateUtils.FORMATTER_RFC1123);
h.parse(cookie, DateUtils.formatStandardDate(Instant.now()));
Assertions.assertNotNull(cookie.getExpiryDate());
Assertions.assertNotNull(cookie.getExpiryInstant());
}
@Test

View File

@ -31,7 +31,8 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Calendar;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;
import org.apache.hc.client5.http.cookie.BasicCookieStore;
@ -65,9 +66,8 @@ public class TestBasicCookieStore {
final BasicCookieStore store = new BasicCookieStore();
final BasicClientCookie cookie = new BasicClientCookie("name1", "value1");
final Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_YEAR, -10);
cookie.setExpiryDate(c.getTime());
final Instant minus_10_days = Instant.now().minus(10, ChronoUnit.DAYS);
cookie.setExpiryDate(minus_10_days);
store.addCookie(cookie);
final List<Cookie> list = store.getCookies();
Assertions.assertNotNull(list);

View File

@ -43,7 +43,7 @@ public class TestLaxCookieAttribHandlers {
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
final CookieAttributeHandler h = new LaxMaxAgeHandler();
h.parse(cookie, "2000");
Assertions.assertNotNull(cookie.getExpiryDate());
Assertions.assertNotNull(cookie.getExpiryInstant());
}
@Test
@ -51,7 +51,7 @@ public class TestLaxCookieAttribHandlers {
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
final CookieAttributeHandler h = new LaxMaxAgeHandler();
h.parse(cookie, "-2000");
Assertions.assertNotNull(cookie.getExpiryDate());
Assertions.assertNotNull(cookie.getExpiryInstant());
}
@Test
@ -59,7 +59,7 @@ public class TestLaxCookieAttribHandlers {
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
final CookieAttributeHandler h = new LaxMaxAgeHandler();
h.parse(cookie, "0000");
Assertions.assertNotNull(cookie.getExpiryDate());
Assertions.assertNotNull(cookie.getExpiryInstant());
}
@Test
@ -67,7 +67,7 @@ public class TestLaxCookieAttribHandlers {
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
final CookieAttributeHandler h = new LaxMaxAgeHandler();
h.parse(cookie, " ");
Assertions.assertNull(cookie.getExpiryDate());
Assertions.assertNull(cookie.getExpiryInstant());
}
@Test
@ -75,7 +75,7 @@ public class TestLaxCookieAttribHandlers {
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
final CookieAttributeHandler h = new LaxMaxAgeHandler();
h.parse(cookie, "garbage");
Assertions.assertNull(cookie.getExpiryDate());
Assertions.assertNull(cookie.getExpiryInstant());
}
@Test
@ -98,7 +98,25 @@ public class TestLaxCookieAttribHandlers {
final CookieAttributeHandler h = new LaxExpiresHandler();
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.assertEquals(2012, expiryDate.get(ChronoField.YEAR));
@ -115,7 +133,7 @@ public class TestLaxCookieAttribHandlers {
final BasicClientCookie cookie = new BasicClientCookie("name", "value");
final CookieAttributeHandler h = new LaxExpiresHandler();
h.parse(cookie, null);
Assertions.assertNull(cookie.getExpiryDate());
Assertions.assertNull(cookie.getExpiryInstant());
}
@Test
@ -156,7 +174,25 @@ public class TestLaxCookieAttribHandlers {
final CookieAttributeHandler h = new LaxExpiresHandler();
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.assertEquals(2000, expiryDate.get(ChronoField.YEAR_OF_ERA));
@ -198,7 +234,25 @@ public class TestLaxCookieAttribHandlers {
final CookieAttributeHandler h = new LaxExpiresHandler();
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.assertEquals(1880, expiryDate.get(ChronoField.YEAR));
@ -224,7 +278,25 @@ public class TestLaxCookieAttribHandlers {
final CookieAttributeHandler h = new LaxExpiresHandler();
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.assertEquals(2008, expiryDate.get(ChronoField.YEAR));
@ -266,7 +338,25 @@ public class TestLaxCookieAttribHandlers {
final CookieAttributeHandler h = new LaxExpiresHandler();
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.assertEquals(2008, expiryDate.get(ChronoField.YEAR));
@ -284,7 +374,7 @@ public class TestLaxCookieAttribHandlers {
final CookieAttributeHandler h = new LaxExpiresHandler();
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.assertEquals(1970, expiryDate.get(ChronoField.YEAR));
@ -296,7 +386,7 @@ public class TestLaxCookieAttribHandlers {
final CookieAttributeHandler h = new LaxExpiresHandler();
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.assertEquals(1999, expiryDate.get(ChronoField.YEAR));
@ -308,7 +398,7 @@ public class TestLaxCookieAttribHandlers {
final CookieAttributeHandler h = new LaxExpiresHandler();
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.assertEquals(2000, expiryDate.get(ChronoField.YEAR));

View File

@ -26,7 +26,7 @@
*/
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.RouteInfo.LayerType;
@ -321,7 +321,7 @@ public class TestRequestAddCookies {
final BasicClientCookie cookie3 = new BasicClientCookie("name3", "value3");
cookie3.setDomain("localhost.local");
cookie3.setPath("/");
cookie3.setExpiryDate(new Date(System.currentTimeMillis() + 100));
cookie3.setExpiryDate(Instant.now().plusMillis(100));
this.cookieStore.addCookie(cookie3);
Assertions.assertEquals(3, this.cookieStore.getCookies().size());
@ -346,7 +346,7 @@ public class TestRequestAddCookies {
Assertions.assertEquals(1, headers.length);
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