You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2013/03/28 13:36:34 UTC
svn commit: r1462070 - in /httpcomponents/httpclient/branches/4.2.x: ./
httpclient-cache/src/main/java/org/apache/http/impl/client/cache/
httpclient-cache/src/test/java/org/apache/http/impl/client/cache/
Author: olegk
Date: Thu Mar 28 12:36:34 2013
New Revision: 1462070
URL: http://svn.apache.org/r1462070
Log:
HTTPCLIENT-1299: (regression) cache incorrectly disposes of the underlying cache resource when storing variant entry
Modified:
httpcomponents/httpclient/branches/4.2.x/RELEASE_NOTES.txt
httpcomponents/httpclient/branches/4.2.x/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/BasicHttpCache.java
httpcomponents/httpclient/branches/4.2.x/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/HeapResourceFactory.java
httpcomponents/httpclient/branches/4.2.x/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestBasicHttpCache.java
Modified: httpcomponents/httpclient/branches/4.2.x/RELEASE_NOTES.txt
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/branches/4.2.x/RELEASE_NOTES.txt?rev=1462070&r1=1462069&r2=1462070&view=diff
==============================================================================
--- httpcomponents/httpclient/branches/4.2.x/RELEASE_NOTES.txt (original)
+++ httpcomponents/httpclient/branches/4.2.x/RELEASE_NOTES.txt Thu Mar 28 12:36:34 2013
@@ -1,6 +1,10 @@
Changes since Release 4.2.3
-------------------
+* [HTTPCLIENT-1299] (regression) cache incorrectly disposes of the underlying cache resource
+ when storing variant entry.
+ Contributed by Oleg Kalnichevski <olegk at apache.org>
+
* [HTTPCLIENT-1320] Leverage javax.net.ssl.SSLSocketFactory#getDefault() to initialize SSL context
based on system defaults instead of using an internal custom routine.
Contributed by Abe Backus <abraham at backus.com> and Oleg Kalnichevski <olegk at apache.org>
Modified: httpcomponents/httpclient/branches/4.2.x/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/BasicHttpCache.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/branches/4.2.x/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/BasicHttpCache.java?rev=1462070&r1=1462069&r2=1462070&view=diff
==============================================================================
--- httpcomponents/httpclient/branches/4.2.x/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/BasicHttpCache.java (original)
+++ httpcomponents/httpclient/branches/4.2.x/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/BasicHttpCache.java Thu Mar 28 12:36:34 2013
@@ -200,7 +200,6 @@ class BasicHttpCache implements HttpCach
Resource resource = null;
if (oldResource != null) {
resource = resourceFactory.copy(requestId, entry.getResource());
- oldResource.dispose();
}
Map<String,String> variantMap = new HashMap<String,String>(src.getVariantMap());
variantMap.put(variantKey, variantCacheKey);
Modified: httpcomponents/httpclient/branches/4.2.x/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/HeapResourceFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/branches/4.2.x/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/HeapResourceFactory.java?rev=1462070&r1=1462069&r2=1462070&view=diff
==============================================================================
--- httpcomponents/httpclient/branches/4.2.x/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/HeapResourceFactory.java (original)
+++ httpcomponents/httpclient/branches/4.2.x/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/HeapResourceFactory.java Thu Mar 28 12:36:34 2013
@@ -59,7 +59,7 @@ public class HeapResourceFactory impleme
break;
}
}
- return new HeapResource(outstream.toByteArray());
+ return createResource(outstream.toByteArray());
}
public Resource copy(
@@ -73,7 +73,11 @@ public class HeapResourceFactory impleme
IOUtils.copyAndClose(resource.getInputStream(), outstream);
body = outstream.toByteArray();
}
- return new HeapResource(body);
+ return createResource(body);
+ }
+
+ Resource createResource(byte[] buf) {
+ return new HeapResource(buf);
}
}
Modified: httpcomponents/httpclient/branches/4.2.x/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestBasicHttpCache.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/branches/4.2.x/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestBasicHttpCache.java?rev=1462070&r1=1462069&r2=1462070&view=diff
==============================================================================
--- httpcomponents/httpclient/branches/4.2.x/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestBasicHttpCache.java (original)
+++ httpcomponents/httpclient/branches/4.2.x/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestBasicHttpCache.java Thu Mar 28 12:36:34 2013
@@ -34,6 +34,8 @@ import static org.junit.Assert.assertSam
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
@@ -237,7 +239,7 @@ public class TestBasicHttpCache {
Date responseReceived = new Date(now.getTime() - 1 * 1000L);
HttpResponse originResponse = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
- originResponse.setEntity(HttpTestUtils.makeBody((int) CacheConfig.DEFAULT_MAX_OBJECT_SIZE_BYTES + 1));
+ originResponse.setEntity(HttpTestUtils.makeBody(CacheConfig.DEFAULT_MAX_OBJECT_SIZE_BYTES + 1));
originResponse.setHeader("Cache-Control","public, max-age=3600");
originResponse.setHeader("Date", DateUtils.formatDate(responseGenerated));
originResponse.setHeader("ETag", "\"etag\"");
@@ -259,7 +261,7 @@ public class TestBasicHttpCache {
Date responseReceived = new Date(now.getTime() - 1 * 1000L);
HttpResponse originResponse = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
- originResponse.setEntity(HttpTestUtils.makeBody((int) CacheConfig.DEFAULT_MAX_OBJECT_SIZE_BYTES - 1));
+ originResponse.setEntity(HttpTestUtils.makeBody(CacheConfig.DEFAULT_MAX_OBJECT_SIZE_BYTES - 1));
originResponse.setHeader("Cache-Control","public, max-age=3600");
originResponse.setHeader("Date", DateUtils.formatDate(responseGenerated));
originResponse.setHeader("ETag", "\"etag\"");
@@ -406,4 +408,71 @@ public class TestBasicHttpCache {
assertTrue(inputStream.wasClosed());
}
+ static class DisposableResource implements Resource {
+
+ private static final long serialVersionUID = 1L;
+
+ private final byte[] b;
+ private boolean dispoased;
+
+ public DisposableResource(final byte[] b) {
+ super();
+ this.b = b;
+ }
+
+ byte[] getByteArray() {
+ return this.b;
+ }
+
+ public InputStream getInputStream() throws IOException {
+ if (dispoased) {
+ throw new IOException("Already dispoased");
+ }
+ return new ByteArrayInputStream(this.b);
+ }
+
+ public long length() {
+ return this.b.length;
+ }
+
+ public void dispose() {
+ this.dispoased = true;
+ }
+
+ }
+
+ @Test
+ public void testEntryUpdate() throws Exception {
+
+ HeapResourceFactory rf = new HeapResourceFactory() {
+
+ @Override
+ Resource createResource(byte[] buf) {
+ return new DisposableResource(buf);
+ }
+
+ };
+
+ impl = new BasicHttpCache(rf, backing, new CacheConfig());
+
+ HttpHost host = new HttpHost("foo.example.com");
+
+ HttpRequest origRequest = new HttpGet("http://foo.example.com/bar");
+ origRequest.setHeader("Accept-Encoding","gzip");
+
+ HttpResponse origResponse = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
+ origResponse.setEntity(HttpTestUtils.makeBody(128));
+ origResponse.setHeader("Date", DateUtils.formatDate(new Date()));
+ origResponse.setHeader("Cache-Control", "max-age=3600, public");
+ origResponse.setHeader("ETag", "\"etag\"");
+ origResponse.setHeader("Vary", "Accept-Encoding");
+ origResponse.setHeader("Content-Encoding","gzip");
+
+ HttpResponse response = impl.cacheAndReturnResponse(
+ host, origRequest, origResponse, new Date(), new Date());
+ HttpEntity entity = response.getEntity();
+ Assert.assertNotNull(entity);
+ IOUtils.copyAndClose(entity.getContent(), new ByteArrayOutputStream());
+ }
+
}