private RequestProtocolError requestContainsNoCacheDirectiveWithFieldName(final HttpRequest request) { final Iterator<HeaderElement> it = MessageSupport.iterate(request, HeaderConstants.CACHE_CONTROL); while (it.hasNext()) { final HeaderElement elt = it.next(); if (HeaderConstants.CACHE_CONTROL_NO_CACHE.equalsIgnoreCase(elt.getName()) && elt.getValue() != null) { return RequestProtocolError.NO_CACHE_DIRECTIVE_WITH_FIELD_NAME; } } return null; } }
private long getMaxStale(final HttpRequest request) { long maxstale = -1; final Iterator<HeaderElement> it = MessageSupport.iterate(request, HeaderConstants.CACHE_CONTROL); while (it.hasNext()) { final HeaderElement elt = it.next(); if (HeaderConstants.CACHE_CONTROL_MAX_STALE.equals(elt.getName())) { if ((elt.getValue() == null || "".equals(elt.getValue().trim())) && maxstale == -1) { maxstale = Long.MAX_VALUE; } else { try { long val = Long.parseLong(elt.getValue()); if (val < 0) { val = 0; } if (maxstale == -1 || val < maxstale) { maxstale = val; } } catch (final NumberFormatException nfe) { // err on the side of preserving semantic transparency maxstale = 0; } } } } return maxstale; }
private boolean mayReturnStaleIfError(final MessageHeaders headers, final String name, final long stalenessSecs) { boolean result = false; final Iterator<HeaderElement> it = MessageSupport.iterate(headers, name); while (it.hasNext()) { final HeaderElement elt = it.next(); if (HeaderConstants.STALE_IF_ERROR.equals(elt.getName())) { try { final int staleIfErrorSecs = Integer.parseInt(elt.getValue()); if (stalenessSecs <= staleIfErrorSecs) { result = true; break; } } catch (final NumberFormatException nfe) { // skip malformed directive } } } return result; }
protected long getMaxAge(final HttpCacheEntry entry) { long maxage = -1; final Iterator<HeaderElement> it = MessageSupport.iterate(entry, HeaderConstants.CACHE_CONTROL); while (it.hasNext()) { final HeaderElement elt = it.next(); if (HeaderConstants.CACHE_CONTROL_MAX_AGE.equals(elt.getName()) || "s-maxage".equals(elt.getName())) { try { final long currMaxAge = Long.parseLong(elt.getValue()); if (maxage == -1 || currMaxAge < maxage) { maxage = currMaxAge; } } catch (final NumberFormatException nfe) { // be conservative if can't parse maxage = 0; } } } return maxage; }
public boolean mayReturnStaleWhileRevalidating(final HttpCacheEntry entry, final Date now) { final Iterator<HeaderElement> it = MessageSupport.iterate(entry, HeaderConstants.CACHE_CONTROL); while (it.hasNext()) { final HeaderElement elt = it.next(); 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; }
boolean explicitFreshnessRequest(final HttpRequest request, final HttpCacheEntry entry, final Date now) { final Iterator<HeaderElement> it = MessageSupport.iterate(request, HeaderConstants.CACHE_CONTROL); while (it.hasNext()) { final HeaderElement elt = it.next(); 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; }
final int maxage = Integer.parseInt(elt.getValue()); if (validityStrategy.getCurrentAgeSecs(entry, now) > maxage) { log.debug("Response from cache was NOT suitable due to max age"); final int maxstale = Integer.parseInt(elt.getValue()); if (validityStrategy.getFreshnessLifetimeSecs(entry) > maxstale) { log.debug("Response from cache was not suitable due to Max stale freshness"); final long minfresh = Long.parseLong(elt.getValue()); if (minfresh < 0L) { return false;
@Test public void testCacheEntryWithProxyRevalidateDoesEndToEndRevalidation() throws Exception { final HttpRequest basicRequest = new BasicHttpRequest("GET", "/"); final HttpRequest requestWrapper = RequestCopier.INSTANCE.copy(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; final Iterator<HeaderElement> it = MessageSupport.iterate(result, HeaderConstants.CACHE_CONTROL); while (it.hasNext()) { final HeaderElement elt = it.next(); if ("max-age".equalsIgnoreCase(elt.getName()) && "0".equals(elt.getValue())) { foundMaxAge0 = true; } } Assert.assertTrue(foundMaxAge0); }
@Test public void testCacheEntryWithMustRevalidateDoesEndToEndRevalidation() throws Exception { final HttpRequest basicRequest = new BasicHttpRequest("GET","/"); final HttpRequest requestWrapper = RequestCopier.INSTANCE.copy(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, must-revalidate") }; final HttpCacheEntry cacheEntry = HttpTestUtils.makeCacheEntry(elevenSecondsAgo, nineSecondsAgo, cacheEntryHeaders); final HttpRequest result = impl.buildConditionalRequest(requestWrapper, cacheEntry); boolean foundMaxAge0 = false; final Iterator<HeaderElement> it = MessageSupport.iterate(result, HeaderConstants.CACHE_CONTROL); while (it.hasNext()) { final HeaderElement elt = it.next(); if ("max-age".equalsIgnoreCase(elt.getName()) && "0".equals(elt.getValue())) { foundMaxAge0 = true; } } Assert.assertTrue(foundMaxAge0); }
@Test public void testDoesNotTransmitNoCacheDirectivesWithFieldsDownstream() throws Exception { request.setHeader("Cache-Control","no-cache=\"X-Field\""); final Capture<ClassicHttpRequest> cap = EasyMock.newCapture(); EasyMock.expect(mockExecChain.proceed( EasyMock.capture(cap), EasyMock.isA(ExecChain.Scope.class))).andReturn(originResponse).times(0,1); replayMocks(); try { execute(request); } catch (final ClientProtocolException acceptable) { } verifyMocks(); if (cap.hasCaptured()) { final ClassicHttpRequest captured = cap.getValue(); final Iterator<HeaderElement> it = MessageSupport.iterate(captured, HttpHeaders.CACHE_CONTROL); while (it.hasNext()) { final HeaderElement elt = it.next(); if ("no-cache".equals(elt.getName())) { Assert.assertNull(elt.getValue()); } } } }
final HeaderElement elt = it.next(); if ("max-age".equalsIgnoreCase(elt.getName()) && "0".equals(elt.getValue())) { foundMaxAge0 = true;
private RequestProtocolError requestContainsNoCacheDirectiveWithFieldName(final HttpRequest request) { final Iterator<HeaderElement> it = MessageSupport.iterate(request, HeaderConstants.CACHE_CONTROL); while (it.hasNext()) { final HeaderElement elt = it.next(); if (HeaderConstants.CACHE_CONTROL_NO_CACHE.equalsIgnoreCase(elt.getName()) && elt.getValue() != null) { return RequestProtocolError.NO_CACHE_DIRECTIVE_WITH_FIELD_NAME; } } return null; } }
@Override HeaderElement parseHeaderElement(final CharSequence buf, final ParserCursor cursor) { final HeaderElement e = this.parser.parseHeaderElement(buf, cursor); if (!(e.getName().isEmpty() && e.getValue() == null)) { return e; } return null; }
@Override HeaderElement parseHeaderElement(final CharSequence buf, final ParserCursor cursor) { final HeaderElement e = this.parser.parseHeaderElement(buf, cursor); if (!(e.getName().isEmpty() && e.getValue() == null)) { return e; } return null; }
if ("max-age".equals(elt.getName())) { try { final int maxage = Integer.parseInt(elt.getValue()); if (maxage == 0) { hasMaxAge0 = true;
public boolean mayReturnStaleWhileRevalidating(final HttpCacheEntry entry, final Date now) { final Iterator<HeaderElement> it = MessageSupport.iterate(entry, HeaderConstants.CACHE_CONTROL); while (it.hasNext()) { final HeaderElement elt = it.next(); 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; }
@Override public HeaderElement[] parseElements(final CharSequence buffer, final ParserCursor cursor) { Args.notNull(buffer, "Char sequence"); Args.notNull(cursor, "Parser cursor"); final List<HeaderElement> elements = new ArrayList<>(); while (!cursor.atEnd()) { final HeaderElement element = parseHeaderElement(buffer, cursor); if (!(element.getName().isEmpty() && element.getValue() == null)) { elements.add(element); } } return elements.toArray(new HeaderElement[elements.size()]); }
@Override public HeaderElement[] parseElements(final CharSequence buffer, final ParserCursor cursor) { Args.notNull(buffer, "Char sequence"); Args.notNull(cursor, "Parser cursor"); final List<HeaderElement> elements = new ArrayList<>(); while (!cursor.atEnd()) { final HeaderElement element = parseHeaderElement(buffer, cursor); if (!(element.getName().isEmpty() && element.getValue() == null)) { elements.add(element); } } return elements.toArray(new HeaderElement[elements.size()]); }
@Test public void testConstructor2() throws Exception { final HeaderElement element = new BasicHeaderElement("name", "value"); Assert.assertEquals("name", element.getName()); Assert.assertEquals("value", element.getValue()); Assert.assertEquals(0, element.getParameters().length); }
@Test public void testConstructor3() throws Exception { final HeaderElement element = new BasicHeaderElement("name", "value", new NameValuePair[] { new BasicNameValuePair("param1", "value1"), new BasicNameValuePair("param2", "value2") } ); Assert.assertEquals("name", element.getName()); Assert.assertEquals("value", element.getValue()); Assert.assertEquals(2, element.getParameters().length); Assert.assertEquals("value1", element.getParameterByName("param1").getValue()); Assert.assertEquals("value2", element.getParameterByName("param2").getValue()); }