Example usage for org.apache.http.client.cache HeaderConstants ETAG

List of usage examples for org.apache.http.client.cache HeaderConstants ETAG

Introduction

In this page you can find the example usage for org.apache.http.client.cache HeaderConstants ETAG.

Prototype

String ETAG

To view the source code for org.apache.http.client.cache HeaderConstants ETAG.

Click Source Link

Usage

From source file:org.apache.http.impl.client.cache.BasicHttpCache.java

private void addVariantWithEtag(String variantKey, String variantCacheKey, Map<String, Variant> variants)
        throws IOException {
    HttpCacheEntry entry = storage.getEntry(variantCacheKey);
    if (entry == null)
        return;/* w w w.  jav a 2 s  .  c  om*/
    Header etagHeader = entry.getFirstHeader(HeaderConstants.ETAG);
    if (etagHeader == null)
        return;
    variants.put(etagHeader.getValue(), new Variant(variantKey, variantCacheKey, entry));
}

From source file:org.apache.http.impl.client.cache.CachedResponseSuitabilityChecker.java

/**
 * Check entry against If-None-Match/* w  w  w  .j a va2  s. c o m*/
 * @param request
 * @param entry
 * @return
 */
private boolean etagValidtorMatches(HttpRequest request, HttpCacheEntry entry) {
    Header etagHeader = entry.getFirstHeader(HeaderConstants.ETAG);
    String etag = (etagHeader != null) ? etagHeader.getValue() : null;
    Header[] ifNoneMatch = request.getHeaders(HeaderConstants.IF_NONE_MATCH);
    if (ifNoneMatch != null) {
        for (Header h : ifNoneMatch) {
            for (HeaderElement elt : h.getElements()) {
                String reqEtag = elt.toString();
                if (("*".equals(reqEtag) && etag != null) || reqEtag.equals(etag)) {
                    return true;
                }
            }
        }
    }
    return false;
}

From source file:org.apache.http.impl.client.cache.CachingExec.java

CloseableHttpResponse negotiateResponseFromVariants(final HttpRoute route, final HttpRequestWrapper request,
        final HttpClientContext context, final HttpExecutionAware execAware,
        final Map<String, Variant> variants) throws IOException, HttpException {
    final HttpRequestWrapper conditionalRequest = conditionalRequestBuilder
            .buildConditionalRequestFromVariants(request, variants);

    final Date requestDate = getCurrentDate();
    final CloseableHttpResponse backendResponse = backend.execute(route, conditionalRequest, context,
            execAware);//from w w w.  ja  v a  2s.  c om
    try {
        final Date responseDate = getCurrentDate();

        backendResponse.addHeader("Via", generateViaHeader(backendResponse));

        if (backendResponse.getStatusLine().getStatusCode() != HttpStatus.SC_NOT_MODIFIED) {
            return handleBackendResponse(route, request, context, execAware, requestDate, responseDate,
                    backendResponse);
        }

        final Header resultEtagHeader = backendResponse.getFirstHeader(HeaderConstants.ETAG);
        if (resultEtagHeader == null) {
            log.warn("304 response did not contain ETag");
            IOUtils.consume(backendResponse.getEntity());
            backendResponse.close();
            return callBackend(route, request, context, execAware);
        }

        final String resultEtag = resultEtagHeader.getValue();
        final Variant matchingVariant = variants.get(resultEtag);
        if (matchingVariant == null) {
            log.debug("304 response did not contain ETag matching one sent in If-None-Match");
            IOUtils.consume(backendResponse.getEntity());
            backendResponse.close();
            return callBackend(route, request, context, execAware);
        }

        final HttpCacheEntry matchedEntry = matchingVariant.getEntry();

        if (revalidationResponseIsTooOld(backendResponse, matchedEntry)) {
            IOUtils.consume(backendResponse.getEntity());
            backendResponse.close();
            return retryRequestUnconditionally(route, request, context, execAware, matchedEntry);
        }

        recordCacheUpdate(context);

        final HttpCacheEntry responseEntry = getUpdatedVariantEntry(context.getTargetHost(), conditionalRequest,
                requestDate, responseDate, backendResponse, matchingVariant, matchedEntry);
        backendResponse.close();

        final CloseableHttpResponse resp = responseGenerator.generateResponse(responseEntry);
        tryToUpdateVariantMap(context.getTargetHost(), request, matchingVariant);

        if (shouldSendNotModifiedResponse(request, responseEntry)) {
            return responseGenerator.generateNotModifiedResponse(responseEntry);
        }
        return resp;
    } catch (final IOException ex) {
        backendResponse.close();
        throw ex;
    } catch (final RuntimeException ex) {
        backendResponse.close();
        throw ex;
    }
}

