private boolean hasValidDateField(final HttpRequest request, final String headerName) { for(final Header h : request.getHeaders(headerName)) { final Date date = DateUtils.parseDate(h.getValue()); return date != null; } return false; } }
private RequestProtocolError requestContainsNoCacheDirectiveWithFieldName(final HttpRequest request) { for(final Header h : request.getHeaders(HeaderConstants.CACHE_CONTROL)) { for(final HeaderElement elt : h.getElements()) { if (HeaderConstants.CACHE_CONTROL_NO_CACHE.equalsIgnoreCase(elt.getName()) && elt.getValue() != null) { return RequestProtocolError.NO_CACHE_DIRECTIVE_WITH_FIELD_NAME; } } } return null; } }
private void add100ContinueHeaderIfMissing(final HttpRequest request) { boolean hasHeader = false; for (final Header h : request.getHeaders(HTTP.EXPECT_DIRECTIVE)) { for (final HeaderElement elt : h.getElements()) { if (HTTP.EXPECT_CONTINUE.equalsIgnoreCase(elt.getName())) { hasHeader = true; } } } if (!hasHeader) { request.addHeader(HTTP.EXPECT_DIRECTIVE, HTTP.EXPECT_CONTINUE); } }
buf.append(URLEncoder.encode(getFullHeaderValue(req.getHeaders(headerName)), Consts.UTF_8.name())); first = false;
/** * 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; }
private void stripOtherFreshnessDirectivesWithNoCache(final HttpRequest request) { final List<HeaderElement> outElts = new ArrayList<HeaderElement>(); boolean shouldStrip = false; for(final Header h : request.getHeaders(HeaderConstants.CACHE_CONTROL)) { for(final HeaderElement elt : h.getElements()) { if (!disallowedWithNoCache.contains(elt.getName())) { outElts.add(elt); } if (HeaderConstants.CACHE_CONTROL_NO_CACHE.equals(elt.getName())) { shouldStrip = true; } } } if (!shouldStrip) { return; } request.removeHeaders(HeaderConstants.CACHE_CONTROL); request.setHeader(HeaderConstants.CACHE_CONTROL, buildHeaderFromElements(outElts)); }
private long getMaxStale(final HttpRequest request) { long maxstale = -1; for(final Header h : request.getHeaders(HeaderConstants.CACHE_CONTROL)) { for(final HeaderElement elt : h.getElements()) { 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; }
public boolean mayReturnStaleIfError(final HttpRequest request, final HttpCacheEntry entry, final Date now) { final long stalenessSecs = getStalenessSecs(entry, now); return mayReturnStaleIfError(request.getHeaders(HeaderConstants.CACHE_CONTROL), stalenessSecs) || mayReturnStaleIfError(entry.getHeaders(HeaderConstants.CACHE_CONTROL), stalenessSecs); }
private void remove100ContinueHeaderIfExists(final HttpRequest request) { boolean hasHeader = false; final Header[] expectHeaders = request.getHeaders(HTTP.EXPECT_DIRECTIVE); List<HeaderElement> expectElementsThatAreNot100Continue = new ArrayList<HeaderElement>(); for (final Header h : expectHeaders) { for (final HeaderElement elt : h.getElements()) { if (!(HTTP.EXPECT_CONTINUE.equalsIgnoreCase(elt.getName()))) { expectElementsThatAreNot100Continue.add(elt); } else { hasHeader = true; } } if (hasHeader) { request.removeHeader(h); for (final HeaderElement elt : expectElementsThatAreNot100Continue) { final BasicHeader newHeader = new BasicHeader(HTTP.EXPECT_DIRECTIVE, elt.getName()); request.addHeader(newHeader); } return; } else { expectElementsThatAreNot100Continue = new ArrayList<HeaderElement>(); } } }
/** * Check entry against If-Modified-Since, if If-Modified-Since is in the future it is invalid as per * http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html * @param request The current httpRequest being made * @param entry the cache entry * @param now right NOW in time * @return boolean Does the last modified header match */ private boolean lastModifiedValidatorMatches(final HttpRequest request, final HttpCacheEntry entry, final Date now) { final Header lastModifiedHeader = entry.getFirstHeader(HeaderConstants.LAST_MODIFIED); Date lastModified = null; if (lastModifiedHeader != null) { lastModified = DateUtils.parseDate(lastModifiedHeader.getValue()); } if (lastModified == null) { return false; } for (final Header h : request.getHeaders(HeaderConstants.IF_MODIFIED_SINCE)) { final Date ifModifiedSince = DateUtils.parseDate(h.getValue()); if (ifModifiedSince != null) { if (ifModifiedSince.after(now) || lastModified.after(ifModifiedSince)) { return false; } } } return true; }
if (request.getHeaders(HeaderConstants.PRAGMA).length > 0) { log.trace("request with Pragma header was not serveable from cache"); return false; final Header[] cacheControlHeaders = request.getHeaders(HeaderConstants.CACHE_CONTROL); for (final Header cacheControl : cacheControlHeaders) { for (final HeaderElement cacheControlElement : cacheControl.getElements()) {
for (final Header ccHdr : request.getHeaders(HeaderConstants.CACHE_CONTROL)) { for (final HeaderElement elt : ccHdr.getElements()) { if (HeaderConstants.CACHE_CONTROL_NO_CACHE.equals(elt.getName())) {
final Header[] authNHeaders = request.getHeaders(HeaderConstants.AUTHORIZATION); if (authNHeaders != null && authNHeaders.length > 0 && !hasCacheControlParameterFrom(response, AUTH_CACHEABLE_PARAMS)) {