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 2012/12/17 18:11:37 UTC

svn commit: r1423024 - in /httpcomponents/httpclient/trunk/httpclient-cache/src: main/java/org/apache/http/impl/client/cache/CachingExec.java test/java/org/apache/http/impl/client/cache/TestCachingExec.java

Author: olegk
Date: Mon Dec 17 17:11:36 2012
New Revision: 1423024

URL: http://svn.apache.org/viewvc?rev=1423024&view=rev
Log:
HTTPCLIENT-1280: CachingExec catches SocketTimeoutException silently and closes the backend InputStream
Contributed by Francois-Xavier Bonnet <francois-xavier.bonnet at centraliens.net>

Modified:
    httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingExec.java
    httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingExec.java

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingExec.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingExec.java?rev=1423024&r1=1423023&r2=1423024&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingExec.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingExec.java Mon Dec 17 17:11:36 2012
@@ -804,8 +804,6 @@ public class CachingExec implements Clie
             try {
                 return Proxies.enhanceResponse(responseCache.cacheAndReturnResponse(
                         target, request, backendResponse, requestDate, responseDate));
-            } catch (IOException ioe) {
-                log.warn("Unable to store entries in cache", ioe);
             } finally {
                 backendResponse.close();
             }

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingExec.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingExec.java?rev=1423024&r1=1423023&r2=1423024&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingExec.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingExec.java Mon Dec 17 17:11:36 2012
@@ -43,6 +43,9 @@ import static org.junit.Assert.assertSam
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
+import java.io.InputStream;
+import java.net.SocketException;
+import java.net.SocketTimeoutException;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -69,11 +72,13 @@ import org.apache.http.client.methods.Ht
 import org.apache.http.client.methods.HttpUriRequest;
 import org.apache.http.client.protocol.HttpClientContext;
 import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.entity.InputStreamEntity;
 import org.apache.http.impl.client.execchain.ClientExecChain;
 import org.apache.http.impl.cookie.DateUtils;
 import org.apache.http.message.BasicHeader;
 import org.apache.http.message.BasicHttpRequest;
 import org.apache.http.message.BasicHttpResponse;
+import org.apache.http.util.EntityUtils;
 import org.easymock.Capture;
 import org.easymock.IExpectationSetters;
 import org.easymock.classextension.EasyMock;
@@ -1348,6 +1353,48 @@ public class TestCachingExec {
     }
 
     @Test
+    public void testSocketTimeoutExceptionIsNotSilentlyCatched()
+            throws Exception {
+        impl = new CachingExec(mockBackend, new BasicHttpCache(),
+                CacheConfig.DEFAULT);
+        Date now = new Date();
+
+        HttpRequestWrapper req1 = HttpRequestWrapper.wrap(new HttpGet(
+                "http://foo.example.com"));
+
+        HttpResponse resp1 = new BasicHttpResponse(HttpVersion.HTTP_1_1,
+                HttpStatus.SC_OK, "OK");
+        resp1.setEntity(new InputStreamEntity(new InputStream() {
+            private boolean closed = false;
+
+            @Override
+            public void close() throws IOException {
+                closed = true;
+            }
+
+            @Override
+            public int read() throws IOException {
+                if (closed)
+                    throw new SocketException("Socket closed");
+                throw new SocketTimeoutException("Read timed out");
+            }
+        }, 128));
+        resp1.setHeader("Date", DateUtils.formatDate(now));
+
+        backendExpectsAnyRequestAndReturn(resp1);
+
+        replayMocks();
+        try {
+            HttpResponse result1 = impl.execute(route, req1);
+            EntityUtils.toString(result1.getEntity());
+            Assert.fail("We should have had a SocketTimeoutException");
+        } catch (SocketTimeoutException e) {
+        }
+        verifyMocks();
+
+    }
+
+    @Test
     public void testIsSharedCache() {
         Assert.assertTrue(config.isSharedCache());
     }
@@ -1372,7 +1419,7 @@ public class TestCachingExec {
         expect(mockCache.cacheAndReturnResponse(same(host),
                 isA(HttpRequest.class), isA(HttpResponse.class),
                 isA(Date.class), isA(Date.class)))
-            .andThrow(new IOException()).anyTimes();
+            .andReturn(resp).anyTimes();
         expect(mockBackend.execute(
                 same(route),
                 isA(HttpRequestWrapper.class),