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; } }
buf.append(URLEncoder.encode(getFullHeaderValue(req.getHeaders(headerName)), StandardCharsets.UTF_8.name())); first = false;
/** * When a {@link HttpCacheEntry} does not exist for a specific * {@link org.apache.hc.core5.http.HttpRequest} we attempt to see if an existing * {@link HttpCacheEntry} is appropriate by building a conditional * {@link org.apache.hc.core5.http.HttpRequest} using the variants' ETag values. * If no such values exist, the request is unmodified * * @param request the original request from the caller * @param variants * @return the wrapped request */ public T buildConditionalRequestFromVariants(final T request, final Map<String, Variant> variants) { final T newRequest = messageCopier.copy(request); newRequest.setHeaders(request.getHeaders()); // we do not support partial content so all etags are used final StringBuilder etags = new StringBuilder(); boolean first = true; for(final String etag : variants.keySet()) { if (!first) { etags.append(","); } first = false; etags.append(etag); } newRequest.setHeader(HeaderConstants.IF_NONE_MATCH, etags.toString()); return newRequest; }
/** * 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 Date lastModified = DateUtils.parseDate(entry, HeaderConstants.LAST_MODIFIED); 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; }
@Test public void testGetVariantURIHandlesMultipleLineRequestHeaders() { final String theURI = "theURI"; final Header[] varyHeaders = { new BasicHeader("Vary", "User-Agent, Accept-Encoding") }; final Header[] encHeaders = { new BasicHeader("Accept-Encoding", "gzip"), new BasicHeader("Accept-Encoding", "deflate") }; final Header[] uaHeaders = { new BasicHeader("User-Agent", "browser") }; extractor = new CacheKeyGenerator() { @Override public String generateKey(final HttpHost h, final HttpRequest request) { Assert.assertSame(defaultHost, h); Assert.assertSame(mockRequest, request); return theURI; } }; when(mockEntry.hasVariants()).thenReturn(true); when(mockEntry.headerIterator("Vary")).thenReturn(new BasicHeaderIterator(varyHeaders, "Vary")); when(mockRequest.getHeaders("Accept-Encoding")).thenReturn(encHeaders); when(mockRequest.getHeaders("User-Agent")).thenReturn(uaHeaders); final String result = extractor.generateKey(defaultHost, mockRequest, mockEntry); verify(mockEntry).hasVariants(); verify(mockEntry).headerIterator("Vary"); verify(mockRequest).getHeaders("Accept-Encoding"); verify(mockRequest).getHeaders("User-Agent"); Assert.assertEquals("{Accept-Encoding=gzip%2C+deflate&User-Agent=browser}" + theURI, result); }
@Test public void testGetVariantURIAlphabetizesWithMultipleVaryingHeaders() { final String theURI = "theURI"; final Header[] varyHeaders = { new BasicHeader("Vary", "User-Agent, Accept-Encoding") }; final Header[] encHeaders = { new BasicHeader("Accept-Encoding", "gzip") }; final Header[] uaHeaders = { new BasicHeader("User-Agent", "browser") }; extractor = new CacheKeyGenerator() { @Override public String generateKey(final HttpHost h, final HttpRequest request) { Assert.assertSame(defaultHost, h); Assert.assertSame(mockRequest, request); return theURI; } }; when(mockEntry.hasVariants()).thenReturn(true); when(mockEntry.headerIterator("Vary")).thenReturn(new BasicHeaderIterator(varyHeaders, "Vary")); when(mockRequest.getHeaders("Accept-Encoding")).thenReturn(encHeaders); when(mockRequest.getHeaders("User-Agent")).thenReturn(uaHeaders); final String result = extractor.generateKey(defaultHost, mockRequest, mockEntry); verify(mockEntry).hasVariants(); verify(mockEntry).headerIterator("Vary"); verify(mockRequest).getHeaders("Accept-Encoding"); verify(mockRequest).getHeaders("User-Agent"); Assert.assertEquals("{Accept-Encoding=gzip&User-Agent=browser}" + theURI, result); }
@Test public void testGetVariantURIHandlesMultipleVaryHeaders() { final String theURI = "theURI"; final Header[] varyHeaders = { new BasicHeader("Vary", "User-Agent"), new BasicHeader("Vary", "Accept-Encoding") }; final Header[] encHeaders = { new BasicHeader("Accept-Encoding", "gzip") }; final Header[] uaHeaders = { new BasicHeader("User-Agent", "browser") }; extractor = new CacheKeyGenerator() { @Override public String generateKey(final HttpHost h, final HttpRequest request) { Assert.assertSame(defaultHost, h); Assert.assertSame(mockRequest, request); return theURI; } }; when(mockEntry.hasVariants()).thenReturn(true); when(mockEntry.headerIterator("Vary")).thenReturn(new BasicHeaderIterator(varyHeaders, "Vary")); when(mockRequest.getHeaders("Accept-Encoding")).thenReturn(encHeaders); when(mockRequest.getHeaders("User-Agent")).thenReturn(uaHeaders); final String result = extractor.generateKey(defaultHost, mockRequest, mockEntry); verify(mockEntry).hasVariants(); verify(mockEntry).headerIterator("Vary"); verify(mockRequest).getHeaders("Accept-Encoding"); verify(mockRequest).getHeaders("User-Agent"); Assert.assertEquals("{Accept-Encoding=gzip&User-Agent=browser}" + theURI, result); }
@Test public void testGetVariantURIWithMissingRequestHeader() { final String theURI = "theURI"; final Header[] noHeaders = new Header[0]; final Header[] varyHeaders = { new BasicHeader("Vary", "Accept-Encoding") }; extractor = new CacheKeyGenerator() { @Override public String generateKey(final HttpHost h, final HttpRequest request) { Assert.assertSame(defaultHost, h); Assert.assertSame(mockRequest, request); return theURI; } }; when(mockEntry.hasVariants()).thenReturn(true); when(mockEntry.headerIterator("Vary")).thenReturn(new BasicHeaderIterator(varyHeaders, "Vary")); when(mockRequest.getHeaders("Accept-Encoding")) .thenReturn(noHeaders); final String result = extractor.generateKey(defaultHost, mockRequest, mockEntry); verify(mockEntry).hasVariants(); verify(mockEntry).headerIterator("Vary"); verify(mockRequest).getHeaders("Accept-Encoding"); Assert.assertEquals("{Accept-Encoding=}" + theURI, result); }
@Test public void testGetVariantURIWithSingleValueVaryHeaderPrepends() { final String theURI = "theURI"; final Header[] varyHeaders = { new BasicHeader("Vary", "Accept-Encoding") }; final Header[] encHeaders = { new BasicHeader("Accept-Encoding", "gzip") }; extractor = new CacheKeyGenerator() { @Override public String generateKey(final HttpHost h, final HttpRequest request) { Assert.assertSame(defaultHost, h); Assert.assertSame(mockRequest, request); return theURI; } }; when(mockEntry.hasVariants()).thenReturn(true); when(mockEntry.headerIterator("Vary")).thenReturn(new BasicHeaderIterator(varyHeaders, "Vary")); when(mockRequest.getHeaders("Accept-Encoding")).thenReturn(encHeaders); final String result = extractor.generateKey(defaultHost, mockRequest, mockEntry); verify(mockEntry).hasVariants(); verify(mockEntry).headerIterator("Vary"); verify(mockRequest).getHeaders("Accept-Encoding"); Assert.assertEquals("{Accept-Encoding=gzip}" + theURI, result); }
newRequest.setHeaders(request.getHeaders()); final Header eTag = cacheEntry.getFirstHeader(HeaderConstants.ETAG); if (eTag != null) {
@Test public void testBuildConditionalRequestWithETag() { final String theMethod = "GET"; final String theUri = "/theuri"; final String theETag = "this is my eTag"; final HttpRequest basicRequest = new BasicHttpRequest(theMethod, theUri); basicRequest.addHeader("Accept-Encoding", "gzip"); final HttpRequest requestWrapper = RequestCopier.INSTANCE.copy(basicRequest); final Header[] headers = new Header[] { new BasicHeader("Date", DateUtils.formatDate(new Date())), new BasicHeader("Last-Modified", DateUtils.formatDate(new Date())), new BasicHeader("ETag", theETag) }; final HttpCacheEntry cacheEntry = HttpTestUtils.makeCacheEntry(headers); final HttpRequest newRequest = impl.buildConditionalRequest(requestWrapper, cacheEntry); Assert.assertNotSame(basicRequest, newRequest); Assert.assertEquals(theMethod, newRequest.getMethod()); Assert.assertEquals(theUri, newRequest.getRequestUri()); Assert.assertEquals(3, newRequest.getHeaders().length); Assert.assertEquals("Accept-Encoding", newRequest.getHeaders()[0].getName()); Assert.assertEquals("gzip", newRequest.getHeaders()[0].getValue()); Assert.assertEquals("If-None-Match", newRequest.getHeaders()[1].getName()); Assert.assertEquals(theETag, newRequest.getHeaders()[1].getValue()); }
@Test public void testBuildConditionalRequestWithLastModified() { final String theMethod = "GET"; final String theUri = "/theuri"; final String lastModified = "this is my last modified date"; final HttpRequest basicRequest = new BasicHttpRequest(theMethod, theUri); basicRequest.addHeader("Accept-Encoding", "gzip"); final HttpRequest requestWrapper = RequestCopier.INSTANCE.copy(basicRequest); final Header[] headers = new Header[] { new BasicHeader("Date", DateUtils.formatDate(new Date())), new BasicHeader("Last-Modified", lastModified) }; final HttpCacheEntry cacheEntry = HttpTestUtils.makeCacheEntry(headers); final HttpRequest newRequest = impl.buildConditionalRequest(requestWrapper, cacheEntry); Assert.assertNotSame(basicRequest, newRequest); Assert.assertEquals(theMethod, newRequest.getMethod()); Assert.assertEquals(theUri, newRequest.getRequestUri()); Assert.assertEquals(2, newRequest.getHeaders().length); Assert.assertEquals("Accept-Encoding", newRequest.getHeaders()[0].getName()); Assert.assertEquals("gzip", newRequest.getHeaders()[0].getValue()); Assert.assertEquals("If-Modified-Since", newRequest.getHeaders()[1].getName()); Assert.assertEquals(lastModified, newRequest.getHeaders()[1].getValue()); }
@Override public void onRequestHead(final HttpConnection connection, final HttpRequest request) { if (config.getVerbosity() >= 3) { System.out.println(">> " + request.getMethod() + " " + request.getRequestUri()); final Header[] headers = request.getHeaders(); for (final Header header : headers) { System.out.println(">> " + header.toString()); } System.out.println(); } }
@Override public void onRequestHead(final HttpConnection connection, final HttpRequest request) { if (config.getVerbosity() >= 3) { System.out.println(">> " + request.getMethod() + " " + request.getRequestUri()); final Header[] headers = request.getHeaders(); for (final Header header : headers) { System.out.println(">> " + header.toString()); } System.out.println(); } }
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; } }
buf.append(URLEncoder.encode(getFullHeaderValue(req.getHeaders(headerName)), StandardCharsets.UTF_8.name())); first = false;
/** * When a {@link HttpCacheEntry} does not exist for a specific * {@link org.apache.hc.core5.http.HttpRequest} we attempt to see if an existing * {@link HttpCacheEntry} is appropriate by building a conditional * {@link org.apache.hc.core5.http.HttpRequest} using the variants' ETag values. * If no such values exist, the request is unmodified * * @param request the original request from the caller * @param variants * @return the wrapped request */ public T buildConditionalRequestFromVariants(final T request, final Map<String, Variant> variants) { final T newRequest = messageCopier.copy(request); newRequest.setHeaders(request.getHeaders()); // we do not support partial content so all etags are used final StringBuilder etags = new StringBuilder(); boolean first = true; for(final String etag : variants.keySet()) { if (!first) { etags.append(","); } first = false; etags.append(etag); } newRequest.setHeader(HeaderConstants.IF_NONE_MATCH, etags.toString()); return newRequest; }
/** * 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 Date lastModified = DateUtils.parseDate(entry, HeaderConstants.LAST_MODIFIED); 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; }
newRequest.setHeaders(request.getHeaders()); final Header eTag = cacheEntry.getFirstHeader(HeaderConstants.ETAG); if (eTag != null) {
if (!StandardMethods.isSafe(request.getMethod())) { final HttpRequest httpGet = new BasicHttpRequest(StandardMethods.GET.name(), redirectUri); httpGet.setHeaders(scope.originalRequest.getHeaders()); state.currentRequest = httpGet; state.currentEntityProducer = null;