From source file:org.apache.http.impl.client.cache.CachingHttpAsyncClient.java

void negotiateResponseFromVariants(final BasicFuture<HttpResponse> future, final HttpHost target,
        final HttpRequestWrapper request, final HttpCacheContext clientContext,
        final Map<String, Variant> variants) {
    final HttpRequest conditionalRequest = this.conditionalRequestBuilder
            .buildConditionalRequestFromVariants(request, variants);

    final Date requestDate = getCurrentDate();

    final ChainedFutureCallback<HttpResponse> chainedFutureCallback = new ChainedFutureCallback<HttpResponse>(
            future) {/*from w  ww.  ja v a  2  s  .co m*/

        @Override
        public void completed(final HttpResponse httpResponse) {
            final Date responseDate = getCurrentDate();

            httpResponse.addHeader(HeaderConstants.VIA, generateViaHeader(httpResponse));

            if (httpResponse.getStatusLine().getStatusCode() != HttpStatus.SC_NOT_MODIFIED) {
                try {
                    future.completed(handleBackendResponse(target, request, requestDate, responseDate,
                            Proxies.enhanceResponse(httpResponse)));
                    return;
                } catch (final IOException e) {
                    future.failed(e);
                    return;
                }
            }

            final Header resultEtagHeader = httpResponse.getFirstHeader(HeaderConstants.ETAG);
            if (resultEtagHeader == null) {
                CachingHttpAsyncClient.this.log.warn("304 response did not contain ETag");
                callBackend(future, target, request, clientContext);
                return;
            }

            final String resultEtag = resultEtagHeader.getValue();
            final Variant matchingVariant = variants.get(resultEtag);
            if (matchingVariant == null) {
                CachingHttpAsyncClient.this.log
                        .debug("304 response did not contain ETag matching one sent in If-None-Match");
                callBackend(future, target, request, clientContext);
            }

            final HttpCacheEntry matchedEntry = matchingVariant.getEntry();

            if (revalidationResponseIsTooOld(httpResponse, matchedEntry)) {
                EntityUtils.consumeQuietly(httpResponse.getEntity());
                retryRequestUnconditionally(future, target, request, clientContext, matchedEntry);
                return;
            }

            recordCacheUpdate(clientContext);

            final HttpCacheEntry responseEntry = getUpdatedVariantEntry(target, conditionalRequest, requestDate,
                    responseDate, httpResponse, matchingVariant, matchedEntry);

            final HttpResponse resp = CachingHttpAsyncClient.this.responseGenerator.generateResponse(request,
                    responseEntry);
            tryToUpdateVariantMap(target, request, matchingVariant);

            if (shouldSendNotModifiedResponse(request, responseEntry)) {
                future.completed(CachingHttpAsyncClient.this.responseGenerator
                        .generateNotModifiedResponse(responseEntry));
                return;
            }

            future.completed(resp);
        }

    };

    this.backend.execute(target, conditionalRequest, clientContext, chainedFutureCallback);
}

From source file:org.apache.http.impl.client.cache.CachingHttpClient.java

