package org.esigate.test.cases; import org.apache.commons.io.IOUtils; import org.apache.http.HttpResponse; import org.apache.http.client.CookieStore; import org.apache.http.client.config.CookieSpecs; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.cookie.BasicClientCookie; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import junit.framework.TestCase; /** * "Vary" header testing * * @author Nicolas Richeton */ public class VaryMasterTest extends TestCase { private static final Logger LOG = LoggerFactory.getLogger(VaryMasterTest.class); /** * Send a request with a Cookie "test-cookie" to vary.jsp (which will get content from provider) and ensure the * result is valid. * * @param cookieValue * @param forceRefresh * @return Page timestamp. Can be used to detect cache hits. * @throws Exception */ private String doCookieRequest(String cookieValue, boolean forceRefresh) throws Exception { CookieStore cookieStore = new BasicCookieStore(); HttpClientContext context = new HttpClientContext(); context.setCookieStore(cookieStore); CloseableHttpClient client = HttpClients.createDefault(); RequestConfig config = RequestConfig.custom().setCookieSpec(CookieSpecs.DEFAULT).build(); HttpGet request = new HttpGet("http://localhost:8080/esigate-app-master/vary.jsp"); request.setConfig(config); if (cookieValue != null) { BasicClientCookie cookie = new BasicClientCookie("test-cookie", cookieValue); cookie.setDomain("localhost"); cookie.setPath("/"); cookieStore.addCookie(cookie); } if (forceRefresh) { request.addHeader("Cache-Control", "no-cache"); } HttpResponse response = client.execute(request, context); // Ensure content is valid. String text = IOUtils.toString(response.getEntity().getContent()); assertNotNull(text); LOG.debug("----- Request with cookie " + cookieValue + " and forceRefresh=" + forceRefresh + " -----> \n" + text); if (cookieValue != null) { assertTrue("no value '" + cookieValue + "' found", text.contains(cookieValue)); } else { assertTrue("no cookie found", text.contains("no cookie")); } client.close(); return text.substring(text.indexOf("stime") + 5, text.indexOf("etime")); } /** * Call test page with different cookie values and ensure cache use and content are valid. * * @throws Exception */ public void testBlockVary() throws Exception { // Issue in HttpClient fixed in HttpClient 4.3: // HttpClient cache does not support Vary: Cookie. See // https://issues.apache.org/jira/browse/HTTPCLIENT-1190 doCookieRequest("init", false); // Cache test String value1 = doCookieRequest("value1", false); String valueNull = doCookieRequest(null, false); assertEquals(value1, doCookieRequest("value1", false)); String value2 = doCookieRequest("value2", false); assertEquals(valueNull, doCookieRequest(null, false)); assertEquals(value1, doCookieRequest("value1", false)); assertEquals(value2, doCookieRequest("value2", false)); String value3 = doCookieRequest("value3", false); assertEquals(valueNull, doCookieRequest(null, false)); assertEquals(value3, doCookieRequest("value3", false)); // Test refresh but in fact there should be no refresh in an include String value1Refresh = doCookieRequest("value1", true); // assertFalse(value1.equals(value1Refresh)); assertEquals(value1Refresh, doCookieRequest("value1", false)); } }