Class CachingHttpClient

  • All Implemented Interfaces:
    HttpClient

    @Deprecated
    @Contract(threading=SAFE_CONDITIONAL)
    public class CachingHttpClient
    extends java.lang.Object
    implements HttpClient
    Deprecated.

    The CachingHttpClient is meant to be a drop-in replacement for a DefaultHttpClient that transparently adds client-side caching. The current implementation is conditionally compliant with HTTP/1.1 (meaning all the MUST and MUST NOTs are obeyed), although quite a lot, though not all, of the SHOULDs and SHOULD NOTs are obeyed too. Generally speaking, you construct a CachingHttpClient by providing a "backend" HttpClient used for making actual network requests and provide an HttpCacheStorage instance to use for holding onto cached responses. Additional configuration options can be provided by passing in a CacheConfig. Note that all of the usual client related configuration you want to do vis-a-vis timeouts and connection pools should be done on this backend client before constructing a CachingHttpClient from it.

    Generally speaking, the CachingHttpClient is implemented as a Decorator of the backend client; for any incoming request it attempts to satisfy it from the cache, but if it can't, or if it needs to revalidate a stale cache entry, it will use the backend client to make an actual request. However, a proper HTTP/1.1 cache won't change the semantics of a request and response; in particular, if you issue an unconditional request you will get a full response (although it may be served to you from the cache, or the cache may make a conditional request on your behalf to the origin). This notion of "semantic transparency" means you should be able to drop a CachingHttpClient into an existing application without breaking anything.

    Folks that would like to experiment with alternative storage backends should look at the HttpCacheStorage interface and the related package documentation there. You may also be interested in the provided EhCache and memcached storage backends.

    Since:
    4.1
    • Field Detail

      • CACHE_RESPONSE_STATUS

        public static final java.lang.String CACHE_RESPONSE_STATUS
        Deprecated.
        This is the name under which the CacheResponseStatus of a request (for example, whether it resulted in a cache hit) will be recorded if an HttpContext is provided during execution.
        See Also:
        Constant Field Values
      • SUPPORTS_RANGE_AND_CONTENT_RANGE_HEADERS

        private static final boolean SUPPORTS_RANGE_AND_CONTENT_RANGE_HEADERS
        Deprecated.
        See Also:
        Constant Field Values
      • cacheHits

        private final java.util.concurrent.atomic.AtomicLong cacheHits
        Deprecated.
      • cacheMisses

        private final java.util.concurrent.atomic.AtomicLong cacheMisses
        Deprecated.
      • cacheUpdates

        private final java.util.concurrent.atomic.AtomicLong cacheUpdates
        Deprecated.
      • viaHeaders

        private final java.util.Map<org.apache.http.ProtocolVersion,​java.lang.String> viaHeaders
        Deprecated.
      • backend

        private final HttpClient backend
        Deprecated.
      • responseCache

        private final HttpCache responseCache
        Deprecated.
      • maxObjectSizeBytes

        private final long maxObjectSizeBytes
        Deprecated.
      • sharedCache

        private final boolean sharedCache
        Deprecated.
      • log

        private final org.apache.commons.logging.Log log
        Deprecated.
    • Constructor Detail

      • CachingHttpClient

        public CachingHttpClient()
        Deprecated.
        Constructs a CachingHttpClient with default caching settings that stores cache entries in memory and uses a vanilla DefaultHttpClient for backend requests.
      • CachingHttpClient

        public CachingHttpClient​(CacheConfig config)
        Deprecated.
        Constructs a CachingHttpClient with the given caching options that stores cache entries in memory and uses a vanilla DefaultHttpClient for backend requests.
        Parameters:
        config - cache module options
      • CachingHttpClient

        public CachingHttpClient​(HttpClient client)
        Deprecated.
        Constructs a CachingHttpClient with default caching settings that stores cache entries in memory and uses the given HttpClient for backend requests.
        Parameters:
        client - used to make origin requests
      • CachingHttpClient

        public CachingHttpClient​(HttpClient client,
                                 CacheConfig config)
        Deprecated.
        Constructs a CachingHttpClient with the given caching options that stores cache entries in memory and uses the given HttpClient for backend requests.
        Parameters:
        config - cache module options
        client - used to make origin requests
      • CachingHttpClient

        public CachingHttpClient​(HttpClient client,
                                 ResourceFactory resourceFactory,
                                 HttpCacheStorage storage,
                                 CacheConfig config)
        Deprecated.
        Constructs a CachingHttpClient with the given caching options that stores cache entries in the provided storage backend and uses the given HttpClient for backend requests. However, cached response bodies are managed using the given ResourceFactory.
        Parameters:
        client - used to make origin requests
        resourceFactory - how to manage cached response bodies
        storage - where to store cache entries
        config - cache module options
      • CachingHttpClient

        public CachingHttpClient​(HttpClient client,
                                 HttpCacheStorage storage,
                                 CacheConfig config)
        Deprecated.
        Constructs a CachingHttpClient with the given caching options that stores cache entries in the provided storage backend and uses the given HttpClient for backend requests.
        Parameters:
        client - used to make origin requests
        storage - where to store cache entries
        config - cache module options
    • Method Detail

      • getCacheHits

        public long getCacheHits()
        Deprecated.
        Reports the number of times that the cache successfully responded to an HttpRequest without contacting the origin server.
        Returns:
        the number of cache hits
      • getCacheMisses

        public long getCacheMisses()
        Deprecated.
        Reports the number of times that the cache contacted the origin server because it had no appropriate response cached.
        Returns:
        the number of cache misses
      • getCacheUpdates

        public long getCacheUpdates()
        Deprecated.
        Reports the number of times that the cache was able to satisfy a response by revalidating an existing but stale cache entry.
        Returns:
        the number of cache revalidations
      • execute

        public org.apache.http.HttpResponse execute​(org.apache.http.HttpHost target,
                                                    org.apache.http.HttpRequest request)
                                             throws java.io.IOException
        Deprecated.
        Description copied from interface: HttpClient
        Executes HTTP request using the default context.
        Specified by:
        execute in interface HttpClient
        Parameters:
        target - the target host for the request. Implementations may accept null if they can still determine a route, for example to a default target or by inspecting the request.
        request - the request to execute
        Returns:
        the response to the request. This is always a final response, never an intermediate response with an 1xx status code. Whether redirects or authentication challenges will be returned or handled automatically depends on the implementation and configuration of this client.
        Throws:
        java.io.IOException - in case of a problem or the connection was aborted
        ClientProtocolException - in case of an http protocol error
      • execute

        public <T> T execute​(org.apache.http.HttpHost target,
                             org.apache.http.HttpRequest request,
                             ResponseHandler<? extends T> responseHandler)
                      throws java.io.IOException
        Deprecated.
        Description copied from interface: HttpClient
        Executes HTTP request to the target using the default context and processes the response using the given response handler.

        Implementing classes are required to ensure that the content entity associated with the response is fully consumed and the underlying connection is released back to the connection manager automatically in all cases relieving individual ResponseHandlers from having to manage resource deallocation internally.

        Specified by:
        execute in interface HttpClient
        Parameters:
        target - the target host for the request. Implementations may accept null if they can still determine a route, for example to a default target or by inspecting the request.
        request - the request to execute
        responseHandler - the response handler
        Returns:
        the response object as generated by the response handler.
        Throws:
        java.io.IOException - in case of a problem or the connection was aborted
        ClientProtocolException - in case of an http protocol error
      • execute

        public <T> T execute​(org.apache.http.HttpHost target,
                             org.apache.http.HttpRequest request,
                             ResponseHandler<? extends T> responseHandler,
                             org.apache.http.protocol.HttpContext context)
                      throws java.io.IOException
        Deprecated.
        Description copied from interface: HttpClient
        Executes HTTP request to the target using the given context and processes the response using the given response handler.

        Implementing classes are required to ensure that the content entity associated with the response is fully consumed and the underlying connection is released back to the connection manager automatically in all cases relieving individual ResponseHandlers from having to manage resource deallocation internally.

        Specified by:
        execute in interface HttpClient
        Parameters:
        target - the target host for the request. Implementations may accept null if they can still determine a route, for example to a default target or by inspecting the request.
        request - the request to execute
        responseHandler - the response handler
        context - the context to use for the execution, or null to use the default context
        Returns:
        the response object as generated by the response handler.
        Throws:
        java.io.IOException - in case of a problem or the connection was aborted
        ClientProtocolException - in case of an http protocol error
      • execute

        public org.apache.http.HttpResponse execute​(HttpUriRequest request)
                                             throws java.io.IOException
        Deprecated.
        Description copied from interface: HttpClient
        Executes HTTP request using the default context.
        Specified by:
        execute in interface HttpClient
        Parameters:
        request - the request to execute
        Returns:
        the response to the request. This is always a final response, never an intermediate response with an 1xx status code. Whether redirects or authentication challenges will be returned or handled automatically depends on the implementation and configuration of this client.
        Throws:
        java.io.IOException - in case of a problem or the connection was aborted
        ClientProtocolException - in case of an http protocol error
      • execute

        public org.apache.http.HttpResponse execute​(HttpUriRequest request,
                                                    org.apache.http.protocol.HttpContext context)
                                             throws java.io.IOException
        Deprecated.
        Description copied from interface: HttpClient
        Executes HTTP request using the given context.
        Specified by:
        execute in interface HttpClient
        Parameters:
        request - the request to execute
        context - the context to use for the execution, or null to use the default context
        Returns:
        the response to the request. This is always a final response, never an intermediate response with an 1xx status code. Whether redirects or authentication challenges will be returned or handled automatically depends on the implementation and configuration of this client.
        Throws:
        java.io.IOException - in case of a problem or the connection was aborted
        ClientProtocolException - in case of an http protocol error
      • execute

        public <T> T execute​(HttpUriRequest request,
                             ResponseHandler<? extends T> responseHandler)
                      throws java.io.IOException
        Deprecated.
        Description copied from interface: HttpClient
        Executes HTTP request using the default context and processes the response using the given response handler.

        Implementing classes are required to ensure that the content entity associated with the response is fully consumed and the underlying connection is released back to the connection manager automatically in all cases relieving individual ResponseHandlers from having to manage resource deallocation internally.

        Specified by:
        execute in interface HttpClient
        Parameters:
        request - the request to execute
        responseHandler - the response handler
        Returns:
        the response object as generated by the response handler.
        Throws:
        java.io.IOException - in case of a problem or the connection was aborted
        ClientProtocolException - in case of an http protocol error
      • execute

        public <T> T execute​(HttpUriRequest request,
                             ResponseHandler<? extends T> responseHandler,
                             org.apache.http.protocol.HttpContext context)
                      throws java.io.IOException
        Deprecated.
        Description copied from interface: HttpClient
        Executes HTTP request using the given context and processes the response using the given response handler.

        Implementing classes are required to ensure that the content entity associated with the response is fully consumed and the underlying connection is released back to the connection manager automatically in all cases relieving individual ResponseHandlers from having to manage resource deallocation internally.

        Specified by:
        execute in interface HttpClient
        Parameters:
        request - the request to execute
        responseHandler - the response handler
        context - the context to use for the execution, or null to use the default context
        Returns:
        the response object as generated by the response handler.
        Throws:
        java.io.IOException - in case of a problem or the connection was aborted
        ClientProtocolException - in case of an http protocol error
      • handleAndConsume

        private <T> T handleAndConsume​(ResponseHandler<? extends T> responseHandler,
                                       org.apache.http.HttpResponse response)
                                throws java.lang.Error,
                                       java.io.IOException
        Deprecated.
        Throws:
        java.lang.Error
        java.io.IOException
      • getParams

        public org.apache.http.params.HttpParams getParams()
        Deprecated.
        Description copied from interface: HttpClient
        Obtains the parameters for this client. These parameters will become defaults for all requests being executed with this client, and for the parameters of dependent objects in this client.
        Specified by:
        getParams in interface HttpClient
        Returns:
        the default parameters
      • execute

        public org.apache.http.HttpResponse execute​(org.apache.http.HttpHost target,
                                                    org.apache.http.HttpRequest originalRequest,
                                                    org.apache.http.protocol.HttpContext context)
                                             throws java.io.IOException
        Deprecated.
        Description copied from interface: HttpClient
        Executes HTTP request using the given context.
        Specified by:
        execute in interface HttpClient
        Parameters:
        target - the target host for the request. Implementations may accept null if they can still determine a route, for example to a default target or by inspecting the request.
        originalRequest - the request to execute
        context - the context to use for the execution, or null to use the default context
        Returns:
        the response to the request. This is always a final response, never an intermediate response with an 1xx status code. Whether redirects or authentication challenges will be returned or handled automatically depends on the implementation and configuration of this client.
        Throws:
        java.io.IOException - in case of a problem or the connection was aborted
        ClientProtocolException - in case of an http protocol error
      • handleCacheMiss

        private org.apache.http.HttpResponse handleCacheMiss​(org.apache.http.HttpHost target,
                                                             HttpRequestWrapper request,
                                                             org.apache.http.protocol.HttpContext context)
                                                      throws java.io.IOException
        Deprecated.
        Throws:
        java.io.IOException
      • getFatallyNoncompliantResponse

        private org.apache.http.HttpResponse getFatallyNoncompliantResponse​(HttpRequestWrapper request,
                                                                            org.apache.http.protocol.HttpContext context)
        Deprecated.
      • getExistingCacheVariants

        private java.util.Map<java.lang.String,​Variant> getExistingCacheVariants​(org.apache.http.HttpHost target,
                                                                                       HttpRequestWrapper request)
        Deprecated.
      • recordCacheMiss

        private void recordCacheMiss​(org.apache.http.HttpHost target,
                                     HttpRequestWrapper request)
        Deprecated.
      • recordCacheHit

        private void recordCacheHit​(org.apache.http.HttpHost target,
                                    HttpRequestWrapper request)
        Deprecated.
      • recordCacheUpdate

        private void recordCacheUpdate​(org.apache.http.protocol.HttpContext context)
        Deprecated.
      • flushEntriesInvalidatedByRequest

        private void flushEntriesInvalidatedByRequest​(org.apache.http.HttpHost target,
                                                      HttpRequestWrapper request)
        Deprecated.
      • generateCachedResponse

        private org.apache.http.HttpResponse generateCachedResponse​(HttpRequestWrapper request,
                                                                    org.apache.http.protocol.HttpContext context,
                                                                    HttpCacheEntry entry,
                                                                    java.util.Date now)
        Deprecated.
      • handleRevalidationFailure

        private org.apache.http.HttpResponse handleRevalidationFailure​(HttpRequestWrapper request,
                                                                       org.apache.http.protocol.HttpContext context,
                                                                       HttpCacheEntry entry,
                                                                       java.util.Date now)
        Deprecated.
      • generateGatewayTimeout

        private org.apache.http.HttpResponse generateGatewayTimeout​(org.apache.http.protocol.HttpContext context)
        Deprecated.
      • unvalidatedCacheHit

        private org.apache.http.HttpResponse unvalidatedCacheHit​(HttpRequestWrapper request,
                                                                 org.apache.http.protocol.HttpContext context,
                                                                 HttpCacheEntry entry)
        Deprecated.
      • mayCallBackend

        private boolean mayCallBackend​(HttpRequestWrapper request)
        Deprecated.
      • generateViaHeader

        private java.lang.String generateViaHeader​(org.apache.http.HttpMessage msg)
        Deprecated.
      • setResponseStatus

        private void setResponseStatus​(org.apache.http.protocol.HttpContext context,
                                       CacheResponseStatus value)
        Deprecated.
      • supportsRangeAndContentRangeHeaders

        public boolean supportsRangeAndContentRangeHeaders()
        Deprecated.
        Reports whether this CachingHttpClient implementation supports byte-range requests as specified by the Range and Content-Range headers.
        Returns:
        true if byte-range requests are supported
      • isSharedCache

        public boolean isSharedCache()
        Deprecated.
        Reports whether this CachingHttpClient is configured as a shared (public) or non-shared (private) cache. See CacheConfig.setSharedCache(boolean).
        Returns:
        true if we are behaving as a shared (public) cache
      • getCurrentDate

        java.util.Date getCurrentDate()
        Deprecated.
      • clientRequestsOurOptions

        boolean clientRequestsOurOptions​(org.apache.http.HttpRequest request)
        Deprecated.
      • callBackend

        org.apache.http.HttpResponse callBackend​(org.apache.http.HttpHost target,
                                                 HttpRequestWrapper request,
                                                 org.apache.http.protocol.HttpContext context)
                                          throws java.io.IOException
        Deprecated.
        Throws:
        java.io.IOException
      • revalidationResponseIsTooOld

        private boolean revalidationResponseIsTooOld​(org.apache.http.HttpResponse backendResponse,
                                                     HttpCacheEntry cacheEntry)
        Deprecated.
      • negotiateResponseFromVariants

        org.apache.http.HttpResponse negotiateResponseFromVariants​(org.apache.http.HttpHost target,
                                                                   HttpRequestWrapper request,
                                                                   org.apache.http.protocol.HttpContext context,
                                                                   java.util.Map<java.lang.String,​Variant> variants)
                                                            throws java.io.IOException
        Deprecated.
        Throws:
        java.io.IOException
      • retryRequestUnconditionally

        private org.apache.http.HttpResponse retryRequestUnconditionally​(org.apache.http.HttpHost target,
                                                                         HttpRequestWrapper request,
                                                                         org.apache.http.protocol.HttpContext context,
                                                                         HttpCacheEntry matchedEntry)
                                                                  throws java.io.IOException
        Deprecated.
        Throws:
        java.io.IOException
      • getUpdatedVariantEntry

        private HttpCacheEntry getUpdatedVariantEntry​(org.apache.http.HttpHost target,
                                                      HttpRequestWrapper conditionalRequest,
                                                      java.util.Date requestDate,
                                                      java.util.Date responseDate,
                                                      org.apache.http.HttpResponse backendResponse,
                                                      Variant matchingVariant,
                                                      HttpCacheEntry matchedEntry)
        Deprecated.
      • tryToUpdateVariantMap

        private void tryToUpdateVariantMap​(org.apache.http.HttpHost target,
                                           HttpRequestWrapper request,
                                           Variant matchingVariant)
        Deprecated.
      • revalidateCacheEntry

        org.apache.http.HttpResponse revalidateCacheEntry​(org.apache.http.HttpHost target,
                                                          HttpRequestWrapper request,
                                                          org.apache.http.protocol.HttpContext context,
                                                          HttpCacheEntry cacheEntry)
                                                   throws java.io.IOException,
                                                          org.apache.http.ProtocolException
        Deprecated.
        Throws:
        java.io.IOException
        org.apache.http.ProtocolException
      • staleIfErrorAppliesTo

        private boolean staleIfErrorAppliesTo​(int statusCode)
        Deprecated.
      • handleBackendResponse

        org.apache.http.HttpResponse handleBackendResponse​(org.apache.http.HttpHost target,
                                                           HttpRequestWrapper request,
                                                           java.util.Date requestDate,
                                                           java.util.Date responseDate,
                                                           org.apache.http.HttpResponse backendResponse)
                                                    throws java.io.IOException
        Deprecated.
        Throws:
        java.io.IOException
      • storeRequestIfModifiedSinceFor304Response

        private void storeRequestIfModifiedSinceFor304Response​(org.apache.http.HttpRequest request,
                                                               org.apache.http.HttpResponse backendResponse)
        Deprecated.
        For 304 Not modified responses, adds a "Last-Modified" header with the value of the "If-Modified-Since" header passed in the request. This header is required to be able to reuse match the cache entry for subsequent requests but as defined in http specifications it is not included in 304 responses by backend servers. This header will not be included in the resulting response.
      • alreadyHaveNewerCacheEntry

        private boolean alreadyHaveNewerCacheEntry​(org.apache.http.HttpHost target,
                                                   org.apache.http.HttpRequest request,
                                                   org.apache.http.HttpResponse backendResponse)
        Deprecated.