Java 类org.apache.http.client.cache.HttpCacheEntry 实例源码

项目:purecloud-iot    文件:TestMemcachedCacheEntryImpl.java   
private void assertEquivalent(final HttpCacheEntry entry,
        final HttpCacheEntry resultEntry) throws IOException {
    /* Ugh. Implementing HttpCacheEntry#equals is problematic
     * due to the Resource response body (may cause unexpected
     * I/O to users). Checking that two entries
     * serialize to the same bytes seems simpler, on the whole,
     * (while still making for a somewhat yucky test). At
     * least we encapsulate it off here in its own method so
     * the test that uses it remains clear.
     */
    final DefaultHttpCacheEntrySerializer ser = new DefaultHttpCacheEntrySerializer();
    final ByteArrayOutputStream bos1 = new ByteArrayOutputStream();
    ser.writeTo(entry, bos1);
    final byte[] bytes1 = bos1.toByteArray();
    final ByteArrayOutputStream bos2 = new ByteArrayOutputStream();
    ser.writeTo(resultEntry, bos2);
    final byte[] bytes2 = bos2.toByteArray();
    assertEquals(bytes1.length, bytes2.length);
    for(int i = 0; i < bytes1.length; i++) {
        assertEquals(bytes1[i], bytes2[i]);
    }
}
项目:purecloud-iot    文件:CachingHttpClient.java   
private boolean revalidationResponseIsTooOld(final HttpResponse backendResponse,
        final HttpCacheEntry cacheEntry) {
    final Header entryDateHeader = cacheEntry.getFirstHeader(HTTP.DATE_HEADER);
    final Header responseDateHeader = backendResponse.getFirstHeader(HTTP.DATE_HEADER);
    if (entryDateHeader != null && responseDateHeader != null) {
        try {
            final Date entryDate = DateUtils.parseDate(entryDateHeader.getValue());
            final Date respDate = DateUtils.parseDate(responseDateHeader.getValue());
            if (respDate.before(entryDate)) {
                return true;
            }
        } catch (final DateParseException e) {
            // either backend response or cached entry did not have a valid
            // Date header, so we can't tell if they are out of order
            // according to the origin clock; thus we can skip the
            // unconditional retry recommended in 13.2.6 of RFC 2616.
        }
    }
    return false;
}
项目:purecloud-iot    文件:AsynchronousValidationRequest.java   
/**
 * Used internally by {@link AsynchronousValidator} to schedule a
 * revalidation.
 * @param request
 * @param context
 * @param cacheEntry
 * @param identifier
 * @param consecutiveFailedAttempts
 */
AsynchronousValidationRequest(
        final AsynchronousValidator parent,
        final CachingExec cachingExec,
        final HttpRoute route,
        final HttpRequestWrapper request,
        final HttpClientContext context,
        final HttpExecutionAware execAware,
        final HttpCacheEntry cacheEntry,
        final String identifier,
        final int consecutiveFailedAttempts) {
    this.parent = parent;
    this.cachingExec = cachingExec;
    this.route = route;
    this.request = request;
    this.context = context;
    this.execAware = execAware;
    this.cacheEntry = cacheEntry;
    this.identifier = identifier;
    this.consecutiveFailedAttempts = consecutiveFailedAttempts;
}
项目:purecloud-iot    文件:TestCacheValidityPolicy.java   
@Test
public void testResponseIsNotFreshIfFreshnessLifetimeEqualsCurrentAge() {
    final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry();
    impl = new CacheValidityPolicy() {
        @Override
        public long getCurrentAgeSecs(final HttpCacheEntry e, final Date d) {
            assertEquals(now, d);
            assertSame(entry, e);
            return 6;
        }
        @Override
        public long getFreshnessLifetimeSecs(final HttpCacheEntry e) {
            assertSame(entry, e);
            return 6;
        }
    };
    assertFalse(impl.isResponseFresh(entry, now));
}
项目:purecloud-iot    文件:CachingHttpClient.java   
/**
 * Schedules an asynchronous revalidation
 *
 * @param target
 * @param request
 * @param context
 * @param entry
 */
