protected boolean isExplicitlyNonCacheable(final HttpResponse response) { final Header[] cacheControlHeaders = response.getHeaders(HeaderConstants.CACHE_CONTROL); for (final Header header : cacheControlHeaders) { for (final HeaderElement elem : header.getElements()) { if (HeaderConstants.CACHE_CONTROL_NO_STORE.equals(elem.getName()) || HeaderConstants.CACHE_CONTROL_NO_CACHE.equals(elem.getName()) || (sharedCache && HeaderConstants.PRIVATE.equals(elem.getName()))) { return true; } } } return false; }
public boolean hasCacheControlDirective(final HttpCacheEntry entry, final String directive) { for (final Header h : entry.getHeaders(HeaderConstants.CACHE_CONTROL)) { for(final HeaderElement elt : h.getElements()) { if (directive.equalsIgnoreCase(elt.getName())) { return true; } } } return false; }
protected boolean hasCacheControlParameterFrom(final HttpMessage msg, final String[] params) { final Header[] cacheControlHeaders = msg.getHeaders(HeaderConstants.CACHE_CONTROL); for (final Header header : cacheControlHeaders) { for (final HeaderElement elem : header.getElements()) { for (final String param : params) { if (param.equalsIgnoreCase(elem.getName())) { return true; } } } } return false; }
/** * Returns true if the entity's Content-Type header is * {@code application/x-www-form-urlencoded}. */ public static boolean isEncoded(final HttpEntity entity) { final Header h = entity.getContentType(); if (h != null) { final HeaderElement[] elems = h.getElements(); if (elems.length > 0) { final String contentType = elems[0].getName(); return contentType.equalsIgnoreCase(CONTENT_TYPE); } } return false; }
protected long getMaxAge(final HttpCacheEntry entry) { long maxage = -1; for (final Header hdr : entry.getHeaders(HeaderConstants.CACHE_CONTROL)) { for (final HeaderElement elt : hdr.getElements()) { 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; }
private boolean mayReturnStaleIfError(final Header[] headers, final long stalenessSecs) { boolean result = false; for(final Header h : headers) { for(final HeaderElement elt : h.getElements()) { 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; }
private static ContentType create(final HeaderElement helem, final boolean strict) { return create(helem.getName(), helem.getParameters(), strict); }
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; }
@Override protected void parseChallenge( final CharArrayBuffer buffer, final int pos, final int len) throws MalformedChallengeException { final HeaderValueParser parser = BasicHeaderValueParser.INSTANCE; final ParserCursor cursor = new ParserCursor(pos, buffer.length()); final HeaderElement[] elements = parser.parseElements(buffer, cursor); this.params.clear(); for (final HeaderElement element : elements) { this.params.put(element.getName().toLowerCase(Locale.ROOT), element.getValue()); } }
private boolean mayCallBackend(final HttpRequestWrapper request) { for (final Header h: request.getHeaders(HeaderConstants.CACHE_CONTROL)) { for (final HeaderElement elt : h.getElements()) { if ("only-if-cached".equals(elt.getName())) { log.trace("Request marked only-if-cached"); return false; } } } return true; }
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 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)); }
@Override public HeaderElement[] parseElements(final CharArrayBuffer buffer, final ParserCursor cursor) { Args.notNull(buffer, "Char array buffer"); Args.notNull(cursor, "Parser cursor"); final List<HeaderElement> elements = new ArrayList<HeaderElement>(); while (!cursor.atEnd()) { final HeaderElement element = parseHeaderElement(buffer, cursor); if (!(element.getName().length() == 0 && element.getValue() == null)) { elements.add(element); } } return elements.toArray(new HeaderElement[elements.size()]); }
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); } }
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>(); } } }
public Set<String> getAllowedMethods(final HttpResponse response) { Args.notNull(response, "HTTP response"); final HeaderIterator it = response.headerIterator("Allow"); final Set<String> methods = new HashSet<String>(); while (it.hasNext()) { final Header header = it.nextHeader(); final HeaderElement[] elements = header.getElements(); for (final HeaderElement element : elements) { methods.add(element.getName()); } } return methods; }
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; }
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; }
/** * Obtains MIME type of the entity, if known. * * @param entity must not be null * @return the character set, or null if not found * @throws ParseException if header elements cannot be parsed * @throws IllegalArgumentException if entity is null * * @since 4.1 * * @deprecated (4.1.3) use {@link ContentType#getOrDefault(HttpEntity)} */ @Deprecated public static String getContentMimeType(final HttpEntity entity) throws ParseException { Args.notNull(entity, "Entity"); String mimeType = null; if (entity.getContentType() != null) { final HeaderElement values[] = entity.getContentType().getElements(); if (values.length > 0) { mimeType = values[0].getName(); } } return mimeType; }
@Override public long getKeepAliveDuration(final HttpResponse response, final HttpContext context) { Args.notNull(response, "HTTP response"); final HeaderElementIterator it = new BasicHeaderElementIterator( response.headerIterator(HTTP.CONN_KEEP_ALIVE)); while (it.hasNext()) { final HeaderElement he = it.nextElement(); final String param = he.getName(); final String value = he.getValue(); if (value != null && param.equalsIgnoreCase("timeout")) { try { return Long.parseLong(value) * 1000; } catch(final NumberFormatException ignore) { } } } return -1; }