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 2010/12/01 13:42:21 UTC
svn commit: r1040983 - in
/httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http:
impl/nio/client/ nio/client/
Author: olegk
Date: Wed Dec 1 12:42:20 2010
New Revision: 1040983
URL: http://svn.apache.org/viewvc?rev=1040983&view=rev
Log:
API changes; more code refactoring
Modified:
httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicHttpAsyncClient.java
httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicHttpAsyncExchangeHandler.java
httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/ConnState.java
httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpAsyncExchange.java
httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/NHttpClientProtocolHandler.java
httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/nio/client/HttpAsyncExchangeHandler.java
Modified: httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicHttpAsyncClient.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicHttpAsyncClient.java?rev=1040983&r1=1040982&r2=1040983&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicHttpAsyncClient.java (original)
+++ httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicHttpAsyncClient.java Wed Dec 1 12:42:20 2010
@@ -52,6 +52,7 @@ import org.apache.http.params.CoreConnec
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.params.HttpParams;
import org.apache.http.params.SyncBasicHttpParams;
+import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpProcessor;
import org.apache.http.protocol.ImmutableHttpProcessor;
import org.apache.http.protocol.RequestConnControl;
@@ -129,9 +130,7 @@ public class BasicHttpAsyncClient implem
private void doExecute() {
NHttpClientProtocolHandler handler = new NHttpClientProtocolHandler(
- createHttpProcessor(),
- createConnectionReuseStrategy(),
- this.params);
+ createConnectionReuseStrategy());
IOEventDispatch ioEventDispatch = new InternalClientEventDispatch(handler, this.params);
try {
this.ioReactor.execute(ioEventDispatch);
@@ -170,9 +169,13 @@ public class BasicHttpAsyncClient implem
public <T> Future<T> execute(
final HttpAsyncExchangeHandler<T> handler, final FutureCallback<T> callback) {
- HttpRoute route = new HttpRoute(handler.getTarget());
HttpAsyncExchange<T> httpexchange = new HttpAsyncExchange<T>(
- route, null, this.sessmrg, handler, callback);
+ handler,
+ callback,
+ this.sessmrg,
+ createHttpProcessor(),
+ new BasicHttpContext(),
+ this.params);
return httpexchange.getResultFuture();
}
Modified: httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicHttpAsyncExchangeHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicHttpAsyncExchangeHandler.java?rev=1040983&r1=1040982&r2=1040983&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicHttpAsyncExchangeHandler.java (original)
+++ httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicHttpAsyncExchangeHandler.java Wed Dec 1 12:42:20 2010
@@ -48,12 +48,14 @@ public class BasicHttpAsyncExchangeHandl
private final HttpHost target;
private final HttpRequest request;
- private HttpResponse response;
- private ProducingNHttpEntity contentProducingEntity;
- private ConsumingNHttpEntity contentConsumingEntity;
+ private volatile HttpResponse response;
+ private volatile ProducingNHttpEntity contentProducingEntity;
+ private volatile ConsumingNHttpEntity contentConsumingEntity;
+ private volatile HttpResponse result;
+ private volatile Exception ex;
+ private volatile boolean completed;
- public BasicHttpAsyncExchangeHandler(
- final HttpHost target, final HttpRequest request) {
+ public BasicHttpAsyncExchangeHandler(final HttpHost target, final HttpRequest request) {
super();
if (target == null) {
throw new IllegalArgumentException("Target host may not be null");
@@ -65,7 +67,7 @@ public class BasicHttpAsyncExchangeHandl
this.request = request;
}
- public HttpRequest getRequest() {
+ public HttpRequest generateRequest() {
return this.request;
}
@@ -121,56 +123,87 @@ public class BasicHttpAsyncExchangeHandl
return this.contentProducingEntity;
}
- public void produceContent(
+ public synchronized void produceContent(
final ContentEncoder encoder, final IOControl ioctrl) throws IOException {
ProducingNHttpEntity producer = getProducingHttpEntity();
producer.produceContent(encoder, ioctrl);
}
- public void responseReceived(final HttpResponse response) {
+ public synchronized void responseReceived(final HttpResponse response) {
if (this.response != null) {
throw new IllegalStateException("HTTP response already set");
}
this.response = response;
}
- public void consumeContent(
+ public synchronized void consumeContent(
final ContentDecoder decoder, final IOControl ioctrl) throws IOException {
ConsumingNHttpEntity consumer = getConsumingHttpEntity();
consumer.consumeContent(decoder, ioctrl);
}
- private void shutdown() {
+ private void reset() {
if (this.contentProducingEntity != null) {
try {
this.contentProducingEntity.finish();
+ this.contentProducingEntity = null;
} catch (IOException ex) {
}
}
if (this.contentConsumingEntity != null) {
try {
this.contentConsumingEntity.finish();
+ this.contentConsumingEntity = null;
} catch (IOException ex) {
}
}
}
- public void cancelled() {
- shutdown();
+ public synchronized void cancel() {
+ if (this.completed) {
+ return;
+ }
+ this.completed = true;
+ this.response = null;
+ reset();
}
- public void failed(final Exception ex) {
- shutdown();
+ public synchronized void failed(final Exception ex) {
+ if (this.completed) {
+ return;
+ }
+ this.completed = true;
+ this.ex = ex;
+ this.response = null;
+ reset();
}
- public HttpResponse completed() {
- if (this.response == null) {
- throw new IllegalStateException("HTTP response is null");
+ public synchronized void completed() {
+ if (this.completed) {
+ return;
+ }
+ this.completed = true;
+ if (this.response != null) {
+ this.result = this.response;
+ this.result.setEntity(this.contentConsumingEntity);
}
- HttpResponse response = this.response;
- response.setEntity(this.contentConsumingEntity);
- shutdown();
- return response;
+ reset();
+ }
+
+ public boolean isCompleted() {
+ return this.completed;
+ }
+
+ public Exception getException() {
+ return this.ex;
+ }
+
+ public void setEx(Exception ex) {
+ this.ex = ex;
+ }
+
+ public HttpResponse getResult() {
+ return this.response;
}
}
Modified: httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/ConnState.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/ConnState.java?rev=1040983&r1=1040982&r2=1040983&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/ConnState.java (original)
+++ httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/ConnState.java Wed Dec 1 12:42:20 2010
@@ -28,6 +28,7 @@ package org.apache.http.impl.nio.client;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
+import org.apache.http.nio.client.HttpAsyncExchangeHandler;
class ConnState {
@@ -35,7 +36,7 @@ class ConnState {
private MessageState responseState;
private HttpRequest request;
private HttpResponse response;
- private HttpAsyncExchange<?> httpexchange;
+ private HttpAsyncExchangeHandler<?> handler;
private boolean valid;
private int timeout;
@@ -78,12 +79,12 @@ class ConnState {
this.response = response;
}
- public void setHttpExchange(final HttpAsyncExchange<?> httpexchange) {
- this.httpexchange = httpexchange;
+ public void setHandler(final HttpAsyncExchangeHandler<?> handler) {
+ this.handler = handler;
}
- public HttpAsyncExchange<?> getHttpExchange() {
- return this.httpexchange;
+ public HttpAsyncExchangeHandler<?> getHandler() {
+ return this.handler;
}
public int getTimeout() {
@@ -107,7 +108,7 @@ class ConnState {
public void reset() {
resetInput();
resetOutput();
- this.httpexchange = null;
+ this.handler = null;
}
public boolean isValid() {
Modified: httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpAsyncExchange.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpAsyncExchange.java?rev=1040983&r1=1040982&r2=1040983&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpAsyncExchange.java (original)
+++ httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpAsyncExchange.java Wed Dec 1 12:42:20 2010
@@ -26,91 +26,150 @@
*/
package org.apache.http.impl.nio.client;
+import java.io.IOException;
import java.nio.channels.SelectionKey;
import java.util.concurrent.Future;
+import org.apache.http.HttpException;
+import org.apache.http.HttpHost;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.nio.ContentDecoder;
+import org.apache.http.nio.ContentEncoder;
+import org.apache.http.nio.IOControl;
import org.apache.http.nio.client.HttpAsyncExchangeHandler;
import org.apache.http.nio.concurrent.BasicFuture;
import org.apache.http.nio.concurrent.FutureCallback;
import org.apache.http.nio.conn.IOSessionManager;
import org.apache.http.nio.conn.ManagedIOSession;
import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.params.DefaultedHttpParams;
+import org.apache.http.params.HttpParams;
+import org.apache.http.protocol.ExecutionContext;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.protocol.HttpProcessor;
-class HttpAsyncExchange<T> {
+class HttpAsyncExchange<T> implements HttpAsyncExchangeHandler<T> {
public static final String HTTP_EXCHANGE = "http.nio.http-exchange";
- private final Future<ManagedIOSession> sessionFuture;
+ private final IOSessionManager<HttpRoute> sessmrg;
+ private final HttpProcessor httppocessor;
+ private final HttpContext localContext;
+ private final HttpParams params;
private final BasicFuture<T> resultFuture;
private final HttpAsyncExchangeHandler<T> handler;
+ private Future<ManagedIOSession> sessionFuture;
private ManagedIOSession managedSession;
public HttpAsyncExchange(
- final HttpRoute route,
- final Object state,
- final IOSessionManager<HttpRoute> sessmrg,
final HttpAsyncExchangeHandler<T> handler,
- final FutureCallback<T> callback) {
+ final FutureCallback<T> callback,
+ final IOSessionManager<HttpRoute> sessmrg,
+ final HttpProcessor httppocessor,
+ final HttpContext localContext,
+ final HttpParams params) {
super();
- this.sessionFuture = sessmrg.leaseSession(route, state, new InternalFutureCallback());
- this.resultFuture = new BasicFuture<T>(callback);
this.handler = handler;
- }
+ this.resultFuture = new BasicFuture<T>(callback);
+ this.sessmrg = sessmrg;
+ this.httppocessor = httppocessor;
+ this.localContext = localContext;
+ this.params = params;
- public HttpAsyncExchangeHandler<T> getHandler() {
- return this.handler;
+ HttpRoute route = new HttpRoute(handler.getTarget());
+ this.sessionFuture = this.sessmrg.leaseSession(route, null, new InternalFutureCallback());
}
public Future<T> getResultFuture() {
return this.resultFuture;
}
+ public HttpHost getTarget() {
+ return this.handler.getTarget();
+ }
+
+ public HttpRequest generateRequest() throws IOException, HttpException {
+ HttpRequest request = this.handler.generateRequest();
+ HttpHost target = this.handler.getTarget();
+ request.setParams(new DefaultedHttpParams(request.getParams(), this.params));
+ this.localContext.setAttribute(ExecutionContext.HTTP_REQUEST, request);
+ this.localContext.setAttribute(ExecutionContext.HTTP_TARGET_HOST, target);
+ this.httppocessor.process(request, this.localContext);
+ return request;
+ }
+
+ public void produceContent(
+ final ContentEncoder encoder, final IOControl ioctrl) throws IOException {
+ this.handler.produceContent(encoder, ioctrl);
+ }
+
+ public void responseReceived(final HttpResponse response) throws IOException, HttpException {
+ response.setParams(new DefaultedHttpParams(response.getParams(), this.params));
+ this.localContext.setAttribute(ExecutionContext.HTTP_RESPONSE, response);
+ this.httppocessor.process(response, this.localContext);
+ this.handler.responseReceived(response);
+ }
+
+ public void consumeContent(
+ final ContentDecoder decoder, final IOControl ioctrl) throws IOException {
+ this.handler.consumeContent(decoder, ioctrl);
+ }
+
public synchronized void completed() {
try {
if (this.managedSession != null) {
this.managedSession.releaseSession();
}
this.managedSession = null;
- T result = this.handler.completed();
- this.resultFuture.completed(result);
+ this.handler.completed();
+ this.resultFuture.completed(this.handler.getResult());
} catch (RuntimeException runex) {
this.resultFuture.failed(runex);
throw runex;
}
}
- public synchronized void shutdown() {
+ public synchronized void failed(final Exception ex) {
try {
this.sessionFuture.cancel(true);
if (this.managedSession != null) {
this.managedSession.abortSession();
}
this.managedSession = null;
- this.handler.cancelled();
- this.resultFuture.cancel(true);
+ this.handler.failed(ex);
+ this.resultFuture.failed(ex);
} catch (RuntimeException runex) {
- this.resultFuture.failed(runex);
+ this.resultFuture.failed(ex);
throw runex;
}
}
- public synchronized void failed(final Exception ex) {
+ public synchronized void cancel() {
try {
this.sessionFuture.cancel(true);
if (this.managedSession != null) {
this.managedSession.abortSession();
}
this.managedSession = null;
- this.handler.failed(ex);
- this.resultFuture.failed(ex);
+ this.handler.cancel();
+ this.resultFuture.cancel(true);
} catch (RuntimeException runex) {
- this.resultFuture.failed(ex);
+ this.resultFuture.failed(runex);
throw runex;
}
}
+ public boolean isCompleted() {
+ return this.handler.isCompleted();
+ }
+
+ public T getResult() {
+ return this.handler.getResult();
+ }
+
private synchronized void sessionRequestCompleted(final ManagedIOSession session) {
this.managedSession = session;
IOSession iosession = session.getSession();
@@ -128,7 +187,7 @@ class HttpAsyncExchange<T> {
private synchronized void sessionRequestCancelled() {
try {
- this.handler.cancelled();
+ this.handler.cancel();
} finally {
this.resultFuture.cancel(true);
}
Modified: httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/NHttpClientProtocolHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/NHttpClientProtocolHandler.java?rev=1040983&r1=1040982&r2=1040983&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/NHttpClientProtocolHandler.java (original)
+++ httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/NHttpClientProtocolHandler.java Wed Dec 1 12:42:20 2010
@@ -45,11 +45,8 @@ import org.apache.http.nio.NHttpClientHa
import org.apache.http.nio.NHttpConnection;
import org.apache.http.nio.client.HttpAsyncExchangeHandler;
import org.apache.http.params.CoreProtocolPNames;
-import org.apache.http.params.DefaultedHttpParams;
-import org.apache.http.params.HttpParams;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpProcessor;
/**
* Fully asynchronous HTTP client side protocol handler that implements the
@@ -66,26 +63,11 @@ class NHttpClientProtocolHandler impleme
private static final String CONN_STATE = "http.nio.conn-state";
- private final HttpProcessor httpProcessor;
private final ConnectionReuseStrategy connStrategy;
- private final HttpParams params;
public NHttpClientProtocolHandler(
- final HttpProcessor httpProcessor,
- final ConnectionReuseStrategy connStrategy,
- final HttpParams params) {
- if (httpProcessor == null) {
- throw new IllegalArgumentException("HTTP processor may not be null.");
- }
- if (connStrategy == null) {
- throw new IllegalArgumentException("Connection reuse strategy may not be null");
- }
- if (params == null) {
- throw new IllegalArgumentException("HTTP parameters may not be null");
- }
- this.httpProcessor = httpProcessor;
+ final ConnectionReuseStrategy connStrategy) {
this.connStrategy = connStrategy;
- this.params = params;
this.log = LogFactory.getLog(getClass());
}
@@ -127,9 +109,9 @@ class NHttpClientProtocolHandler impleme
this.log.debug("Disconnected " + formatState(conn, connState));
}
if (connState != null) {
- HttpAsyncExchange<?> httpexchange = connState.getHttpExchange();
- if (httpexchange != null) {
- httpexchange.shutdown();
+ HttpAsyncExchangeHandler<?> handler = connState.getHandler();
+ if (handler != null && !handler.isCompleted()) {
+ handler.cancel();
}
}
}
@@ -139,9 +121,9 @@ class NHttpClientProtocolHandler impleme
ConnState connState = getConnState(context);
this.log.error("HTTP protocol exception: " + ex.getMessage(), ex);
if (connState != null) {
- HttpAsyncExchange<?> httpexchange = connState.getHttpExchange();
- if (httpexchange != null) {
- httpexchange.failed(ex);
+ HttpAsyncExchangeHandler<?> handler = connState.getHandler();
+ if (handler != null && !handler.isCompleted()) {
+ handler.failed(ex);
}
}
closeConnection(conn);
@@ -152,9 +134,9 @@ class NHttpClientProtocolHandler impleme
ConnState connState = getConnState(context);
this.log.error("I/O error: " + ex.getMessage(), ex);
if (connState != null) {
- HttpAsyncExchange<?> httpexchange = connState.getHttpExchange();
- if (httpexchange != null) {
- httpexchange.failed(ex);
+ HttpAsyncExchangeHandler<?> handler = connState.getHandler();
+ if (handler != null && !handler.isCompleted()) {
+ handler.failed(ex);
}
}
shutdownConnection(conn);
@@ -163,30 +145,24 @@ class NHttpClientProtocolHandler impleme
public void requestReady(final NHttpClientConnection conn) {
HttpContext context = conn.getContext();
ConnState connState = getConnState(context);
- HttpAsyncExchange<?> httpexchange = getHttpExchange(context);
+ HttpAsyncExchangeHandler<?> handler = getHandler(context);
if (this.log.isDebugEnabled()) {
this.log.debug("Request ready " + formatState(conn, connState));
}
if (connState.getRequestState() != MessageState.READY) {
return;
}
- if (httpexchange == null || httpexchange.getResultFuture().isDone()) {
+ if (handler == null || handler.isCompleted()) {
if (this.log.isDebugEnabled()) {
this.log.debug("No request submitted " + formatState(conn, connState));
}
return;
}
- connState.setHttpExchange(httpexchange);
- HttpAsyncExchangeHandler<?> handler = connState.getHttpExchange().getHandler();
+ connState.setHandler(handler);
try {
- HttpRequest request = handler.getRequest();
- request.setParams(new DefaultedHttpParams(request.getParams(), this.params));
-
+ HttpRequest request = handler.generateRequest();
connState.setRequest(request);
- context.setAttribute(ExecutionContext.HTTP_REQUEST, request);
- this.httpProcessor.process(request, context);
-
HttpEntityEnclosingRequest entityReq = null;
if (request instanceof HttpEntityEnclosingRequest) {
entityReq = (HttpEntityEnclosingRequest) request;
@@ -198,7 +174,7 @@ class NHttpClientProtocolHandler impleme
if (entityReq.expectContinue()) {
int timeout = conn.getSocketTimeout();
connState.setTimeout(timeout);
- timeout = this.params.getIntParameter(
+ timeout = request.getParams().getIntParameter(
CoreProtocolPNames.WAIT_FOR_CONTINUE, 3000);
conn.setSocketTimeout(timeout);
connState.setRequestState(MessageState.ACK);
@@ -211,11 +187,11 @@ class NHttpClientProtocolHandler impleme
} catch (IOException ex) {
this.log.error("I/O error: " + ex.getMessage(), ex);
shutdownConnection(conn);
- httpexchange.failed(ex);
+ handler.failed(ex);
} catch (HttpException ex) {
this.log.error("HTTP protocol exception: " + ex.getMessage(), ex);
closeConnection(conn);
- httpexchange.failed(ex);
+ handler.failed(ex);
}
}
@@ -225,8 +201,7 @@ class NHttpClientProtocolHandler impleme
if (this.log.isDebugEnabled()) {
this.log.debug("Input ready " + formatState(conn, connState));
}
- HttpAsyncExchange<?> httpexchange = connState.getHttpExchange();
- HttpAsyncExchangeHandler<?> handler = httpexchange.getHandler();
+ HttpAsyncExchangeHandler<?> handler = connState.getHandler();
try {
handler.consumeContent(decoder, conn);
if (decoder.isCompleted()) {
@@ -234,8 +209,8 @@ class NHttpClientProtocolHandler impleme
}
} catch (IOException ex) {
this.log.error("I/O error: " + ex.getMessage(), ex);
+ handler.failed(ex);
shutdownConnection(conn);
- httpexchange.failed(ex);
}
}
@@ -245,8 +220,7 @@ class NHttpClientProtocolHandler impleme
if (this.log.isDebugEnabled()) {
this.log.debug("Output ready " + formatState(conn, connState));
}
- HttpAsyncExchange<?> httpexchange = connState.getHttpExchange();
- HttpAsyncExchangeHandler<?> handler = httpexchange.getHandler();
+ HttpAsyncExchangeHandler<?> handler = connState.getHandler();
try {
if (connState.getRequestState() == MessageState.ACK) {
conn.suspendOutput();
@@ -259,7 +233,7 @@ class NHttpClientProtocolHandler impleme
} catch (IOException ex) {
this.log.error("I/O error: " + ex.getMessage(), ex);
shutdownConnection(conn);
- httpexchange.failed(ex);
+ handler.failed(ex);
}
}
@@ -269,12 +243,9 @@ class NHttpClientProtocolHandler impleme
if (this.log.isDebugEnabled()) {
this.log.debug("Response received " + formatState(conn, connState));
}
- HttpAsyncExchange<?> httpexchange = connState.getHttpExchange();
- HttpAsyncExchangeHandler<?> handler = httpexchange.getHandler();
+ HttpAsyncExchangeHandler<?> handler = connState.getHandler();
try {
HttpResponse response = conn.getHttpResponse();
- response.setParams(new DefaultedHttpParams(response.getParams(), this.params));
-
HttpRequest request = connState.getRequest();
int statusCode = response.getStatusLine().getStatusCode();
@@ -298,25 +269,18 @@ class NHttpClientProtocolHandler impleme
conn.suspendOutput();
}
}
- context.setAttribute(ExecutionContext.HTTP_RESPONSE, response);
+ handler.responseReceived(response);
if (!canResponseHaveBody(request, response)) {
- conn.resetInput();
- response.setEntity(null);
- this.httpProcessor.process(response, context);
- handler.responseReceived(response);
processResponse(conn, connState);
- } else {
- this.httpProcessor.process(response, context);
- handler.responseReceived(response);
}
} catch (IOException ex) {
this.log.error("I/O error: " + ex.getMessage(), ex);
shutdownConnection(conn);
- httpexchange.failed(ex);
+ handler.failed(ex);
} catch (HttpException ex) {
this.log.error("HTTP protocol exception: " + ex.getMessage(), ex);
closeConnection(conn);
- httpexchange.failed(ex);
+ handler.failed(ex);
}
}
@@ -326,7 +290,7 @@ class NHttpClientProtocolHandler impleme
if (this.log.isDebugEnabled()) {
this.log.debug("Timeout " + formatState(conn, connState));
}
- HttpAsyncExchange<?> httpexchange = connState.getHttpExchange();
+ HttpAsyncExchangeHandler<?> handler = connState.getHandler();
try {
if (connState.getRequestState() == MessageState.ACK) {
continueRequest(conn, connState);
@@ -346,7 +310,7 @@ class NHttpClientProtocolHandler impleme
} catch (IOException ex) {
this.log.error("I/O error: " + ex.getMessage(), ex);
shutdownConnection(conn);
- httpexchange.failed(ex);
+ handler.failed(ex);
}
}
@@ -354,8 +318,8 @@ class NHttpClientProtocolHandler impleme
return (ConnState) context.getAttribute(CONN_STATE);
}
- private HttpAsyncExchange<?> getHttpExchange(final HttpContext context) {
- return (HttpAsyncExchange<?>) context.getAttribute(HttpAsyncExchange.HTTP_EXCHANGE);
+ private HttpAsyncExchangeHandler<?> getHandler(final HttpContext context) {
+ return (HttpAsyncExchangeHandler<?>) context.getAttribute(HttpAsyncExchange.HTTP_EXCHANGE);
}
private void continueRequest(
@@ -378,7 +342,7 @@ class NHttpClientProtocolHandler impleme
private void processResponse(
final NHttpClientConnection conn,
final ConnState connState) throws IOException {
- HttpAsyncExchange<?> httpexchange = connState.getHttpExchange();
+ HttpAsyncExchangeHandler<?> handler = connState.getHandler();
if (!connState.isValid()) {
conn.close();
}
@@ -390,7 +354,7 @@ class NHttpClientProtocolHandler impleme
if (this.log.isDebugEnabled()) {
this.log.debug("Response processed " + formatState(conn, connState));
}
- httpexchange.completed();
+ handler.completed();
if (conn.isOpen()) {
// Ready for another request
connState.reset();
Modified: httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/nio/client/HttpAsyncExchangeHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/nio/client/HttpAsyncExchangeHandler.java?rev=1040983&r1=1040982&r2=1040983&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/nio/client/HttpAsyncExchangeHandler.java (original)
+++ httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/nio/client/HttpAsyncExchangeHandler.java Wed Dec 1 12:42:20 2010
@@ -28,6 +28,7 @@ package org.apache.http.nio.client;
import java.io.IOException;
+import org.apache.http.HttpException;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
@@ -39,18 +40,22 @@ public interface HttpAsyncExchangeHandle
HttpHost getTarget();
- HttpRequest getRequest();
+ HttpRequest generateRequest() throws IOException, HttpException;
void produceContent(ContentEncoder encoder, IOControl ioctrl) throws IOException;
- void responseReceived(HttpResponse response);
+ void responseReceived(HttpResponse response) throws IOException, HttpException;
void consumeContent(ContentDecoder decoder, IOControl ioctrl) throws IOException;
+ void completed();
+
void failed(Exception ex);
- void cancelled();
+ void cancel();
+
+ boolean isCompleted();
- T completed();
+ T getResult();
}