public synchronized void revalidateCacheEntry(final HttpHost target,
        final HttpRequestWrapper request, final HttpContext context, final HttpCacheEntry entry) {
    // getVariantURI will fall back on getURI if no variants exist
    final String uri = cacheKeyGenerator.getVariantURI(target, request, entry);

    if (!queued.contains(uri)) {
        final AsynchronousValidationRequest revalidationRequest =
            new AsynchronousValidationRequest(this, cachingClient, target,
                    request, context, entry, uri);

        try {
            executor.execute(revalidationRequest);
            queued.add(uri);
        } catch (final RejectedExecutionException ree) {
            log.debug("Revalidation for [" + uri + "] not scheduled: " + ree);
        }
    }
}
项目:purecloud-iot    文件:CachingExec.java   
private CloseableHttpResponse revalidateCacheEntry(
        final HttpRoute route,
        final HttpRequestWrapper request,
        final HttpClientContext context,
        final HttpExecutionAware execAware,
        final HttpCacheEntry entry,
        final Date now) throws HttpException {

    try {
        if (asynchRevalidator != null
            && !staleResponseNotAllowed(request, entry, now)
            && validityPolicy.mayReturnStaleWhileRevalidating(entry, now)) {
            log.trace("Serving stale with asynchronous revalidation");
            final CloseableHttpResponse resp = generateCachedResponse(request, context, entry, now);
            asynchRevalidator.revalidateCacheEntry(this, route, request, context, execAware, entry);
            return resp;
        }
        return revalidateCacheEntry(route, request, context, execAware, entry);
    } catch (final IOException ioex) {
        return handleRevalidationFailure(request, context, entry, now);
    }
}
项目:purecloud-iot    文件:CachingExec.java   
private boolean explicitFreshnessRequest(
        final HttpRequestWrapper request,
        final HttpCacheEntry entry,
        final Date now) {
    for(final Header h : request.getHeaders(HeaderConstants.CACHE_CONTROL)) {
        for(final HeaderElement elt : h.getElements()) {
            if (HeaderConstants.CACHE_CONTROL_MAX_STALE.equals(elt.getName())) {
                try {
                    final int maxstale = Integer.parseInt(elt.getValue());
                    final long age = validityPolicy.getCurrentAgeSecs(entry, now);
                    final long lifetime = validityPolicy.getFreshnessLifetimeSecs(entry);
                    if (age - lifetime > maxstale) {
                        return true;
                    }
                } catch (final NumberFormatException nfe) {
                    return true;
                }
            } else if (HeaderConstants.CACHE_CONTROL_MIN_FRESH.equals(elt.getName())
                        || HeaderConstants.CACHE_CONTROL_MAX_AGE.equals(elt.getName())) {
                return true;
            }
        }
    }
    return false;
}
项目:purecloud-iot    文件:CachingExec.java   
private boolean revalidationResponseIsTooOld(final HttpResponse backendResponse,
        final HttpCacheEntry cacheEntry) {
    final Header entryDateHeader = cacheEntry.getFirstHeader(HTTP.DATE_HEADER);
    final Header responseDateHeader = backendResponse.getFirstHeader(HTTP.DATE_HEADER);
    if (entryDateHeader != null && responseDateHeader != null) {
        final Date entryDate = DateUtils.parseDate(entryDateHeader.getValue());
        final Date respDate = DateUtils.parseDate(responseDateHeader.getValue());
        if (entryDate == null || respDate == null) {
            // either backend response or cached entry did not have a valid
            // Date header, so we can't tell if they are out of order
            // according to the origin clock; thus we can skip the
            // unconditional retry recommended in 13.2.6 of RFC 2616.
            return false;
        }
        if (respDate.before(entryDate)) {
            return true;
        }
    }
    return false;
}
项目:purecloud-iot    文件:TestCacheEntryUpdater.java   
@Test
public void testHeadersAreMergedCorrectly() throws IOException {
    final Header[] headers = {
            new BasicHeader("Date", DateUtils.formatDate(responseDate)),
            new BasicHeader("ETag", "\"etag\"")};
    entry = HttpTestUtils.makeCacheEntry(headers);
    response.setHeaders(new Header[]{});

    final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
            new Date(), new Date(), response);


    final Header[] updatedHeaders = updatedEntry.getAllHeaders();
    assertEquals(2, updatedHeaders.length);
    headersContain(updatedHeaders, "Date", DateUtils.formatDate(responseDate));
    headersContain(updatedHeaders, "ETag", "\"etag\"");
}
项目:purecloud-iot    文件:TestCacheInvalidator.java   
@Test
public void flushesEntryIfFresherAndSpecifiedByNonCanonicalContentLocation()
        throws Exception {
    response.setHeader("ETag","\"new-etag\"");
    response.setHeader("Date", DateUtils.formatDate(now));
    final String cacheKey = "http://foo.example.com:80/bar";
    response.setHeader("Content-Location", "http://foo.example.com/bar");

    final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(new Header[] {
       new BasicHeader("Date", DateUtils.formatDate(tenSecondsAgo)),
       new BasicHeader("ETag", "\"old-etag\"")
    });

    when(mockStorage.getEntry(cacheKey)).thenReturn(entry);

    impl.flushInvalidatedCacheEntries(host, request, response);

    verify(mockStorage).getEntry(cacheKey);
    verify(mockStorage).removeEntry(cacheKey);
}
项目:purecloud-iot    文件:CacheValidityPolicy.java   
public boolean mayReturnStaleWhileRevalidating(final HttpCacheEntry entry, final Date now) {
    for (final Header h : entry.getHeaders(HeaderConstants.CACHE_CONTROL)) {
        for(final HeaderElement elt : h.getElements()) {
            if (HeaderConstants.STALE_WHILE_REVALIDATE.equalsIgnoreCase(elt.getName())) {
                try {
                    final int allowedStalenessLifetime = Integer.parseInt(elt.getValue());
                    if (getStalenessSecs(entry, now) <= allowedStalenessLifetime) {
                        return true;
                    }
                } catch (final NumberFormatException nfe) {
                    // skip malformed directive
                }
            }
        }
    }

    return false;
}
项目:purecloud-iot    文件:TestMemcachedHttpCacheStorage.java   
@Test
public void testTreatsNullFromMemcachedAsCacheMiss() throws UnsupportedEncodingException,
        IOException {
    final String url = "foo";
    final String key = "key";

    when(mockKeyHashingScheme.hash(url)).thenReturn(key);
    when(mockMemcachedClient.get(key)).thenReturn(null);

    final HttpCacheEntry resultingEntry = impl.getEntry(url);

    verify(mockKeyHashingScheme).hash(url);
    verify(mockMemcachedClient).get(key);

    assertNull(resultingEntry);
}
项目:purecloud-iot    文件:TestMemcachedHttpCacheStorage.java   
@Test
public void testSuccessfulCachePut() throws IOException {
    final String url = "foo";
    final String key = "key";
    final HttpCacheEntry value = HttpTestUtils.makeCacheEntry();
    final byte[] serialized = HttpTestUtils.getRandomBytes(128);

    when(mockMemcachedCacheEntryFactory.getMemcachedCacheEntry(url, value))
        .thenReturn(mockMemcachedCacheEntry);
    when(mockMemcachedCacheEntry.toByteArray())
        .thenReturn(serialized);
    when(mockKeyHashingScheme.hash(url))
        .thenReturn(key);
    when(mockMemcachedClient.set(key, 0, serialized))
        .thenReturn(null);

    impl.putEntry(url, value);
    verify(mockMemcachedCacheEntryFactory).getMemcachedCacheEntry(url, value);
    verify(mockMemcachedCacheEntry).toByteArray();
    verify(mockKeyHashingScheme).hash(url);
    verify(mockMemcachedClient).set(key, 0, serialized);
}
项目:purecloud-iot    文件:TestBasicHttpCache.java   
@Test
public void testGetCacheEntryReturnsVariantIfPresentInCache() throws Exception {
    final HttpHost host = new HttpHost("foo.example.com");
    final HttpRequest request = new HttpGet("http://foo.example.com/bar");
    request.setHeader("Accept-Encoding","gzip");

    final HttpRequest origRequest = new HttpGet("http://foo.example.com/bar");
    origRequest.setHeader("Accept-Encoding","gzip");

    final HttpResponse origResponse = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
    origResponse.setEntity(HttpTestUtils.makeBody(128));
    origResponse.setHeader("Date", DateUtils.formatDate(new Date()));
    origResponse.setHeader("Cache-Control", "max-age=3600, public");
    origResponse.setHeader("ETag", "\"etag\"");
    origResponse.setHeader("Vary", "Accept-Encoding");
    origResponse.setHeader("Content-Encoding","gzip");

    impl.cacheAndReturnResponse(host, origRequest, origResponse, new Date(), new Date());
    final HttpCacheEntry result = impl.getCacheEntry(host, request);
    assertNotNull(result);
}
项目:purecloud-iot    文件:TestEhcacheHttpCacheStorage.java   
@Test
public void testCacheGet() throws IOException {
    final String key = "foo";
    final HttpCacheEntry cachedValue = HttpTestUtils.makeCacheEntry();

    final Element element = new Element(key, new byte[]{});

    when(mockCache.get(key))
            .thenReturn(element);
    when(mockSerializer.readFrom(isA(InputStream.class)))
            .thenReturn(cachedValue);

    final HttpCacheEntry resultingEntry = impl.getEntry(key);

    verify(mockCache).get(key);
    verify(mockSerializer).readFrom(isA(InputStream.class));

    assertSame(cachedValue, resultingEntry);
}
项目:purecloud-iot    文件:TestCacheInvalidator.java   
@Test
public void doesNotFlushEntrySpecifiedByContentLocationIfOlder()
        throws Exception {
    response.setHeader("ETag","\"new-etag\"");
    response.setHeader("Date", DateUtils.formatDate(tenSecondsAgo));
    final String theURI = "http://foo.example.com:80/bar";
    response.setHeader("Content-Location", theURI);

    final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(new Header[] {
       new BasicHeader("Date", DateUtils.formatDate(now)),
       new BasicHeader("ETag", "\"old-etag\"")
    });

    when(mockStorage.getEntry(theURI)).thenReturn(entry);

    impl.flushInvalidatedCacheEntries(host, request, response);

    verify(mockStorage).getEntry(theURI);
    verifyNoMoreInteractions(mockStorage);
}
项目:purecloud-iot    文件:TestBasicHttpCache.java   
@Test
public void testFlushContentLocationEntryIfUnSafeRequest()
        throws Exception {
    final HttpHost host = new HttpHost("foo.example.com");
    final HttpRequest req = new HttpPost("/foo");
    final HttpResponse resp = HttpTestUtils.make200Response();
    resp.setHeader("Content-Location", "/bar");
    resp.setHeader(HeaderConstants.ETAG, "\"etag\"");
    final String key = (new CacheKeyGenerator()).getURI(host, new HttpGet("/bar"));

    final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(new Header[] {
       new BasicHeader("Date", DateUtils.formatDate(new Date())),
       new BasicHeader("ETag", "\"old-etag\"")
    });

    backing.map.put(key, entry);

    impl.flushInvalidatedCacheEntriesFor(host, req, resp);

    assertNull(backing.map.get(key));
}
项目:purecloud-iot    文件:TestMemcachedHttpCacheStorage.java   
@Test
public void testCachePutThrowsIOExceptionIfCannotSerializeEntry() {
    final String url = "foo";
    final String key = "key";
    final HttpCacheEntry value = HttpTestUtils.makeCacheEntry();

    when(mockMemcachedCacheEntryFactory.getMemcachedCacheEntry(url, value))
        .thenReturn(mockMemcachedCacheEntry);
    when(mockMemcachedCacheEntry.toByteArray())
        .thenThrow(new MemcachedSerializationException(new Exception()));

    try {
        impl.putEntry(url, value);
        fail("should have thrown exception");
    } catch (final IOException expected) {

    }

    verify(mockMemcachedCacheEntryFactory).getMemcachedCacheEntry(url, value);
    verify(mockMemcachedCacheEntry).toByteArray();
}
项目:purecloud-iot    文件:BasicHttpCache.java   
HttpCacheEntry doGetUpdatedParentEntry(
        final String requestId,
        final HttpCacheEntry existing,
        final HttpCacheEntry entry,
        final String variantKey,
        final String variantCacheKey) throws IOException {
    HttpCacheEntry src = existing;
    if (src == null) {
        src = entry;
    }

    Resource resource = null;
    if (src.getResource() != null) {
        resource = resourceFactory.copy(requestId, src.getResource());
    }
    final Map<String,String> variantMap = new HashMap<String,String>(src.getVariantMap());
    variantMap.put(variantKey, variantCacheKey);
    return new HttpCacheEntry(
            src.getRequestDate(),
            src.getResponseDate(),
            src.getStatusLine(),
            src.getAllHeaders(),
            resource,
            variantMap,
            src.getRequestMethod());
}
项目:purecloud-iot    文件:TestMemcachedHttpCacheStorage.java   
@Test
public void testCachePutFailsSilentlyWhenWeCannotHashAKey() throws IOException {
    final String url = "foo";
    final HttpCacheEntry value = HttpTestUtils.makeCacheEntry();
    final byte[] serialized = HttpTestUtils.getRandomBytes(128);

    when(mockMemcachedCacheEntryFactory.getMemcachedCacheEntry(url, value))
        .thenReturn(mockMemcachedCacheEntry);
    when(mockMemcachedCacheEntry.toByteArray())
        .thenReturn(serialized);
    when(mockKeyHashingScheme.hash(url))
        .thenThrow(new MemcachedKeyHashingException(new Exception()));

    impl.putEntry(url, value);

    verify(mockMemcachedCacheEntryFactory).getMemcachedCacheEntry(url, value);
    verify(mockMemcachedCacheEntry).toByteArray();
    verify(mockKeyHashingScheme).hash(url);
}
项目:purecloud-iot    文件:TestMemcachedHttpCacheStorage.java   
@Test
public void testSuccessfulCacheGet() throws UnsupportedEncodingException,
        IOException {
    final String url = "foo";
    final String key = "key";
    final byte[] serialized = HttpTestUtils.getRandomBytes(128);
    final HttpCacheEntry cacheEntry = HttpTestUtils.makeCacheEntry();

    when(mockKeyHashingScheme.hash(url)).thenReturn(key);
    when(mockMemcachedClient.get(key)).thenReturn(serialized);
    when(mockMemcachedCacheEntryFactory.getUnsetCacheEntry())
        .thenReturn(mockMemcachedCacheEntry);
    when(mockMemcachedCacheEntry.getStorageKey()).thenReturn(url);
    when(mockMemcachedCacheEntry.getHttpCacheEntry()).thenReturn(cacheEntry);

    final HttpCacheEntry resultingEntry = impl.getEntry(url);

    verify(mockKeyHashingScheme).hash(url);
    verify(mockMemcachedClient).get(key);
    verify(mockMemcachedCacheEntryFactory).getUnsetCacheEntry();
    verify(mockMemcachedCacheEntry).set(serialized);
    verify(mockMemcachedCacheEntry).getStorageKey();
    verify(mockMemcachedCacheEntry).getHttpCacheEntry();

    assertSame(cacheEntry, resultingEntry);
}
项目:purecloud-iot    文件:TestHttpCacheEntrySerializers.java   
private HttpCacheEntry makeCacheEntryWithVariantMap() {
    final Header[] headers = new Header[5];
    for (int i = 0; i < headers.length; i++) {
        headers[i] = new BasicHeader("header" + i, "value" + i);
    }
    final String body = "Lorem ipsum dolor sit amet";

    final ProtocolVersion pvObj = new ProtocolVersion("HTTP", 1, 1);
    final StatusLine slObj = new BasicStatusLine(pvObj, 200, "ok");
    final Map<String,String> variantMap = new HashMap<String,String>();
    variantMap.put("test variant 1","true");
    variantMap.put("test variant 2","true");
    final HttpCacheEntry cacheEntry = new HttpCacheEntry(new Date(), new Date(),
            slObj, headers, new HeapResource(Base64.decodeBase64(body
                    .getBytes(UTF8))), variantMap, HeaderConstants.GET_METHOD);

    return cacheEntry;
}
项目:purecloud-iot    文件:TestCacheInvalidator.java   
@Test
public void flushesEntrySpecifiedByContentLocationIfResponseHasNoDate()
        throws Exception {
    response.setHeader("ETag", "\"new-etag\"");
    response.removeHeaders("Date");
    final String theURI = "http://foo.example.com:80/bar";
    response.setHeader("Content-Location", theURI);

    final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(new Header[] {
            new BasicHeader("ETag", "\"old-etag\""),
            new BasicHeader("Date", DateUtils.formatDate(tenSecondsAgo)),
    });

    when(mockStorage.getEntry(theURI)).thenReturn(entry);

    impl.flushInvalidatedCacheEntries(host, request, response);

    verify(mockStorage).getEntry(theURI);
    verify(mockStorage).removeEntry(theURI);
    verifyNoMoreInteractions(mockStorage);
}
项目:purecloud-iot    文件:TestBasicHttpCache.java   
@Test
public void testDoNotFlushContentLocationEntryIfSafeRequest()
        throws Exception {
    final HttpHost host = new HttpHost("foo.example.com");
    final HttpRequest req = new HttpGet("/foo");
    final HttpResponse resp = HttpTestUtils.make200Response();
    resp.setHeader("Content-Location", "/bar");
    final String key = (new CacheKeyGenerator()).getURI(host, new HttpGet("/bar"));

    final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(new Header[] {
       new BasicHeader("Date", DateUtils.formatDate(new Date())),
       new BasicHeader("ETag", "\"old-etag\"")
    });

    backing.map.put(key, entry);

    impl.flushInvalidatedCacheEntriesFor(host, req, resp);

    assertEquals(entry, backing.map.get(key));
}
项目:purecloud-iot    文件:CachedResponseSuitabilityChecker.java   
/**
 * Check entry against If-None-Match
 * @param request The current httpRequest being made
 * @param entry the cache entry
 * @return boolean does the etag validator match
 */
private boolean etagValidatorMatches(final HttpRequest request, final HttpCacheEntry entry) {
    final Header etagHeader = entry.getFirstHeader(HeaderConstants.ETAG);
    final String etag = (etagHeader != null) ? etagHeader.getValue() : null;
    final Header[] ifNoneMatch = request.getHeaders(HeaderConstants.IF_NONE_MATCH);
    if (ifNoneMatch != null) {
        for (final Header h : ifNoneMatch) {
            for (final HeaderElement elt : h.getElements()) {
                final String reqEtag = elt.toString();
                if (("*".equals(reqEtag) && etag != null)
                        || reqEtag.equals(etag)) {
                    return true;
                }
            }
        }
    }
    return false;
}
项目:purecloud-iot    文件:AsynchronousValidator.java   
/**
 * Schedules an asynchronous revalidation
 */
public synchronized void revalidateCacheEntry(
        final CachingExec cachingExec,
        final HttpRoute route,
        final HttpRequestWrapper request,
        final HttpClientContext context,
        final HttpExecutionAware execAware,
        final HttpCacheEntry entry) {
    // getVariantURI will fall back on getURI if no variants exist
    final String uri = cacheKeyGenerator.getVariantURI(context.getTargetHost(), request, entry);

    if (!queued.contains(uri)) {
        final int consecutiveFailedAttempts = failureCache.getErrorCount(uri);
        final AsynchronousValidationRequest revalidationRequest =
            new AsynchronousValidationRequest(
                    this, cachingExec, route, request, context, execAware, entry, uri, consecutiveFailedAttempts);

        try {
            schedulingStrategy.schedule(revalidationRequest);
            queued.add(uri);
        } catch (final RejectedExecutionException ree) {
            log.debug("Revalidation for [" + uri + "] not scheduled: " + ree);
        }
    }
}
项目:purecloud-iot    文件:CacheEntryUpdater.java   
protected Header[] mergeHeaders(final HttpCacheEntry entry, final HttpResponse response) {

        if (entryAndResponseHaveDateHeader(entry, response)
                && entryDateHeaderNewerThenResponse(entry, response)) {
            // Don't merge headers, keep the entry's headers as they are newer.
            return entry.getAllHeaders();
        }

        final List<Header> cacheEntryHeaderList = new ArrayList<Header>(Arrays.asList(entry
                .getAllHeaders()));
        removeCacheHeadersThatMatchResponse(cacheEntryHeaderList, response);
        removeCacheEntry1xxWarnings(cacheEntryHeaderList, entry);
        cacheEntryHeaderList.addAll(Arrays.asList(response.getAllHeaders()));

        return cacheEntryHeaderList.toArray(new Header[cacheEntryHeaderList.size()]);
    }
项目:purecloud-iot    文件:CacheEntryUpdater.java   
/**
 * Update the entry with the new information from the response.  Should only be used for
 * 304 responses.
 *
 * @param requestId
 * @param entry The cache Entry to be updated
 * @param requestDate When the request was performed
 * @param responseDate When the response was gotten
 * @param response The HttpResponse from the backend server call
 * @return HttpCacheEntry an updated version of the cache entry
 * @throws java.io.IOException if something bad happens while trying to read the body from the original entry
 */
public HttpCacheEntry updateCacheEntry(
        final String requestId,
        final HttpCacheEntry entry,
        final Date requestDate,
        final Date responseDate,
        final HttpResponse response) throws IOException {
    Args.check(response.getStatusLine().getStatusCode() == HttpStatus.SC_NOT_MODIFIED,
            "Response must have 304 status code");
    final Header[] mergedHeaders = mergeHeaders(entry, response);
    Resource resource = null;
    if (entry.getResource() != null) {
        resource = resourceFactory.copy(requestId, entry.getResource());
    }
    return new HttpCacheEntry(
            requestDate,
            responseDate,
            entry.getStatusLine(),
            mergedHeaders,
            resource,
            entry.getRequestMethod());
}
项目:purecloud-iot    文件:CacheEntryUpdater.java   
private void removeCacheEntry1xxWarnings(final List<Header> cacheEntryHeaderList, final HttpCacheEntry entry) {
    final ListIterator<Header> cacheEntryHeaderListIter = cacheEntryHeaderList.listIterator();

    while (cacheEntryHeaderListIter.hasNext()) {
        final String cacheEntryHeaderName = cacheEntryHeaderListIter.next().getName();

        if (HeaderConstants.WARNING.equals(cacheEntryHeaderName)) {
            for (final Header cacheEntryWarning : entry.getHeaders(HeaderConstants.WARNING)) {
                if (cacheEntryWarning.getValue().startsWith("1")) {
                    cacheEntryHeaderListIter.remove();
                }
            }
        }
    }
}
项目:axon-eventstore    文件:FileCacheStorage.java   
private void saveCacheEntry(String url, HttpCacheEntry entry) {
   ObjectOutputStream stream = null;
   try {
      final File cache = getCacheFile(url);
      stream = new ObjectOutputStream(new FileOutputStream(cache));
      stream.writeObject(entry);
      stream.close();
   } catch (final Exception e) {
      LOGGER.error("Faled to save cache entry " + entry, e);
   }
}
项目:purecloud-iot    文件:TestConditionalRequestBuilder.java   
@Test
public void testCacheEntryWithProxyRevalidateDoesEndToEndRevalidation() throws Exception {
    final HttpRequest basicRequest = new BasicHttpRequest("GET","/",HttpVersion.HTTP_1_1);
    final HttpRequestWrapper requestWrapper = HttpRequestWrapper.wrap(basicRequest);
    final Date now = new Date();
    final Date elevenSecondsAgo = new Date(now.getTime() - 11 * 1000L);
    final Date tenSecondsAgo = new Date(now.getTime() - 10 * 1000L);
    final Date nineSecondsAgo = new Date(now.getTime() - 9 * 1000L);

    final Header[] cacheEntryHeaders = new Header[] {
            new BasicHeader("Date", DateUtils.formatDate(tenSecondsAgo)),
            new BasicHeader("ETag", "\"etag\""),
            new BasicHeader("Cache-Control","max-age=5, proxy-revalidate") };
    final HttpCacheEntry cacheEntry = HttpTestUtils.makeCacheEntry(elevenSecondsAgo, nineSecondsAgo, cacheEntryHeaders);

    final HttpRequest result = impl.buildConditionalRequest(requestWrapper, cacheEntry);

    boolean foundMaxAge0 = false;
    for(final Header h : result.getHeaders("Cache-Control")) {
        for(final HeaderElement elt : h.getElements()) {
            if ("max-age".equalsIgnoreCase(elt.getName())
                && "0".equals(elt.getValue())) {
                foundMaxAge0 = true;
            }
        }
    }
    Assert.assertTrue(foundMaxAge0);
}
项目:purecloud-iot    文件:TestCacheValidityPolicy.java   
@Test
public void testMayNotReturnStaleIfErrorInResponseAndAfterResponseWindow(){
    final Header[] headers = new Header[] {
            new BasicHeader("Date", DateUtils.formatDate(tenSecondsAgo)),
            new BasicHeader("Cache-Control", "max-age=5, stale-if-error=1")
    };
    final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
    final HttpRequest req = new BasicHttpRequest("GET","/",HttpVersion.HTTP_1_1);
    assertFalse(impl.mayReturnStaleIfError(req, entry, now));
}
项目:purecloud-iot    文件:CachingHttpClient.java   
private HttpCacheEntry satisfyFromCache(final HttpHost target, final HttpRequestWrapper request) {
    HttpCacheEntry entry = null;
    try {
        entry = responseCache.getCacheEntry(target, request);
    } catch (final IOException ioe) {
        log.warn("Unable to retrieve entries from cache", ioe);
    }
    return entry;
}
项目:purecloud-iot    文件:CachingHttpClient.java   
private HttpResponse generateCachedResponse(final HttpRequestWrapper request,
        final HttpContext context, final HttpCacheEntry entry, final 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(request, entry);
    }
    setResponseStatus(context, CacheResponseStatus.CACHE_HIT);
    if (validityPolicy.getStalenessSecs(entry, now) > 0L) {
        cachedResponse.addHeader(HeaderConstants.WARNING,"110 localhost \"Response is stale\"");
    }
    return cachedResponse;
}
项目:purecloud-iot    文件:CachingHttpClient.java   
private HttpResponse handleRevalidationFailure(final HttpRequestWrapper request,
        final HttpContext context, final HttpCacheEntry entry, final Date now) {
    if (staleResponseNotAllowed(request, entry, now)) {
        return generateGatewayTimeout(context);
    } else {
        return unvalidatedCacheHit(request, context, entry);
    }
}
项目:purecloud-iot    文件:CachingHttpClient.java   
private HttpResponse unvalidatedCacheHit(
        final HttpRequestWrapper request,
        final HttpContext context,
        final HttpCacheEntry entry) {
    final HttpResponse cachedResponse = responseGenerator.generateResponse(request, entry);
    setResponseStatus(context, CacheResponseStatus.CACHE_HIT);
    cachedResponse.addHeader(HeaderConstants.WARNING, "111 localhost \"Revalidation failed\"");
    return cachedResponse;
}
项目:purecloud-iot    文件:CacheInvalidator.java   
private boolean responseDateOlderThanEntryDate(final HttpResponse response,
        final HttpCacheEntry entry) {
    final Header entryDateHeader = entry.getFirstHeader(HTTP.DATE_HEADER);
    final Header responseDateHeader = response.getFirstHeader(HTTP.DATE_HEADER);
    if (entryDateHeader == null || responseDateHeader == null) {
        /* be conservative; should probably flush */
        return false;
    }
    final Date entryDate = DateUtils.parseDate(entryDateHeader.getValue());
    final Date responseDate = DateUtils.parseDate(responseDateHeader.getValue());
    if (entryDate == null || responseDate == null) {
        return false;
    }
    return responseDate.before(entryDate);
}
项目:purecloud-iot    文件:EhcacheHttpCacheStorage.java   
@Override
public synchronized void updateEntry(final String key, final HttpCacheUpdateCallback callback)
        throws IOException, HttpCacheUpdateException {
    int numRetries = 0;
    do{
        final Element oldElement = cache.get(key);

        HttpCacheEntry existingEntry = null;
        if(oldElement != null){
            final byte[] data = (byte[])oldElement.getValue();
            existingEntry = serializer.readFrom(new ByteArrayInputStream(data));
        }

        final HttpCacheEntry updatedEntry = callback.update(existingEntry);

        if (existingEntry == null) {
            putEntry(key, updatedEntry);
            return;
        } else {
            // Attempt to do a CAS replace, if we fail then retry
            // While this operation should work fine within this instance, multiple instances
            //  could trample each others' data
            final ByteArrayOutputStream bos = new ByteArrayOutputStream();
            serializer.writeTo(updatedEntry, bos);
            final Element newElement = new Element(key, bos.toByteArray());
            if (cache.replace(oldElement, newElement)) {
                return;
            }else{
                numRetries++;
            }
        }
    }while(numRetries <= maxUpdateRetries);
    throw new HttpCacheUpdateException("Failed to update");
}
项目:purecloud-iot    文件:EhcacheHttpCacheStorage.java   
@Override
public synchronized HttpCacheEntry getEntry(final String key) throws IOException {
    final Element e = cache.get(key);
    if(e == null){
        return null;
    }

    final byte[] data = (byte[])e.getValue();
    return serializer.readFrom(new ByteArrayInputStream(data));
}
项目:purecloud-iot    文件:TestCacheEntryUpdater.java   
@Test
public void entry1xxWarningsAreRemovedOnUpdate() throws Exception {
    final Header[] headers = {
            new BasicHeader("Warning", "110 fred \"Response is stale\""),
            new BasicHeader("ETag", "\"old\""),
            new BasicHeader("Date", DateUtils.formatDate(eightSecondsAgo))
    };
    entry = HttpTestUtils.makeCacheEntry(tenSecondsAgo, eightSecondsAgo, headers);
    response.setHeader("ETag", "\"new\"");
    response.setHeader("Date", DateUtils.formatDate(twoSecondsAgo));
    final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
            twoSecondsAgo, oneSecondAgo, response);

    assertEquals(0, updated.getHeaders("Warning").length);
}