This is an automated email from the ASF dual-hosted git repository. fschumacher pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/jmeter.git
The following commit(s) were added to refs/heads/master by this push: new 589511c JMeter Cache Manager misbehaving when "Use Cache-Control/Expires header" is checked 589511c is described below commit 589511cf254b894353494546b82df6f45a6e1066 Author: Felix Schumacher <felix.schumac...@internetallee.de> AuthorDate: Mon Nov 16 13:22:57 2020 +0100 JMeter Cache Manager misbehaving when "Use Cache-Control/Expires header" is checked Don't store http responses in the cache, if they have no caching related headers. Bugzilla Id: 64915 --- .../jmeter/protocol/http/control/CacheManager.java | 21 ++++++++++++---- .../http/control/TestCacheManagerBase.java | 12 ++++++++++ .../protocol/http/control/TestCacheManagerHC4.java | 24 ++++++++++++++++--- .../control/TestCacheManagerUrlConnection.java | 6 +++++ .../control/TestCacheManagerUrlConnectionBase.java | 28 +++++++++++++++------- xdocs/changes.xml | 1 + 6 files changed, 76 insertions(+), 16 deletions(-) diff --git a/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/control/CacheManager.java b/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/control/CacheManager.java index c2f4fe3..8b26d70 100644 --- a/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/control/CacheManager.java +++ b/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/control/CacheManager.java @@ -191,8 +191,19 @@ public class CacheManager extends ConfigTestElement implements TestStateListener String url = conn.getURL().toString(); String cacheControl = conn.getHeaderField(HTTPConstants.CACHE_CONTROL); String date = conn.getHeaderField(HTTPConstants.DATE); - setCache(lastModified, cacheControl, expires, etag, url, date, getVaryHeader(varyHeader, asHeaders(res.getRequestHeaders()))); + if (anyNotBlank(lastModified, expires, etag, cacheControl)) { + setCache(lastModified, cacheControl, expires, etag, url, date, getVaryHeader(varyHeader, asHeaders(res.getRequestHeaders()))); + } + } + } + + private boolean anyNotBlank(String... values) { + for (String value: values) { + if (StringUtils.isNotBlank(value)) { + return true; + } } + return false; } private Pair<String, String> getVaryHeader(String headerName, Header[] reqHeaders) { @@ -230,9 +241,11 @@ public class CacheManager extends ConfigTestElement implements TestStateListener String etag = getHeader(method ,HTTPConstants.ETAG); String cacheControl = getHeader(method, HTTPConstants.CACHE_CONTROL); String date = getHeader(method, HTTPConstants.DATE); - setCache(lastModified, cacheControl, expires, etag, - res.getUrlAsString(), date, getVaryHeader(varyHeader, - asHeaders(res.getRequestHeaders()))); // TODO correct URL? + if (anyNotBlank(lastModified, expires, etag, cacheControl)) { + setCache(lastModified, cacheControl, expires, etag, + res.getUrlAsString(), date, getVaryHeader(varyHeader, + asHeaders(res.getRequestHeaders()))); // TODO correct URL? + } } } diff --git a/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerBase.java b/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerBase.java index 2c73cea..85beca3 100644 --- a/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerBase.java +++ b/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerBase.java @@ -77,6 +77,8 @@ public abstract class TestCacheManagerBase extends JMeterTestCase { protected abstract void cacheResult(HTTPSampleResult result) throws Exception; + protected abstract void cacheResult(HTTPSampleResult sampleResultOK, boolean hasCachingHeaders) throws Exception; + protected abstract void setLastModified(String lastModified); protected abstract void checkRequestHeader(String requestHeader, String expectedValue); @@ -323,6 +325,16 @@ public abstract class TestCacheManagerBase extends JMeterTestCase { } @Test + public void testNoCachingHeadersBug64915() throws Exception { + this.cacheManager.setUseExpires(true); + this.cacheManager.testIterationStart(null); + assertNoSuchEntry(); + cacheResult(sampleResultOK, false); + assertNoSuchEntry(); + } + + + @Test public void testCacheHttpClientBug51932() throws Exception { this.cacheManager.setUseExpires(true); this.cacheManager.testIterationStart(null); diff --git a/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerHC4.java b/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerHC4.java index 0cefd3b..2870f3e 100644 --- a/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerHC4.java +++ b/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerHC4.java @@ -62,10 +62,19 @@ public class TestCacheManagerHC4 extends TestCacheManagerBase { private List<org.apache.http.Header> headers; public HttpResponseStub() { + this(true); + } + + public HttpResponseStub(boolean cachingHeaders) { this.headers = new ArrayList<>(); - this.lastModifiedHeader = new BasicHeader(HTTPConstants.LAST_MODIFIED, currentTimeInGMT); this.dateHeader = new BasicHeader(HTTPConstants.DATE, currentTimeInGMT); - this.etagHeader = new BasicHeader(HTTPConstants.ETAG, EXPECTED_ETAG); + if (cachingHeaders) { + this.lastModifiedHeader = new BasicHeader(HTTPConstants.LAST_MODIFIED, currentTimeInGMT); + this.etagHeader = new BasicHeader(HTTPConstants.ETAG, EXPECTED_ETAG); + } else { + this.lastModifiedHeader = null; + this.etagHeader = null; + } } /* (non-Javadoc) @@ -236,7 +245,16 @@ public class TestCacheManagerHC4 extends TestCacheManagerBase { @Override protected void cacheResult(HTTPSampleResult result) { - this.cacheManager.saveDetails(httpResponse, result); + cacheResult(result, true); + } + + @Override + protected void cacheResult(HTTPSampleResult result, boolean hasCachingHeaders) { + if (hasCachingHeaders) { + this.cacheManager.saveDetails(httpResponse, result); + } else { + this.cacheManager.saveDetails(new HttpResponseStub(false), result); + } } @Override diff --git a/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerUrlConnection.java b/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerUrlConnection.java index eb74191..fb1c3bd 100644 --- a/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerUrlConnection.java +++ b/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerUrlConnection.java @@ -30,6 +30,12 @@ public class TestCacheManagerUrlConnection extends TestCacheManagerUrlConnection @Override protected void cacheResult(HTTPSampleResult result) throws Exception { + cacheResult(result, true); + } + + @Override + protected void cacheResult(HTTPSampleResult result, boolean hasCachingHeaders) throws Exception { + ((URLConnectionStub) this.urlConnection).setCachingHeaders(hasCachingHeaders); this.cacheManager.saveDetails(this.urlConnection, result); } diff --git a/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerUrlConnectionBase.java b/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerUrlConnectionBase.java index 728d022..8d74867 100644 --- a/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerUrlConnectionBase.java +++ b/src/protocol/http/src/test/java/org/apache/jmeter/protocol/http/control/TestCacheManagerUrlConnectionBase.java @@ -29,6 +29,8 @@ import org.junit.jupiter.api.BeforeEach; public abstract class TestCacheManagerUrlConnectionBase extends TestCacheManagerBase { protected class URLConnectionStub extends HttpURLConnection { + private boolean cachingHeaders = true; + protected URLConnectionStub(URL url) { super(url); } @@ -47,15 +49,18 @@ public abstract class TestCacheManagerUrlConnectionBase extends TestCacheManager @Override public String getHeaderField(String name) { - if (HTTPConstants.LAST_MODIFIED.equals(name)) { - return lastModifiedHeader; - } else if (HTTPConstants.ETAG.equals(name)) { - return EXPECTED_ETAG; - } else if (HTTPConstants.EXPIRES.equals(name)) { - return expires; - } else if (HTTPConstants.CACHE_CONTROL.equals(name)) { - return cacheControl; - } else if (HTTPConstants.DATE.equals(name)) { + if (cachingHeaders) { + if (HTTPConstants.LAST_MODIFIED.equals(name)) { + return lastModifiedHeader; + } else if (HTTPConstants.ETAG.equals(name)) { + return EXPECTED_ETAG; + } else if (HTTPConstants.EXPIRES.equals(name)) { + return expires; + } else if (HTTPConstants.CACHE_CONTROL.equals(name)) { + return cacheControl; + } + } + if (HTTPConstants.DATE.equals(name)) { return currentTimeInGMT; } else if (HTTPConstants.VARY.equals(name)) { return vary; @@ -76,7 +81,12 @@ public abstract class TestCacheManagerUrlConnectionBase extends TestCacheManager public boolean usingProxy() { return false; } + + protected void setCachingHeaders(boolean useSpecialHeaders) { + this.cachingHeaders = useSpecialHeaders; + } } + protected URLConnection urlConnection; @Override diff --git a/xdocs/changes.xml b/xdocs/changes.xml index 1a48b05..df80a05 100644 --- a/xdocs/changes.xml +++ b/xdocs/changes.xml @@ -184,6 +184,7 @@ applications when JMeter is starting up.</p> <h3>Timers, Assertions, Config, Pre- & Post-Processors</h3> <ul> <li><bug>64638</bug>JSON JMESPath Assertion / JSON Assertion: Opening GUI shows a horizontal scrollbar that keeps sliding</li> + <li><bug>64915</bug>JMeter Cache Manager misbehaving when "Use Cache-Control/Expires header" is checked</li> </ul> <h3>Functions</h3>