Return-Path: Delivered-To: apmail-hc-commits-archive@www.apache.org Received: (qmail 70458 invoked from network); 19 Dec 2010 15:25:35 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 19 Dec 2010 15:25:35 -0000 Received: (qmail 30314 invoked by uid 500); 19 Dec 2010 15:25:35 -0000 Delivered-To: apmail-hc-commits-archive@hc.apache.org Received: (qmail 30266 invoked by uid 500); 19 Dec 2010 15:25:34 -0000 Mailing-List: contact commits-help@hc.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "HttpComponents Project" Delivered-To: mailing list commits@hc.apache.org Received: (qmail 30259 invoked by uid 99); 19 Dec 2010 15:25:33 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 19 Dec 2010 15:25:33 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 19 Dec 2010 15:25:26 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id E481123889E2; Sun, 19 Dec 2010 15:25:04 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1050878 - /httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java Date: Sun, 19 Dec 2010 15:25:04 -0000 To: commits@hc.apache.org From: jonm@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20101219152504.E481123889E2@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: jonm Date: Sun Dec 19 15:25:04 2010 New Revision: 1050878 URL: http://svn.apache.org/viewvc?rev=1050878&view=rev Log: HTTPCLIENT-975: refactoring primary execute method in CachingHttpClient (mostly method extraction). Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java?rev=1050878&r1=1050877&r2=1050878&view=diff ============================================================================== --- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java (original) +++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java Sun Dec 19 15:25:04 2010 @@ -397,11 +397,7 @@ public class CachingHttpClient implement } request.addHeader("Via",via); - try { - responseCache.flushInvalidatedCacheEntriesFor(target, request); - } catch (IOException ioe) { - log.warn("Unable to flush invalidated entries from cache", ioe); - } + flushEntriesInvalidatedByRequest(target, request); if (!cacheableRequestPolicy.isServableFromCache(request)) { return callBackend(target, request, context); @@ -445,29 +441,16 @@ public class CachingHttpClient implement if (log.isDebugEnabled()) { RequestLine rl = request.getRequestLine(); log.debug("Cache hit [host: " + target + "; uri: " + rl.getUri() + "]"); - } cacheHits.getAndIncrement(); Date now = getCurrentDate(); if (suitabilityChecker.canCachedResponseBeUsed(target, request, entry, now)) { - final HttpResponse cachedResponse; - if (request.containsHeader(HeaderConstants.IF_NONE_MATCH) - || request.containsHeader(HeaderConstants.IF_MODIFIED_SINCE)) { - cachedResponse = responseGenerator.generateNotModifiedResponse(entry); - } else { - cachedResponse = responseGenerator.generateResponse(entry); - } - setResponseStatus(context, CacheResponseStatus.CACHE_HIT); - if (validityPolicy.getStalenessSecs(entry, now) > 0L) { - cachedResponse.addHeader("Warning","110 localhost \"Response is stale\""); - } - return cachedResponse; + return generateCachedResponse(request, context, entry, now); } if (!mayCallBackend(request)) { - return new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_GATEWAY_TIMEOUT, - "Gateway Timeout"); + return generateGatewayTimeout(context); } if (validityPolicy.isRevalidatable(entry)) { @@ -484,18 +467,7 @@ public class CachingHttpClient implement } return revalidateCacheEntry(target, request, context, entry); } catch (IOException ioex) { - if (validityPolicy.mustRevalidate(entry) - || (isSharedCache() && validityPolicy.proxyRevalidate(entry)) - || explicitFreshnessRequest(request, entry, now)) { - setResponseStatus(context, CacheResponseStatus.CACHE_MODULE_RESPONSE); - return new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_GATEWAY_TIMEOUT, "Gateway Timeout"); - } else { - final HttpResponse cachedResponse = responseGenerator.generateResponse(entry); - setResponseStatus(context, CacheResponseStatus.CACHE_HIT); - cachedResponse.addHeader(HeaderConstants.WARNING, "111 localhost \"Revalidation failed\""); - log.debug("111 revalidation failed due to exception: " + ioex); - return cachedResponse; - } + return handleRevalidationFailure(request, context, entry, now); } catch (ProtocolException e) { throw new ClientProtocolException(e); } @@ -503,6 +475,61 @@ public class CachingHttpClient implement return callBackend(target, request, context); } + private void flushEntriesInvalidatedByRequest(HttpHost target, + HttpRequest request) { + try { + responseCache.flushInvalidatedCacheEntriesFor(target, request); + } catch (IOException ioe) { + log.warn("Unable to flush invalidated entries from cache", ioe); + } + } + + private HttpResponse generateCachedResponse(HttpRequest request, + HttpContext context, HttpCacheEntry entry, Date now) { + final HttpResponse cachedResponse; + if (request.containsHeader(HeaderConstants.IF_NONE_MATCH) + || request.containsHeader(HeaderConstants.IF_MODIFIED_SINCE)) { + cachedResponse = responseGenerator.generateNotModifiedResponse(entry); + } else { + cachedResponse = responseGenerator.generateResponse(entry); + } + setResponseStatus(context, CacheResponseStatus.CACHE_HIT); + if (validityPolicy.getStalenessSecs(entry, now) > 0L) { + cachedResponse.addHeader("Warning","110 localhost \"Response is stale\""); + } + return cachedResponse; + } + + private HttpResponse handleRevalidationFailure(HttpRequest request, + HttpContext context, HttpCacheEntry entry, Date now) { + if (staleResponseNotAllowed(request, entry, now)) { + return generateGatewayTimeout(context); + } else { + return unvalidatedCacheHit(context, entry); + } + } + + private HttpResponse generateGatewayTimeout(HttpContext context) { + setResponseStatus(context, CacheResponseStatus.CACHE_MODULE_RESPONSE); + return new BasicHttpResponse(HttpVersion.HTTP_1_1, + HttpStatus.SC_GATEWAY_TIMEOUT, "Gateway Timeout"); + } + + private HttpResponse unvalidatedCacheHit(HttpContext context, + HttpCacheEntry entry) { + final HttpResponse cachedResponse = responseGenerator.generateResponse(entry); + setResponseStatus(context, CacheResponseStatus.CACHE_HIT); + cachedResponse.addHeader(HeaderConstants.WARNING, "111 localhost \"Revalidation failed\""); + return cachedResponse; + } + + private boolean staleResponseNotAllowed(HttpRequest request, + HttpCacheEntry entry, Date now) { + return validityPolicy.mustRevalidate(entry) + || (isSharedCache() && validityPolicy.proxyRevalidate(entry)) + || explicitFreshnessRequest(request, entry, now); + } + private boolean mayCallBackend(HttpRequest request) { for (Header h: request.getHeaders("Cache-Control")) { for (HeaderElement elt : h.getElements()) {