/** * 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); }
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()]); }
private boolean entryAndResponseHaveDateHeader(HttpCacheEntry entry, HttpResponse response) { if (entry.getFirstHeader(HTTP.DATE_HEADER) != null && response.getFirstHeader(HTTP.DATE_HEADER) != null) { return true; } return false; }
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; }
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(); } } } } }
@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]); } }