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; } }
protected boolean isExplicitlyNonCacheable(final HttpResponse response) { final Iterator<HeaderElement> it = MessageSupport.iterate(response, HeaderConstants.CACHE_CONTROL); while (it.hasNext()) { final HeaderElement elem = it.next(); 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; }
protected List<Cookie> parse(final HeaderElement[] elems, final CookieOrigin origin) throws MalformedCookieException { final List<Cookie> cookies = new ArrayList<>(elems.length); for (final HeaderElement headerelement : elems) { final String name = headerelement.getName(); final String value = headerelement.getValue(); if (name == null || name.isEmpty()) { throw new MalformedCookieException("Cookie name may not be empty"); } final BasicClientCookie cookie = new BasicClientCookie(name, value); cookie.setPath(getDefaultPath(origin)); cookie.setDomain(getDefaultDomain(origin)); // cycle through the parameters final NameValuePair[] attribs = headerelement.getParameters(); for (int j = attribs.length - 1; j >= 0; j--) { final NameValuePair attrib = attribs[j]; final String s = attrib.getName().toLowerCase(Locale.ROOT); cookie.setAttribute(s, attrib.getValue()); final CookieAttributeHandler handler = findAttribHandler(s); if (handler != null) { handler.parse(cookie, attrib.getValue()); } } cookies.add(cookie); } return cookies; }
@Override public void formatHeaderElement( final CharArrayBuffer buffer, final HeaderElement elem, final boolean quote) { Args.notNull(buffer, "Char array buffer"); Args.notNull(elem, "Header element"); buffer.append(elem.getName()); final String value = elem.getValue(); if (value != null) { buffer.append('='); formatValue(buffer, value, quote); } final int c = elem.getParameterCount(); if (c > 0) { for (int i = 0; i < c; i++) { buffer.append("; "); formatNameValuePair(buffer, elem.getParameter(i), quote); } } }
@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()); }
private static ContentType create(final HeaderElement helem, final boolean strict) { final String mimeType = helem.getName(); if (TextUtils.isBlank(mimeType)) { return null; } return create(helem.getName(), helem.getParameters(), strict); }
@Test public void test206ResponseGeneratedFromCacheMustHaveContentRangeOrMultipartByteRangesContentType() throws Exception { final ClassicHttpRequest req1 = new BasicClassicHttpRequest("GET", "/"); final ClassicHttpResponse resp1 = HttpTestUtils.make200Response(); resp1.setHeader("ETag", "\"etag\""); resp1.setHeader("Cache-Control", "max-age=3600"); final ClassicHttpRequest req2 = new BasicClassicHttpRequest("GET", "/"); req2.setHeader("Range", "bytes=0-50"); backendExpectsAnyRequestAndReturn(resp1).times(1, 2); replayMocks(); execute(req1); final ClassicHttpResponse result = execute(req2); verifyMocks(); if (HttpStatus.SC_PARTIAL_CONTENT == result.getCode()) { if (result.getFirstHeader("Content-Range") == null) { final HeaderElement elt = MessageSupport.parse(result.getFirstHeader("Content-Type"))[0]; Assert.assertTrue("multipart/byteranges".equalsIgnoreCase(elt.getName())); Assert.assertNotNull(elt.getParameterByName("boundary")); Assert.assertNotNull(elt.getParameterByName("boundary").getValue()); Assert.assertFalse("".equals(elt.getParameterByName("boundary").getValue().trim())); } } }
@Test public void testParamByName() throws Exception { final String s = "name = value; param1 = value1; param2 = value2"; final CharArrayBuffer buf = new CharArrayBuffer(64); buf.append(s); final ParserCursor cursor = new ParserCursor(0, buf.length()); final HeaderElement element = BasicHeaderValueParser.INSTANCE.parseHeaderElement(buf, cursor); Assert.assertEquals("value1", element.getParameterByName("param1").getValue()); Assert.assertEquals("value2", element.getParameterByName("param2").getValue()); Assert.assertNull(element.getParameterByName("param3")); try { element.getParameterByName(null); Assert.fail("IllegalArgumentException should have been thrown"); } catch (final IllegalArgumentException ex) { //expected } }
public boolean hasCacheControlDirective(final HttpCacheEntry entry, final String directive) { final Iterator<HeaderElement> it = MessageSupport.iterate(entry, HeaderConstants.CACHE_CONTROL); while (it.hasNext()) { final HeaderElement elt = it.next(); if (directive.equalsIgnoreCase(elt.getName())) { return true; } } return false; }
@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); }
@Override public void formatHeaderElement( final CharArrayBuffer buffer, final HeaderElement elem, final boolean quote) { Args.notNull(buffer, "Char array buffer"); Args.notNull(elem, "Header element"); buffer.append(elem.getName()); final String value = elem.getValue(); if (value != null) { buffer.append('='); formatValue(buffer, value, quote); } final int c = elem.getParameterCount(); if (c > 0) { for (int i = 0; i < c; i++) { buffer.append("; "); formatNameValuePair(buffer, elem.getParameter(i), quote); } } }
private static ContentType create(final HeaderElement helem, final boolean strict) { final String mimeType = helem.getName(); if (TextUtils.isBlank(mimeType)) { return null; } return create(helem.getName(), helem.getParameters(), strict); }
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; }
boolean mayCallBackend(final HttpRequest request) { final Iterator<HeaderElement> it = MessageSupport.iterate(request, HeaderConstants.CACHE_CONTROL); while (it.hasNext()) { final HeaderElement elt = it.next(); if ("only-if-cached".equals(elt.getName())) { log.debug("Request marked only-if-cached"); return false; } } return true; }
Assert.assertEquals("name1",elements[0].getName()); Assert.assertEquals("value1",elements[0].getValue()); Assert.assertEquals(2,elements[0].getParameters().length); Assert.assertEquals("name2",elements[0].getParameters()[0].getName()); Assert.assertEquals(null, elements[0].getParameters()[0].getValue()); Assert.assertEquals("name3",elements[0].getParameters()[1].getName()); Assert.assertEquals("value3",elements[0].getParameters()[1].getValue()); Assert.assertEquals("name4",elements[1].getName()); Assert.assertEquals("value4",elements[1].getValue()); Assert.assertEquals(1,elements[1].getParameters().length); Assert.assertEquals("name5",elements[1].getParameters()[0].getName()); Assert.assertEquals("value5",elements[1].getParameters()[0].getValue()); Assert.assertEquals("name6",elements[2].getName()); Assert.assertEquals("",elements[2].getValue()); Assert.assertEquals(2,elements[2].getParameters().length); Assert.assertEquals("name7",elements[2].getParameters()[0].getName()); Assert.assertEquals("value7",elements[2].getParameters()[0].getValue()); Assert.assertEquals("name8",elements[2].getParameters()[1].getName()); Assert.assertEquals(" value8",elements[2].getParameters()[1].getValue());
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 boolean hasCacheControlParameterFrom(final HttpMessage msg, final String[] params) { final Iterator<HeaderElement> it = MessageSupport.iterate(msg, HeaderConstants.CACHE_CONTROL); while (it.hasNext()) { final HeaderElement elem = it.next(); for (final String param : params) { if (param.equalsIgnoreCase(elem.getName())) { return true; } } } return false; }
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 void stripOtherFreshnessDirectivesWithNoCache(final HttpRequest request) { final List<HeaderElement> outElts = new ArrayList<>(); boolean shouldStrip = false; final Iterator<HeaderElement> it = MessageSupport.iterate(request, HeaderConstants.CACHE_CONTROL); while (it.hasNext()) { final HeaderElement elt = it.next(); 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)); }
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; }