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 2014/08/07 10:39:47 UTC
svn commit: r1616438 - in
/httpcomponents/httpasyncclient/trunk/httpasyncclient/src:
main/java/org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.java
test/java/org/apache/http/nio/client/integration/TestHttpAsyncPrematureTermination.java
Author: olegk
Date: Thu Aug 7 08:39:46 2014
New Revision: 1616438
URL: http://svn.apache.org/r1616438
Log:
HTTPASYNC-81: ensure request produce is closed in case of a premature exchange termination
Contributed by Markus Kull <markus.kull at 1und1.de>
Modified:
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsyncPrematureTermination.java
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.java?rev=1616438&r1=1616437&r2=1616438&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.java Thu Aug 7 08:39:46 2014
@@ -152,15 +152,14 @@ class DefaultClientExchangeHandlerImpl<T
final ContentDecoder decoder, final IOControl ioctrl) throws IOException {
this.exec.consumeContent(this.state, decoder, ioctrl);
if (!decoder.isCompleted() && this.responseConsumer.isDone()) {
- if (this.completed.compareAndSet(false, true)) {
- try {
- this.resultFuture.cancel();
- } finally {
- responseConsumer.close();
- }
- }
this.state.setNonReusable();
- releaseConnection();
+ try {
+ this.completed.set(true);
+ releaseConnection();
+ this.resultFuture.cancel();
+ } finally {
+ close();
+ }
}
}
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsyncPrematureTermination.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsyncPrematureTermination.java?rev=1616438&r1=1616437&r2=1616438&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsyncPrematureTermination.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsyncPrematureTermination.java Thu Aug 7 08:39:46 2014
@@ -33,6 +33,7 @@ import java.util.concurrent.ExecutionExc
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
import org.apache.http.HttpConnection;
import org.apache.http.HttpException;
@@ -53,6 +54,7 @@ import org.apache.http.nio.client.method
import org.apache.http.nio.entity.NStringEntity;
import org.apache.http.nio.protocol.BasicAsyncRequestConsumer;
import org.apache.http.nio.protocol.BasicAsyncRequestHandler;
+import org.apache.http.nio.protocol.BasicAsyncRequestProducer;
import org.apache.http.nio.protocol.BasicAsyncResponseProducer;
import org.apache.http.nio.protocol.HttpAsyncExchange;
import org.apache.http.nio.protocol.HttpAsyncRequestConsumer;
@@ -300,28 +302,32 @@ public class TestHttpAsyncPrematureTermi
final HttpHost target = start();
- final HttpAsyncRequestProducer producer = HttpAsyncMethods.create(target, new HttpGet("/"));
+ final AtomicInteger producerClosed = new AtomicInteger(0);
+ final AtomicInteger consumerClosed = new AtomicInteger(0);
- final AtomicBoolean closed = new AtomicBoolean(false);
- final AtomicBoolean cancelled = new AtomicBoolean(false);
- final AtomicBoolean failed = new AtomicBoolean(false);
+ final HttpAsyncRequestProducer producer = new BasicAsyncRequestProducer(target, new HttpGet("/")) {
+
+ @Override
+ public synchronized void close() throws IOException {
+ producerClosed.incrementAndGet();
+ super.close();
+ }
+ };
final HttpAsyncResponseConsumer<?> consumer = new HttpAsyncResponseConsumer<Object>() {
@Override
public void close() throws IOException {
- closed.set(true);
+ consumerClosed.incrementAndGet();
}
@Override
public boolean cancel() {
- cancelled.set(true);
return false;
}
@Override
public void failed(final Exception ex) {
- failed.set(true);
}
public void responseReceived(
@@ -355,8 +361,10 @@ public class TestHttpAsyncPrematureTermi
connMgr.shutdown(1000);
Assert.assertTrue(future.isCancelled());
- Assert.assertFalse(failed.get());
- Assert.assertTrue(closed.get());
+ Assert.assertTrue(future.isCancelled());
+
+ Assert.assertEquals(1, producerClosed.get());
+ Assert.assertEquals(1, consumerClosed.get());
}
}