@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); }
/** * Determines the index of the next header. * * @param pos one less than the index to consider first, * -1 to search for the first header * * @return the index of the next header that matches the filter name, * or negative if there are no more headers */ private int findNext(final int pos) { int from = pos; if (from < -1) { return -1; } final int to = this.allHeaders.length-1; boolean found = false; while (!found && (from < to)) { from++; found = filterHeader(from); } return found ? from : -1; }
/** * Obtains the next header from this iteration. * * @return the next header in this iteration * * @throws NoSuchElementException if there are no more headers */ @Override public Header next() throws NoSuchElementException { final int current = this.currentIndex; if (current < 0) { throw new NoSuchElementException("Iteration already finished."); } this.currentIndex = findNext(current); return this.allHeaders[current]; }
@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); }
/** * Obtains the next header from this iteration. * * @return the next header in this iteration * * @throws NoSuchElementException if there are no more headers */ @Override public Header next() throws NoSuchElementException { final int current = this.currentIndex; if (current < 0) { throw new NoSuchElementException("Iteration already finished."); } this.currentIndex = findNext(current); return this.allHeaders[current]; }
/** * Determines the index of the next header. * * @param pos one less than the index to consider first, * -1 to search for the first header * * @return the index of the next header that matches the filter name, * or negative if there are no more headers */ private int findNext(final int pos) { int from = pos; if (from < -1) { return -1; } final int to = this.allHeaders.length-1; boolean found = false; while (!found && (from < to)) { from++; found = filterHeader(from); } return found ? from : -1; }
@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); }
/** * Creates a new header iterator. * * @param headers an array of headers over which to iterate * @param name the name of the headers over which to iterate, or * {@code null} for any */ public BasicHeaderIterator(final Header[] headers, final String name) { super(); this.allHeaders = Args.notNull(headers, "Header array"); this.headerName = name; this.currentIndex = findNext(-1); }
@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); }
/** * Creates a new header iterator. * * @param headers an array of headers over which to iterate * @param name the name of the headers over which to iterate, or * {@code null} for any */ public BasicHeaderIterator(final Header[] headers, final String name) { super(); this.allHeaders = Args.notNull(headers, "Header array"); this.headerName = name; this.currentIndex = findNext(-1); }
@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 testInvalid() { Iterator<Header> hit = null; try { hit = new BasicHeaderIterator(null, "whatever"); Assert.fail("null headers not detected"); } catch (final IllegalArgumentException iax) { // expected } // this is not invalid hit = new BasicHeaderIterator(new Header[0], "whatever"); Assert.assertFalse(hit.hasNext()); // but this is try { hit.next(); Assert.fail("next beyond end not detected"); } catch (final NoSuchElementException nsx) { // expected } }
@Test public void testFringeCases() { final Header[] headers = new Header[]{ new BasicHeader("Name", null), new BasicHeader("Name", " "), new BasicHeader("Name", ",,,") }; final Iterator<HeaderElement> hei = new BasicHeaderElementIterator( new BasicHeaderIterator(headers, "Name")); Assert.assertFalse(hei.hasNext()); try { hei.next(); Assert.fail("NoSuchElementException should have been thrown"); } catch (final NoSuchElementException ex) { // expected } Assert.assertFalse(hei.hasNext()); try { hei.next(); Assert.fail("NoSuchElementException should have been thrown"); } catch (final NoSuchElementException ex) { // expected } }
@Test public void testEmpty() { final Header[] headers = new Header[]{ new BasicHeader("Name", " "), new BasicHeader("Name", ""), new BasicHeader("Name", ","), new BasicHeader("Name", " ,, "), }; Iterator<Header> hit = new BasicHeaderIterator(headers, null); Iterator<String> ti = new BasicTokenIterator(hit); Assert.assertFalse(ti.hasNext()); hit = new BasicHeaderIterator(headers, "empty"); ti = new BasicTokenIterator(hit); Assert.assertFalse(ti.hasNext()); }
@Test public void testSingleHeader() { Header[] headers = new Header[]{ new BasicHeader("Name", "token0,token1, token2 , token3") }; Iterator<Header> hit = new BasicHeaderIterator(headers, null); Iterator<String> ti = new BasicTokenIterator(hit); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token0", "token0", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token1", "token1", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token2", "token2", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token3", "token3", ti.next()); Assert.assertFalse(ti.hasNext()); headers = new Header[]{ new BasicHeader("Name", "token0") }; hit = new BasicHeaderIterator(headers, null); ti = new BasicTokenIterator(hit); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token0", "token0", ti.next()); Assert.assertFalse(ti.hasNext()); }
Iterator<Header> hit = new BasicHeaderIterator(headers, null); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("0", headers[0], hit.next()); hit = new BasicHeaderIterator(headers, "match"); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("0", headers[0], hit.next()); hit = new BasicHeaderIterator(headers, "single"); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("2", headers[2], hit.next()); hit = new BasicHeaderIterator(headers, "way-off"); Assert.assertFalse(hit.hasNext());
Iterator<Header> hit = new BasicHeaderIterator(headers, null); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("0", headers[0], hit.next()); Assert.assertFalse(hit.hasNext()); hit = new BasicHeaderIterator(headers, null); Assert.assertTrue(hit.hasNext()); try {
new BasicHeaderIterator(headers, "Name"));
Iterator<Header> hit = new BasicHeaderIterator(headers, null); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("0", headers[0], hit.next()); hit = new BasicHeaderIterator(headers, "name"); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("0", headers[0], hit.next());
@Test public void testValueEnd() { final Header[] headers = new Header[]{ new BasicHeader("Name", "token0"), new BasicHeader("Name", "token1 "), new BasicHeader("Name", "token2,"), new BasicHeader("Name", "token3 ,"), new BasicHeader("Name", "token4, "), new BasicHeader("Name", "token5 , "), }; final Iterator<Header> hit = new BasicHeaderIterator(headers, null); final Iterator<String> ti = new BasicTokenIterator(hit); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token0", "token0", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token1", "token1", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token2", "token2", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token3", "token3", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token4", "token4", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token5", "token5", ti.next()); Assert.assertFalse(ti.hasNext()); }