}
try {
request = requestCompliance.makeRequestCompliant(request);
} catch (ProtocolException e) {
throw new ClientProtocolException(e);
}
cacheInvalidator.flushInvalidatedCacheEntries(target, request);
if (!cacheableRequestPolicy.isServableFromCache(request)) {
return callBackend(target, request, context);
}
CacheEntry entry = getCacheEntry(target, request);
if (entry == null) {
cacheMisses.getAndIncrement();
if (log.isDebugEnabled()) {
RequestLine rl = request.getRequestLine();
log.debug("Cache miss [host: " + target + "; uri: " + rl.getUri() + "]");
}
return callBackend(target, request, context);
}
if (log.isDebugEnabled()) {
RequestLine rl = request.getRequestLine();
log.debug("Cache hit [host: " + target + "; uri: " + rl.getUri() + "]");
}
cacheHits.getAndIncrement();
if (suitabilityChecker.canCachedResponseBeUsed(target, request, entry)) {
return responseGenerator.generateResponse(entry);
}
if (entry.isRevalidatable()) {
log.debug("Revalidating the cache entry");
try {
return revalidateCacheEntry(target, request, context, entry);
} catch (IOException ioex) {
HttpResponse response = responseGenerator.generateResponse(entry);
response.addHeader(HeaderConstants.WARNING, "111 Revalidation Failed - " + ioex.getMessage());
log.debug("111 revalidation failed due to exception: " + ioex);
return response;
} catch (ProtocolException e) {
throw new ClientProtocolException(e);
}
}
return callBackend(target, request, context);
}