You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by gg...@apache.org on 2017/08/01 01:10:06 UTC

httpcomponents-client git commit: [HTTPCLIENT-1865] DefaultServiceUnavailableRetryStrategy does not respect HttpEntity#isRepeatable.

Repository: httpcomponents-client
Updated Branches:
  refs/heads/4.5.x c165c06a9 -> 7dfd236dc


[HTTPCLIENT-1865] DefaultServiceUnavailableRetryStrategy does not
respect HttpEntity#isRepeatable.

Project: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/repo
Commit: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/commit/7dfd236d
Tree: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/tree/7dfd236d
Diff: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/diff/7dfd236d

Branch: refs/heads/4.5.x
Commit: 7dfd236dc155e97c650c9da9b4b3f9234b3b2de9
Parents: c165c06
Author: Tomas Celaya <tj...@joyent.com>
Authored: Mon Jul 31 18:10:03 2017 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Jul 31 18:10:03 2017 -0700

----------------------------------------------------------------------
 RELEASE_NOTES.txt                               |  3 ++
 .../execchain/ServiceUnavailableRetryExec.java  |  3 +-
 .../TestServiceUnavailableRetryExec.java        | 32 ++++++++++++++++++++
 3 files changed, 37 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/httpcomponents-client/blob/7dfd236d/RELEASE_NOTES.txt
----------------------------------------------------------------------
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index 932e106..30bb4e6 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -8,6 +8,9 @@ Please note that as of 4.4 HttpClient requires Java 1.6 or newer.
 Changelog:
 -------------------
 
+* [HTTPCLIENT-1865] DefaultServiceUnavailableRetryStrategy does not respect HttpEntity#isRepeatable.
+  Contributed by Tomas Celaya <tjcelaya at joyent dot com>
+
 * [HTTPCLIENT-1833] Fix Windows Negotiate-NTLM handling of proxies.
   Contributed by Roman Stoffel <roman.stoffel at gamler.info>
 

http://git-wip-us.apache.org/repos/asf/httpcomponents-client/blob/7dfd236d/httpclient/src/main/java/org/apache/http/impl/execchain/ServiceUnavailableRetryExec.java
----------------------------------------------------------------------
diff --git a/httpclient/src/main/java/org/apache/http/impl/execchain/ServiceUnavailableRetryExec.java b/httpclient/src/main/java/org/apache/http/impl/execchain/ServiceUnavailableRetryExec.java
index 8b0c6f4..f2131df 100644
--- a/httpclient/src/main/java/org/apache/http/impl/execchain/ServiceUnavailableRetryExec.java
+++ b/httpclient/src/main/java/org/apache/http/impl/execchain/ServiceUnavailableRetryExec.java
@@ -85,7 +85,8 @@ public class ServiceUnavailableRetryExec implements ClientExecChain {
             final CloseableHttpResponse response = this.requestExecutor.execute(
                     route, request, context, execAware);
             try {
-                if (this.retryStrategy.retryRequest(response, c, context)) {
+                if (this.retryStrategy.retryRequest(response, c, context)
+                        && RequestEntityProxy.isRepeatable(request)) {
                     response.close();
                     final long nextInterval = this.retryStrategy.getRetryInterval();
                     if (nextInterval > 0) {

http://git-wip-us.apache.org/repos/asf/httpcomponents-client/blob/7dfd236d/httpclient/src/test/java/org/apache/http/impl/execchain/TestServiceUnavailableRetryExec.java
----------------------------------------------------------------------
diff --git a/httpclient/src/test/java/org/apache/http/impl/execchain/TestServiceUnavailableRetryExec.java b/httpclient/src/test/java/org/apache/http/impl/execchain/TestServiceUnavailableRetryExec.java
index 8356b6f..bd4f27b 100644
--- a/httpclient/src/test/java/org/apache/http/impl/execchain/TestServiceUnavailableRetryExec.java
+++ b/httpclient/src/test/java/org/apache/http/impl/execchain/TestServiceUnavailableRetryExec.java
@@ -26,12 +26,14 @@
  */
 package org.apache.http.impl.execchain;
 
+import org.apache.http.HttpEntity;
 import org.apache.http.HttpHost;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.ServiceUnavailableRetryStrategy;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpExecutionAware;
 import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPut;
 import org.apache.http.client.methods.HttpRequestWrapper;
 import org.apache.http.client.protocol.HttpClientContext;
 import org.apache.http.conn.routing.HttpRoute;
@@ -115,4 +117,34 @@ public class TestServiceUnavailableRetryExec {
             throw ex;
         }
     }
+
+    @Test
+    public void testNonRepeatableEntityResponseReturnedImmediately() throws Exception {
+        final HttpRoute route = new HttpRoute(target);
+
+        final HttpEntity entity = Mockito.mock(HttpEntity.class);
+        Mockito.when(entity.isRepeatable()).thenReturn(Boolean.FALSE);
+
+        final HttpPut put = new HttpPut("/test");
+        put.setEntity(entity);
+
+        final HttpRequestWrapper request = HttpRequestWrapper.wrap(put);
+        final HttpClientContext context = HttpClientContext.create();
+        final CloseableHttpResponse response = Mockito.mock(CloseableHttpResponse.class);
+
+        Mockito.when(requestExecutor.execute(
+                Mockito.eq(route),
+                Mockito.<HttpRequestWrapper>any(),
+                Mockito.<HttpClientContext>any(),
+                Mockito.<HttpExecutionAware>any())).thenReturn(response);
+
+        Mockito.when(retryStrategy.retryRequest(
+                Mockito.<HttpResponse>any(),
+                Mockito.anyInt(),
+                Mockito.<HttpContext>any())).thenReturn(Boolean.TRUE, Boolean.FALSE);
+
+        retryExec.execute(route, request, context, execAware);
+
+        Mockito.verify(response, Mockito.times(0)).close();
+    }
 }