Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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.
Expand All @@ -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,
Expand All @@ -97,6 +100,42 @@ public HttpCacheEntry(
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;
Expand All @@ -107,6 +146,21 @@ public HttpCacheEntry(
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}.
*
Expand All @@ -122,17 +176,17 @@ public HttpCacheEntry(
* 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);
}

/**
Expand All @@ -146,16 +200,40 @@ public int getStatus() {
* 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;
}

Expand Down Expand Up @@ -253,6 +331,10 @@ public Iterator<Header> headerIterator(final String name) {
* @since 4.3
*/
public Date getDate() {
return DateUtils.toDate(date);
}

public Instant getInstant() {
return date;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
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;
Expand Down Expand Up @@ -309,15 +309,15 @@ void callBackend(
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() {

@Override
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);
Expand Down Expand Up @@ -446,17 +446,17 @@ class BackendResponseHandler implements AsyncExecCallback {

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;

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;
Expand Down Expand Up @@ -525,7 +525,7 @@ public void handleInformationResponse(final HttpResponse response) throws HttpEx
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,
Expand Down Expand Up @@ -622,7 +622,7 @@ private void handleCacheHit(
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 {
Expand Down Expand Up @@ -690,15 +690,15 @@ void revalidateCacheEntry(
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);
chainProceed(conditionalRequest, entityProducer, scope, chain, new AsyncExecCallback() {

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(
Expand All @@ -713,7 +713,7 @@ void triggerUpdatedCacheEntryResponse(final HttpResponse backendResponse, final
@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 {
Expand Down Expand Up @@ -749,7 +749,7 @@ void triggerResponseStaleCacheEntry() {
}
}

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();
Expand All @@ -772,7 +772,7 @@ public AsyncDataConsumer handleResponse(
final HttpResponse backendResponse1,
final EntityDetails entityDetails) throws HttpException, IOException {

final Date responseDate1 = getCurrentDate();
final Instant responseDate1 = getCurrentDate();

final AsyncExecCallback callback1;
if (revalidationResponseIsTooOld(backendResponse1, cacheEntry)
Expand All @@ -787,7 +787,7 @@ public AsyncDataConsumer handleResponse(
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);
Expand Down Expand Up @@ -920,12 +920,12 @@ void negotiateResponseFromVariants(
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,
Expand Down Expand Up @@ -989,7 +989,7 @@ public void cancelled() {
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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -309,8 +309,8 @@ public Cancellable updateCacheEntry(
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));
Expand Down Expand Up @@ -356,8 +356,8 @@ public Cancellable updateVariantCacheEntry(
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);
Expand Down Expand Up @@ -404,8 +404,8 @@ public Cancellable createCacheEntry(
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));
Expand Down
Loading