include the cause of a NonRepeatableRequestException when failing.
git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@758447 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
bc063a1ad0
commit
165507b8d7
|
@ -1,6 +1,10 @@
|
|||
Changes since 4.0 beta 2
|
||||
-------------------
|
||||
|
||||
* NonRepeatableRequestExceptions now include the cause that the original
|
||||
request failed.
|
||||
Contributed by Sam Berlin <sberlin at apache.org>
|
||||
|
||||
* [HTTPCLIENT-837] Fixed problem with the wire log skipping zero byte values
|
||||
if read one byte at a time.
|
||||
Contributed by Kirill Safonov <ksafonov at swiftteams.com>
|
||||
|
|
|
@ -62,4 +62,16 @@ public class NonRepeatableRequestException extends ProtocolException {
|
|||
super(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new NonRepeatableEntityException with the specified detail message.
|
||||
*
|
||||
* @param message The exception detail message
|
||||
* @param cause the cause
|
||||
*/
|
||||
public NonRepeatableRequestException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -392,14 +392,21 @@ public class DefaultRequestDirector implements RequestDirector {
|
|||
requestExec.preProcess(wrapper, httpProcessor, context);
|
||||
|
||||
boolean retrying = true;
|
||||
Exception retryReason = null;
|
||||
while (retrying) {
|
||||
// Increment total exec count (with redirects)
|
||||
execCount++;
|
||||
// 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");
|
||||
if(retryReason != null) {
|
||||
throw new NonRepeatableRequestException("Cannot retry request " +
|
||||
"with a non-repeatable request entity. The cause lists the " +
|
||||
"reason the original request failed.", retryReason);
|
||||
} else {
|
||||
throw new NonRepeatableRequestException("Cannot retry request " +
|
||||
"with a non-repeatable request entity.");
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
|
@ -422,6 +429,7 @@ public class DefaultRequestDirector implements RequestDirector {
|
|||
this.log.debug(ex.getMessage(), ex);
|
||||
}
|
||||
this.log.info("Retrying request");
|
||||
retryReason = ex;
|
||||
} else {
|
||||
throw ex;
|
||||
}
|
||||
|
|
|
@ -638,9 +638,15 @@ public class TestDefaultClientRequestDirector extends ServerTestBase {
|
|||
}
|
||||
|
||||
private static class FaultyHttpRequestExecutor extends HttpRequestExecutor {
|
||||
|
||||
|
||||
private static final String MARKER = "marker";
|
||||
|
||||
private final String failureMsg;
|
||||
|
||||
public FaultyHttpRequestExecutor(String failureMsg) {
|
||||
this.failureMsg = failureMsg;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpResponse execute(
|
||||
final HttpRequest request,
|
||||
|
@ -650,7 +656,7 @@ public class TestDefaultClientRequestDirector extends ServerTestBase {
|
|||
Object marker = context.getAttribute(MARKER);
|
||||
if (marker == null) {
|
||||
context.setAttribute(MARKER, Boolean.TRUE);
|
||||
throw new IOException("Oppsie");
|
||||
throw new IOException(failureMsg);
|
||||
}
|
||||
return super.execute(request, conn, context);
|
||||
}
|
||||
|
@ -658,10 +664,20 @@ public class TestDefaultClientRequestDirector extends ServerTestBase {
|
|||
}
|
||||
|
||||
private static class FaultyHttpClient extends DefaultHttpClient {
|
||||
|
||||
private final String failureMsg;
|
||||
|
||||
public FaultyHttpClient() {
|
||||
this("Oppsie");
|
||||
}
|
||||
|
||||
public FaultyHttpClient(String failureMsg) {
|
||||
this.failureMsg = failureMsg;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected HttpRequestExecutor createRequestExecutor() {
|
||||
return new FaultyHttpRequestExecutor();
|
||||
return new FaultyHttpRequestExecutor(failureMsg);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -716,11 +732,13 @@ public class TestDefaultClientRequestDirector extends ServerTestBase {
|
|||
assertEquals(1, myheaders.length);
|
||||
}
|
||||
|
||||
public void testNonRepatableEntity() throws Exception {
|
||||
public void testNonRepeatableEntity() throws Exception {
|
||||
int port = this.localServer.getServicePort();
|
||||
this.localServer.register("*", new SimpleService());
|
||||
|
||||
FaultyHttpClient client = new FaultyHttpClient();
|
||||
String failureMsg = "a message showing that this failed";
|
||||
|
||||
FaultyHttpClient client = new FaultyHttpClient(failureMsg);
|
||||
HttpContext context = new BasicHttpContext();
|
||||
|
||||
String s = "http://localhost:" + port;
|
||||
|
@ -735,7 +753,9 @@ public class TestDefaultClientRequestDirector extends ServerTestBase {
|
|||
fail("ClientProtocolException should have been thrown");
|
||||
} catch (ClientProtocolException ex) {
|
||||
assertTrue(ex.getCause() instanceof NonRepeatableRequestException);
|
||||
// expected
|
||||
NonRepeatableRequestException nonRepeat = (NonRepeatableRequestException)ex.getCause();
|
||||
assertTrue(nonRepeat.getCause() instanceof IOException);
|
||||
assertEquals(failureMsg, nonRepeat.getCause().getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue