コード例 #1
0
 /**
  * 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(
     String requestId,
     HttpCacheEntry entry,
     Date requestDate,
     Date responseDate,
     HttpResponse response)
     throws IOException {
   if (response.getStatusLine().getStatusCode() != HttpStatus.SC_NOT_MODIFIED)
     throw new IllegalArgumentException("Response must have 304 status code");
   Header[] mergedHeaders = mergeHeaders(entry, response);
   Resource resource = resourceFactory.copy(requestId, entry.getResource());
   return new HttpCacheEntry(
       requestDate, responseDate, entry.getStatusLine(), mergedHeaders, resource);
 }
コード例 #2
0
  protected Header[] mergeHeaders(HttpCacheEntry entry, 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();
    }

    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()]);
  }
コード例 #3
0
  private boolean entryAndResponseHaveDateHeader(HttpCacheEntry entry, HttpResponse response) {
    if (entry.getFirstHeader(HTTP.DATE_HEADER) != null
        && response.getFirstHeader(HTTP.DATE_HEADER) != null) {
      return true;
    }

    return false;
  }
コード例 #4
0
  private boolean entryDateHeaderNewerThenResponse(HttpCacheEntry entry, HttpResponse response) {
    try {
      Date entryDate = DateUtils.parseDate(entry.getFirstHeader(HTTP.DATE_HEADER).getValue());
      Date responseDate = DateUtils.parseDate(response.getFirstHeader(HTTP.DATE_HEADER).getValue());

      if (!entryDate.after(responseDate)) {
        return false;
      }
    } catch (DateParseException e) {
      return false;
    }

    return true;
  }
コード例 #5
0
  private void removeCacheEntry1xxWarnings(
      List<Header> cacheEntryHeaderList, HttpCacheEntry entry) {
    ListIterator<Header> cacheEntryHeaderListIter = cacheEntryHeaderList.listIterator();

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

      if (HttpConstants.WARNING.equals(cacheEntryHeaderName)) {
        for (Header cacheEntryWarning : entry.getHeaders(HttpConstants.WARNING)) {
          if (cacheEntryWarning.getValue().startsWith("1")) {
            cacheEntryHeaderListIter.remove();
          }
        }
      }
    }
  }
コード例 #6
0
 @Test
 public void testCacheEntry() {
   final String contentType = "contentTyp";
   final String writerContent = "writer";
   final byte[] streamContent = new byte[10];
   final HttpCacheEntry cacheEntry = new HttpCacheEntry(contentType, writerContent, streamContent);
   assertEquals(contentType, cacheEntry.getContentType());
   assertEquals(writerContent, cacheEntry.getWriterContent());
   assertEquals(streamContent.length, cacheEntry.getStreamContent().length);
   assertTrue(streamContent.hashCode() != cacheEntry.getStreamContent().hashCode());
   for (int i = 0; i < streamContent.length; ++i) {
     assertEquals(streamContent[i], cacheEntry.getStreamContent()[i]);
   }
 }