HttpResponse negotiateResponseFromVariants(HttpHost target, HttpRequest request, HttpContext context,
        Map<String, Variant> variants) throws IOException {
    HttpRequest conditionalRequest = conditionalRequestBuilder.buildConditionalRequestFromVariants(request,
            variants);//from ww  w. j  a v a 2  s  .c o m

    Date requestDate = getCurrentDate();
    HttpResponse backendResponse = backend.execute(target, conditionalRequest, context);
    Date responseDate = getCurrentDate();

    backendResponse.addHeader("Via", generateViaHeader(backendResponse));

    if (backendResponse.getStatusLine().getStatusCode() != HttpStatus.SC_NOT_MODIFIED) {
        return handleBackendResponse(target, request, requestDate, responseDate, backendResponse);
    }

    Header resultEtagHeader = backendResponse.getFirstHeader(HeaderConstants.ETAG);
    if (resultEtagHeader == null) {
        log.warn("304 response did not contain ETag");
        return callBackend(target, request, context);
    }

    String resultEtag = resultEtagHeader.getValue();
    Variant matchingVariant = variants.get(resultEtag);
    if (matchingVariant == null) {
        log.debug("304 response did not contain ETag matching one sent in If-None-Match");
        return callBackend(target, request, context);
    }

    HttpCacheEntry matchedEntry = matchingVariant.getEntry();

    if (revalidationResponseIsTooOld(backendResponse, matchedEntry)) {
        return retryRequestUnconditionally(target, request, context, matchedEntry);
    }

    recordCacheUpdate(context);

    HttpCacheEntry responseEntry = getUpdatedVariantEntry(target, conditionalRequest, requestDate, responseDate,
            backendResponse, matchingVariant, matchedEntry);

    HttpResponse resp = responseGenerator.generateResponse(responseEntry);
    tryToUpdateVariantMap(target, request, matchingVariant);

    if (shouldSendNotModifiedResponse(request, responseEntry)) {
        return responseGenerator.generateNotModifiedResponse(responseEntry);
    }

    return resp;
}

From source file:org.apache.http.impl.client.cache.ConditionalRequestBuilder.java

/**
 * When a {@link HttpCacheEntry} is stale but 'might' be used as a response
 * to an {@link HttpRequest} we will attempt to revalidate the entry with
 * the origin.  Build the origin {@link HttpRequest} here and return it.
 *
 * @param request the original request from the caller
 * @param cacheEntry the entry that needs to be revalidated
 * @return the wrapped request//from   w ww  .j  av a 2  s .  c  om
 * @throws ProtocolException when I am unable to build a new origin request.
 */
public HttpRequest buildConditionalRequest(HttpRequest request, HttpCacheEntry cacheEntry)
        throws ProtocolException {
    RequestWrapper wrapperRequest = new RequestWrapper(request);
    wrapperRequest.resetHeaders();
    Header eTag = cacheEntry.getFirstHeader(HeaderConstants.ETAG);
    if (eTag != null) {
        wrapperRequest.setHeader(HeaderConstants.IF_NONE_MATCH, eTag.getValue());
    }
    Header lastModified = cacheEntry.getFirstHeader(HeaderConstants.LAST_MODIFIED);
    if (lastModified != null) {
        wrapperRequest.setHeader(HeaderConstants.IF_MODIFIED_SINCE, lastModified.getValue());
    }
    boolean mustRevalidate = false;
    for (Header h : cacheEntry.getHeaders(HeaderConstants.CACHE_CONTROL)) {
        for (HeaderElement elt : h.getElements()) {
            if (HeaderConstants.CACHE_CONTROL_MUST_REVALIDATE.equalsIgnoreCase(elt.getName())
                    || HeaderConstants.CACHE_CONTROL_PROXY_REVALIDATE.equalsIgnoreCase(elt.getName())) {
                mustRevalidate = true;
                break;
            }
        }
    }
    if (mustRevalidate) {
        wrapperRequest.addHeader("Cache-Control", "max-age=0");
    }
    return wrapperRequest;

}