From df92be5902b0a979f684d1b8e073506c199df3ac Mon Sep 17 00:00:00 2001 From: Oleg Kalnichevski Date: Sat, 7 Jun 2008 11:48:27 +0000 Subject: [PATCH] Better code for handling of non-repeatable requests git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@664326 13f79535-47bb-0310-9956-ffa450edef68 --- ...ava => NonRepeatableRequestException.java} | 12 +++++----- .../client/DefaultClientRequestDirector.java | 18 ++++++--------- .../client/EntityEnclosingRequestWrapper.java | 7 +++++- .../http/impl/client/RequestWrapper.java | 22 +++++++++++++++---- .../TestDefaultClientRequestDirector.java | 4 ++-- 5 files changed, 39 insertions(+), 24 deletions(-) rename module-client/src/main/java/org/apache/http/client/{NonRepeatableEntityException.java => NonRepeatableRequestException.java} (89%) diff --git a/module-client/src/main/java/org/apache/http/client/NonRepeatableEntityException.java b/module-client/src/main/java/org/apache/http/client/NonRepeatableRequestException.java similarity index 89% rename from module-client/src/main/java/org/apache/http/client/NonRepeatableEntityException.java rename to module-client/src/main/java/org/apache/http/client/NonRepeatableRequestException.java index 9b09bd9d0..f99b9c077 100644 --- a/module-client/src/main/java/org/apache/http/client/NonRepeatableEntityException.java +++ b/module-client/src/main/java/org/apache/http/client/NonRepeatableRequestException.java @@ -1,7 +1,7 @@ /* - * $HeadURL:$ - * $Revision:$ - * $Date:$ + * $HeadURL$ + * $Revision$ + * $Date$ * * ==================================================================== * @@ -40,14 +40,14 @@ * * @since 4.0 */ -public class NonRepeatableEntityException extends ProtocolException { +public class NonRepeatableRequestException extends ProtocolException { private static final long serialVersionUID = 82685265288806048L; /** * Creates a new NonRepeatableEntityException with a null detail message. */ - public NonRepeatableEntityException() { + public NonRepeatableRequestException() { super(); } @@ -56,7 +56,7 @@ public NonRepeatableEntityException() { * * @param message The exception detail message */ - public NonRepeatableEntityException(String message) { + public NonRepeatableRequestException(String message) { super(message); } diff --git a/module-client/src/main/java/org/apache/http/impl/client/DefaultClientRequestDirector.java b/module-client/src/main/java/org/apache/http/impl/client/DefaultClientRequestDirector.java index 6389d4dc7..36274e3c6 100644 --- a/module-client/src/main/java/org/apache/http/impl/client/DefaultClientRequestDirector.java +++ b/module-client/src/main/java/org/apache/http/impl/client/DefaultClientRequestDirector.java @@ -61,7 +61,7 @@ import org.apache.http.client.ClientRequestDirector; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.HttpRequestRetryHandler; -import org.apache.http.client.NonRepeatableEntityException; +import org.apache.http.client.NonRepeatableRequestException; import org.apache.http.client.RedirectException; import org.apache.http.client.RedirectHandler; import org.apache.http.client.UserTokenHandler; @@ -384,17 +384,13 @@ public HttpResponse execute(HttpHost target, HttpRequest request, boolean retrying = true; while (retrying) { + // Increment total exec count (with redirects) execCount++; - - if (execCount > 1) { - if (request instanceof HttpEntityEnclosingRequest) { - HttpEntity entity = - ((HttpEntityEnclosingRequest) request).getEntity(); - if (entity != null && !entity.isRepeatable()) { - throw new NonRepeatableEntityException( - "Cannot retry the request"); - } - } + // Increment exec count for this particular request + wrapper.incrementExecCount(); + if (wrapper.getExecCount() > 1 && !wrapper.isRepeatable()) { + throw new NonRepeatableRequestException("Cannot retry request " + + "with a non-repeatable request entity"); } try { diff --git a/module-client/src/main/java/org/apache/http/impl/client/EntityEnclosingRequestWrapper.java b/module-client/src/main/java/org/apache/http/impl/client/EntityEnclosingRequestWrapper.java index 924641689..b7ad4592f 100644 --- a/module-client/src/main/java/org/apache/http/impl/client/EntityEnclosingRequestWrapper.java +++ b/module-client/src/main/java/org/apache/http/impl/client/EntityEnclosingRequestWrapper.java @@ -74,5 +74,10 @@ public boolean expectContinue() { Header expect = getFirstHeader(HTTP.EXPECT_DIRECTIVE); return expect != null && HTTP.EXPECT_CONTINUE.equalsIgnoreCase(expect.getValue()); } - + + @Override + public boolean isRepeatable() { + return this.entity == null || this.entity.isRepeatable(); + } + } diff --git a/module-client/src/main/java/org/apache/http/impl/client/RequestWrapper.java b/module-client/src/main/java/org/apache/http/impl/client/RequestWrapper.java index 33d1639a7..a448168c6 100644 --- a/module-client/src/main/java/org/apache/http/impl/client/RequestWrapper.java +++ b/module-client/src/main/java/org/apache/http/impl/client/RequestWrapper.java @@ -64,6 +64,7 @@ class RequestWrapper extends AbstractHttpMessage implements HttpUriRequest { private URI uri; private String method; private ProtocolVersion version; + private int execCount; public RequestWrapper(final HttpRequest request) throws ProtocolException { super(); @@ -88,8 +89,15 @@ public RequestWrapper(final HttpRequest request) throws ProtocolException { this.method = requestLine.getMethod(); this.version = request.getProtocolVersion(); } + this.execCount = 0; } + public void resetHeaders() { + // Make a copy of original headers + this.headergroup.clear(); + setHeaders(this.original.getAllHeaders()); + } + public String getMethod() { return this.method; } @@ -147,10 +155,16 @@ public HttpRequest getOriginal() { return this.original; } - public void resetHeaders() { - // Make a copy of original headers - this.headergroup.clear(); - setHeaders(this.original.getAllHeaders()); + public boolean isRepeatable() { + return true; + } + + public int getExecCount() { + return this.execCount; + } + + public void incrementExecCount() { + this.execCount++; } } diff --git a/module-client/src/test/java/org/apache/http/impl/client/TestDefaultClientRequestDirector.java b/module-client/src/test/java/org/apache/http/impl/client/TestDefaultClientRequestDirector.java index 066d2e774..5dd685f34 100644 --- a/module-client/src/test/java/org/apache/http/impl/client/TestDefaultClientRequestDirector.java +++ b/module-client/src/test/java/org/apache/http/impl/client/TestDefaultClientRequestDirector.java @@ -50,7 +50,7 @@ import org.apache.http.HttpStatus; import org.apache.http.ProtocolVersion; import org.apache.http.client.HttpRequestRetryHandler; -import org.apache.http.client.NonRepeatableEntityException; +import org.apache.http.client.NonRepeatableRequestException; import org.apache.http.client.methods.AbortableHttpRequest; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; @@ -727,7 +727,7 @@ public void testNonRepatableEntity() throws Exception { try { client.execute(getServerHttp(), httppost, context); fail("NonRepeatableEntityException should have been thrown"); - } catch (NonRepeatableEntityException ex) { + } catch (NonRepeatableRequestException ex) { // expected } }