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 2013/01/29 15:34:57 UTC
svn commit: r1439908 - in /httpcomponents/httpcore/trunk/httpcore-nio/src:
main/java/org/apache/http/nio/protocol/
test/java/org/apache/http/nio/protocol/
Author: olegk
Date: Tue Jan 29 14:34:57 2013
New Revision: 1439908
URL: http://svn.apache.org/viewvc?rev=1439908&view=rev
Log:
Redesign of the client exchange handler API
Added:
httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncClientExchangeHandler.java
- copied, changed from r1439907, httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestExecutionHandler.java
httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncClientExchangeHandler.java (with props)
httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncClientExchangeHandler.java (contents, props changed)
- copied, changed from r1439907, httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncRequestExecutionHandler.java
Removed:
httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncRequestExecutionHandler.java
Modified:
httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestExecutionHandler.java
httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequestExecutionHandler.java
httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequestExecutor.java
httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequester.java
httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncRequestExecutor.java
httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncRequester.java
Copied: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncClientExchangeHandler.java (from r1439907, httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestExecutionHandler.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncClientExchangeHandler.java?p2=httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncClientExchangeHandler.java&p1=httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestExecutionHandler.java&r1=1439907&r2=1439908&rev=1439908&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestExecutionHandler.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncClientExchangeHandler.java Tue Jan 29 14:34:57 2013
@@ -32,7 +32,6 @@ import java.util.concurrent.Future;
import org.apache.http.ConnectionReuseStrategy;
import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.concurrent.BasicFuture;
@@ -41,104 +40,58 @@ import org.apache.http.impl.DefaultConne
import org.apache.http.nio.ContentDecoder;
import org.apache.http.nio.ContentEncoder;
import org.apache.http.nio.IOControl;
-import org.apache.http.params.HttpParams;
+import org.apache.http.nio.NHttpClientConnection;
+import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.HttpProcessor;
import org.apache.http.util.Args;
/**
- * Basic implementation of {@link HttpAsyncRequestExecutionHandler} that executes
+ * Basic implementation of {@link HttpAsyncClientExchangeHandler} that executes
* a single HTTP request / response exchange.
*
* @param <T> the result type of request execution.
- * @since 4.2
+ * @since 4.3
*/
-@SuppressWarnings("deprecation")
-public class BasicAsyncRequestExecutionHandler<T> implements HttpAsyncRequestExecutionHandler<T> {
+public class BasicAsyncClientExchangeHandler<T> implements HttpAsyncClientExchangeHandler {
private final HttpAsyncRequestProducer requestProducer;
private final HttpAsyncResponseConsumer<T> responseConsumer;
private final BasicFuture<T> future;
private final HttpContext localContext;
+ private final NHttpClientConnection conn;
private final HttpProcessor httppocessor;
- private final ConnectionReuseStrategy reuseStrategy;
+ private final ConnectionReuseStrategy connReuseStrategy;
private volatile boolean requestSent;
/**
- * @deprecated (4.3) use
- * {@link BasicAsyncRequestExecutionHandler#BasicAsyncRequestExecutionHandler(
- * HttpAsyncRequestProducer, HttpAsyncResponseConsumer, FutureCallback, HttpContext,
- * HttpProcessor, ConnectionReuseStrategy)}
- */
- @Deprecated
- public BasicAsyncRequestExecutionHandler(
- final HttpAsyncRequestProducer requestProducer,
- final HttpAsyncResponseConsumer<T> responseConsumer,
- final FutureCallback<T> callback,
- final HttpContext localContext,
- final HttpProcessor httppocessor,
- final ConnectionReuseStrategy reuseStrategy,
- final HttpParams params) {
- super();
- Args.notNull(requestProducer, "Request producer");
- Args.notNull(responseConsumer, "Response consumer");
- Args.notNull(localContext, "HTTP context");
- Args.notNull(httppocessor, "HTTP processor");
- Args.notNull(reuseStrategy, "Connection reuse strategy");
- Args.notNull(params, "HTTP parameters");
- this.requestProducer = requestProducer;
- this.responseConsumer = responseConsumer;
- this.future = new BasicFuture<T>(callback);
- this.localContext = localContext;
- this.httppocessor = httppocessor;
- this.reuseStrategy = reuseStrategy;
- }
-
- /**
- * @deprecated (4.3) use
- * {@link BasicAsyncRequestExecutionHandler#BasicAsyncRequestExecutionHandler(
- * HttpAsyncRequestProducer, HttpAsyncResponseConsumer, FutureCallback, HttpContext,
- * HttpProcessor, ConnectionReuseStrategy)}
- */
- @Deprecated
- public BasicAsyncRequestExecutionHandler(
- final HttpAsyncRequestProducer requestProducer,
- final HttpAsyncResponseConsumer<T> responseConsumer,
- final HttpContext localContext,
- final HttpProcessor httppocessor,
- final ConnectionReuseStrategy reuseStrategy,
- final HttpParams params) {
- this(requestProducer, responseConsumer, null, localContext, httppocessor, reuseStrategy, params);
- }
-
- /**
* Creates new instance of BasicAsyncRequestExecutionHandler.
*
* @param requestProducer the request producer.
* @param responseConsumer the response consumer.
* @param callback the future callback invoked when the operation is completed.
* @param localContext the local execution context.
+ * @param conn the actual connection.
* @param httppocessor the HTTP protocol processor.
- * @param reuseStrategy the connection re-use strategy. If <code>null</code>
- * {@link DefaultConnectionReuseStrategy#INSTANCE} will be used.
- *
- * @since 4.3
+ * @param connReuseStrategy the connection re-use strategy.
*/
- public BasicAsyncRequestExecutionHandler(
+ public BasicAsyncClientExchangeHandler(
final HttpAsyncRequestProducer requestProducer,
final HttpAsyncResponseConsumer<T> responseConsumer,
final FutureCallback<T> callback,
final HttpContext localContext,
+ final NHttpClientConnection conn,
final HttpProcessor httppocessor,
- final ConnectionReuseStrategy reuseStrategy) {
+ final ConnectionReuseStrategy connReuseStrategy) {
super();
this.requestProducer = Args.notNull(requestProducer, "Request producer");
this.responseConsumer = Args.notNull(responseConsumer, "Response consumer");
this.future = new BasicFuture<T>(callback);
this.localContext = Args.notNull(localContext, "HTTP context");
+ this.conn = Args.notNull(conn, "HTTP connection");
this.httppocessor = Args.notNull(httppocessor, "HTTP processor");
- this.reuseStrategy = reuseStrategy != null ? reuseStrategy :
+ this.connReuseStrategy = connReuseStrategy != null ? connReuseStrategy :
DefaultConnectionReuseStrategy.INSTANCE;
}
@@ -148,16 +101,16 @@ public class BasicAsyncRequestExecutionH
* @param requestProducer the request producer.
* @param responseConsumer the response consumer.
* @param localContext the local execution context.
+ * @param conn the actual connection.
* @param httppocessor the HTTP protocol processor.
- *
- * @since 4.3
*/
- public BasicAsyncRequestExecutionHandler(
+ public BasicAsyncClientExchangeHandler(
final HttpAsyncRequestProducer requestProducer,
final HttpAsyncResponseConsumer<T> responseConsumer,
final HttpContext localContext,
+ final NHttpClientConnection conn,
final HttpProcessor httppocessor) {
- this(requestProducer, responseConsumer, null, localContext, httppocessor, null);
+ this(requestProducer, responseConsumer, null, localContext, conn, httppocessor, null);
}
public Future<T> getFuture() {
@@ -182,12 +135,12 @@ public class BasicAsyncRequestExecutionH
}
}
- public HttpHost getTarget() {
- return this.requestProducer.getTarget();
- }
-
public HttpRequest generateRequest() throws IOException, HttpException {
- return this.requestProducer.generateRequest();
+ HttpRequest request = this.requestProducer.generateRequest();
+ this.localContext.setAttribute(ExecutionContext.HTTP_REQUEST, request);
+ this.localContext.setAttribute(ExecutionContext.HTTP_CONNECTION, this.conn);
+ this.httppocessor.process(request, this.localContext);
+ return request;
}
public void produceContent(
@@ -195,19 +148,14 @@ public class BasicAsyncRequestExecutionH
this.requestProducer.produceContent(encoder, ioctrl);
}
- public void requestCompleted(final HttpContext context) {
- this.requestProducer.requestCompleted(context);
+ public void requestCompleted() {
+ this.requestProducer.requestCompleted(this.localContext);
this.requestSent = true;
}
- public boolean isRepeatable() {
- return false;
- }
-
- public void resetRequest() {
- }
-
public void responseReceived(final HttpResponse response) throws IOException, HttpException {
+ this.localContext.setAttribute(ExecutionContext.HTTP_RESPONSE, response);
+ this.httppocessor.process(response, this.localContext);
this.responseConsumer.responseReceived(response);
}
@@ -216,6 +164,27 @@ public class BasicAsyncRequestExecutionH
this.responseConsumer.consumeContent(decoder, ioctrl);
}
+ public void responseCompleted() {
+ try {
+ this.responseConsumer.responseCompleted(this.localContext);
+ final T result = this.responseConsumer.getResult();
+ final Exception ex = this.responseConsumer.getException();
+ if (ex == null) {
+ this.future.completed(result);
+ } else {
+ this.future.failed(ex);
+ }
+ releaseResources();
+ } catch (final RuntimeException ex) {
+ failed(ex);
+ throw ex;
+ }
+ }
+
+ public boolean keepAlive(final HttpResponse response) {
+ return this.connReuseStrategy.keepAlive(response, this.localContext);
+ }
+
public void failed(final Exception ex) {
try {
if (!this.requestSent) {
@@ -243,43 +212,6 @@ public class BasicAsyncRequestExecutionH
}
}
- public void responseCompleted(final HttpContext context) {
- try {
- this.responseConsumer.responseCompleted(context);
- final T result = this.responseConsumer.getResult();
- final Exception ex = this.responseConsumer.getException();
- if (ex == null) {
- this.future.completed(result);
- } else {
- this.future.failed(ex);
- }
- releaseResources();
- } catch (final RuntimeException ex) {
- failed(ex);
- throw ex;
- }
- }
-
- public T getResult() {
- return this.responseConsumer.getResult();
- }
-
- public Exception getException() {
- return this.responseConsumer.getException();
- }
-
- public HttpContext getContext() {
- return this.localContext;
- }
-
- public HttpProcessor getHttpProcessor() {
- return this.httppocessor;
- }
-
- public ConnectionReuseStrategy getConnectionReuseStrategy() {
- return this.reuseStrategy;
- }
-
public boolean isDone() {
return this.responseConsumer.isDone();
}
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestExecutionHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestExecutionHandler.java?rev=1439908&r1=1439907&r2=1439908&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestExecutionHandler.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestExecutionHandler.java Tue Jan 29 14:34:57 2013
@@ -37,7 +37,6 @@ import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.concurrent.BasicFuture;
import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.impl.DefaultConnectionReuseStrategy;
import org.apache.http.nio.ContentDecoder;
import org.apache.http.nio.ContentEncoder;
import org.apache.http.nio.IOControl;
@@ -52,8 +51,10 @@ import org.apache.http.util.Args;
*
* @param <T> the result type of request execution.
* @since 4.2
+ *
+ * @deprecated (4.3) use {@link BasicAsyncClientExchangeHandler}.
*/
-@SuppressWarnings("deprecation")
+@Deprecated
public class BasicAsyncRequestExecutionHandler<T> implements HttpAsyncRequestExecutionHandler<T> {
private final HttpAsyncRequestProducer requestProducer;
@@ -65,13 +66,6 @@ public class BasicAsyncRequestExecutionH
private volatile boolean requestSent;
- /**
- * @deprecated (4.3) use
- * {@link BasicAsyncRequestExecutionHandler#BasicAsyncRequestExecutionHandler(
- * HttpAsyncRequestProducer, HttpAsyncResponseConsumer, FutureCallback, HttpContext,
- * HttpProcessor, ConnectionReuseStrategy)}
- */
- @Deprecated
public BasicAsyncRequestExecutionHandler(
final HttpAsyncRequestProducer requestProducer,
final HttpAsyncResponseConsumer<T> responseConsumer,
@@ -95,13 +89,6 @@ public class BasicAsyncRequestExecutionH
this.reuseStrategy = reuseStrategy;
}
- /**
- * @deprecated (4.3) use
- * {@link BasicAsyncRequestExecutionHandler#BasicAsyncRequestExecutionHandler(
- * HttpAsyncRequestProducer, HttpAsyncResponseConsumer, FutureCallback, HttpContext,
- * HttpProcessor, ConnectionReuseStrategy)}
- */
- @Deprecated
public BasicAsyncRequestExecutionHandler(
final HttpAsyncRequestProducer requestProducer,
final HttpAsyncResponseConsumer<T> responseConsumer,
@@ -112,54 +99,6 @@ public class BasicAsyncRequestExecutionH
this(requestProducer, responseConsumer, null, localContext, httppocessor, reuseStrategy, params);
}
- /**
- * Creates new instance of BasicAsyncRequestExecutionHandler.
- *
- * @param requestProducer the request producer.
- * @param responseConsumer the response consumer.
- * @param callback the future callback invoked when the operation is completed.
- * @param localContext the local execution context.
- * @param httppocessor the HTTP protocol processor.
- * @param reuseStrategy the connection re-use strategy. If <code>null</code>
- * {@link DefaultConnectionReuseStrategy#INSTANCE} will be used.
- *
- * @since 4.3
- */
- public BasicAsyncRequestExecutionHandler(
- final HttpAsyncRequestProducer requestProducer,
- final HttpAsyncResponseConsumer<T> responseConsumer,
- final FutureCallback<T> callback,
- final HttpContext localContext,
- final HttpProcessor httppocessor,
- final ConnectionReuseStrategy reuseStrategy) {
- super();
- this.requestProducer = Args.notNull(requestProducer, "Request producer");
- this.responseConsumer = Args.notNull(responseConsumer, "Response consumer");
- this.future = new BasicFuture<T>(callback);
- this.localContext = Args.notNull(localContext, "HTTP context");
- this.httppocessor = Args.notNull(httppocessor, "HTTP processor");
- this.reuseStrategy = reuseStrategy != null ? reuseStrategy :
- DefaultConnectionReuseStrategy.INSTANCE;
- }
-
- /**
- * Creates new instance of BasicAsyncRequestExecutionHandler.
- *
- * @param requestProducer the request producer.
- * @param responseConsumer the response consumer.
- * @param localContext the local execution context.
- * @param httppocessor the HTTP protocol processor.
- *
- * @since 4.3
- */
- public BasicAsyncRequestExecutionHandler(
- final HttpAsyncRequestProducer requestProducer,
- final HttpAsyncResponseConsumer<T> responseConsumer,
- final HttpContext localContext,
- final HttpProcessor httppocessor) {
- this(requestProducer, responseConsumer, null, localContext, httppocessor, null);
- }
-
public Future<T> getFuture() {
return this.future;
}
Added: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncClientExchangeHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncClientExchangeHandler.java?rev=1439908&view=auto
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncClientExchangeHandler.java (added)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncClientExchangeHandler.java Tue Jan 29 14:34:57 2013
@@ -0,0 +1,153 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.http.nio.protocol;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+import org.apache.http.HttpEntityEnclosingRequest;
+import org.apache.http.HttpException;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.concurrent.Cancellable;
+import org.apache.http.nio.ContentDecoder;
+import org.apache.http.nio.ContentEncoder;
+import org.apache.http.nio.IOControl;
+import org.apache.http.protocol.HttpProcessor;
+
+/**
+ * <tt>HttpAsyncClientExchangeHandler</tt> represents a callback interface whose
+ * methods get invoked when executing one or multiple HTTP message exchanges
+ * on the client side.
+ * <p/>
+ * Individual <tt>HttpAsyncClientExchangeHandler</tt> are expected to make use of
+ * a {@link HttpProcessor} to generate mandatory protocol headers for all outgoing
+ * messages and apply common, cross-cutting message transformations to all incoming
+ * and outgoing messages. <tt>HttpAsyncClientExchangeHandler</tt>s can delegate
+ * implementation of application specific content generation and processing to
+ * a {@link HttpAsyncRequestProducer} and a {@link HttpAsyncResponseConsumer}.
+ *
+ * @since 4.3
+ */
+public interface HttpAsyncClientExchangeHandler extends Closeable, Cancellable {
+
+ /**
+ * Invoked to generate a HTTP request message head. The message is expected
+ * to implement the {@link HttpEntityEnclosingRequest} interface if it is
+ * to enclose a content entity. The {@link #produceContent(ContentEncoder, IOControl)}
+ * method will not be invoked if {@link HttpEntityEnclosingRequest#getEntity()}
+ * returns <code>null</code>.
+ *
+ * @return HTTP request message.
+ * @throws HttpException in case of HTTP protocol violation
+ * @throws IOException in case of an I/O error
+ */
+ HttpRequest generateRequest() throws IOException, HttpException;
+
+ /**
+ * Invoked to write out a chunk of content to the {@link ContentEncoder}.
+ * The {@link IOControl} interface can be used to suspend output event
+ * notifications if the producer is temporarily unable to produce more content.
+ * <p/>
+ * When all content is finished, the producer <b>MUST</b> call
+ * {@link ContentEncoder#complete()}. Failure to do so may cause the entity
+ * to be incorrectly delimited.
+ * <p/>
+ * Please note that the {@link ContentEncoder} object is not thread-safe and
+ * should only be used within the context of this method call.
+ * The {@link IOControl} object can be shared and used on other thread
+ * to resume output event notifications when more content is made available.
+ *
+ * @param encoder content encoder.
+ * @param ioctrl I/O control of the underlying connection.
+ * @throws IOException in case of an I/O error
+ */
+ void produceContent(ContentEncoder encoder, IOControl ioctrl) throws IOException;
+
+ /**
+ * Invoked to signal that the request has been fully written out.
+ */
+ void requestCompleted();
+
+ /**
+ * Invoked when a HTTP response message is received. Please note
+ * that the {@link #consumeContent(ContentDecoder, IOControl)} method
+ * will be invoked only if the response messages has a content entity
+ * enclosed.
+ *
+ * @param response HTTP response message.
+ * @throws HttpException in case of HTTP protocol violation
+ * @throws IOException in case of an I/O error
+ */
+ void responseReceived(HttpResponse response) throws IOException, HttpException;
+
+ /**
+ * Invoked to process a chunk of content from the {@link ContentDecoder}.
+ * The {@link IOControl} interface can be used to suspend input event
+ * notifications if the consumer is temporarily unable to process content.
+ * <p/>
+ * The consumer can use the {@link ContentDecoder#isCompleted()} method
+ * to find out whether or not the message content has been fully consumed.
+ * <p/>
+ * Please note that the {@link ContentDecoder} object is not thread-safe and
+ * should only be used within the context of this method call.
+ * The {@link IOControl} object can be shared and used on other thread
+ * to resume input event notifications when the consumer is capable of
+ * processing more content.
+ *
+ * @param decoder content decoder.
+ * @param ioctrl I/O control of the underlying connection.
+ * @throws IOException in case of an I/O error
+ */
+ void consumeContent(ContentDecoder decoder, IOControl ioctrl) throws IOException;
+
+ /**
+ * Invoked to signal that the response has been fully processed.
+ */
+ void responseCompleted();
+
+ /**
+ * Determines if current connection can be kept alive after the given HTTP response.
+ * @param response message
+ * @return <code>true</code> to keep connection alive, <code>false</code> otherwise.
+ */
+ boolean keepAlive(HttpResponse response);
+
+ /**
+ * Invoked to signal that the response processing terminated abnormally.
+ *
+ * @param ex exception
+ */
+ void failed(Exception ex);
+
+ /**
+ * Determines whether or not the response processing completed.
+ */
+ boolean isDone();
+
+}
Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncClientExchangeHandler.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncClientExchangeHandler.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncClientExchangeHandler.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequestExecutionHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequestExecutionHandler.java?rev=1439908&r1=1439907&r2=1439908&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequestExecutionHandler.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequestExecutionHandler.java Tue Jan 29 14:34:57 2013
@@ -40,6 +40,7 @@ import org.apache.http.protocol.HttpProc
* @param <T> the result type of request execution.
* @since 4.2
*/
+@Deprecated
public interface HttpAsyncRequestExecutionHandler<T>
extends HttpAsyncRequestProducer, HttpAsyncResponseConsumer<T> {
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequestExecutor.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequestExecutor.java?rev=1439908&r1=1439907&r2=1439908&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequestExecutor.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequestExecutor.java Tue Jan 29 14:34:57 2013
@@ -32,7 +32,6 @@ import java.io.IOException;
import java.net.SocketTimeoutException;
import org.apache.http.ConnectionClosedException;
-import org.apache.http.ConnectionReuseStrategy;
import org.apache.http.HttpConnection;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpException;
@@ -46,7 +45,6 @@ import org.apache.http.nio.ContentEncode
import org.apache.http.nio.NHttpClientConnection;
import org.apache.http.nio.NHttpClientEventHandler;
import org.apache.http.nio.NHttpConnection;
-import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.HttpProcessor;
import org.apache.http.util.Args;
@@ -58,21 +56,22 @@ import org.apache.http.util.Asserts;
* <tt>HttpAsyncRequestExecutor</tt> translates individual events fired through
* the {@link NHttpClientEventHandler} interface into logically related HTTP
* message exchanges.
- * <p/>
- * <tt>HttpAsyncRequestExecutor</tt> relies on {@link HttpProcessor}
- * to generate mandatory protocol headers for all outgoing messages and apply
- * common, cross-cutting message transformations to all incoming and outgoing
- * messages, whereas individual {@link HttpAsyncRequestExecutionHandler}s
- * are expected to implement application specific content generation and
- * processing. The caller is expected to pass an instance of
- * {@link HttpAsyncRequestExecutionHandler} to be used for the next series
+ * <p/> The caller is expected to pass an instance of
+ * {@link HttpAsyncClientExchangeHandler} to be used for the next series
* of HTTP message exchanges through the connection context using
* {@link #HTTP_HANDLER} attribute. HTTP exchange sequence is considered
- * complete when the {@link HttpAsyncRequestExecutionHandler#isDone()} method
+ * complete when the {@link HttpAsyncClientExchangeHandler#isDone()} method
* returns <code>true</code>. The {@link HttpAsyncRequester} utility class can
* be used to facilitate initiation of asynchronous HTTP request execution.
+ * <p/>
+ * Individual <tt>HttpAsyncClientExchangeHandler</tt> are expected to make use of
+ * a {@link HttpProcessor} to generate mandatory protocol headers for all outgoing
+ * messages and apply common, cross-cutting message transformations to all incoming
+ * and outgoing messages. <tt>HttpAsyncClientExchangeHandler</tt>s can delegate
+ * implementation of application specific content generation and processing to
+ * a {@link HttpAsyncRequestProducer} and a {@link HttpAsyncResponseConsumer}.
*
- * @see HttpAsyncRequestExecutionHandler
+ * @see HttpAsyncClientExchangeHandler
*
* @since 4.2
*/
@@ -109,7 +108,7 @@ public class HttpAsyncRequestExecutor im
public void closed(final NHttpClientConnection conn) {
final State state = getState(conn);
- final HttpAsyncRequestExecutionHandler<?> handler = getHandler(conn);
+ final HttpAsyncClientExchangeHandler handler = getHandler(conn);
if (state == null || (handler != null && handler.isDone())) {
closeHandler(handler);
}
@@ -121,7 +120,7 @@ public class HttpAsyncRequestExecutor im
public void exception(
final NHttpClientConnection conn, final Exception cause) {
shutdownConnection(conn);
- final HttpAsyncRequestExecutionHandler<?> handler = getHandler(conn);
+ final HttpAsyncClientExchangeHandler handler = getHandler(conn);
if (handler != null) {
handler.failed(cause);
} else {
@@ -135,7 +134,7 @@ public class HttpAsyncRequestExecutor im
if (state.getRequestState() != MessageState.READY) {
return;
}
- HttpAsyncRequestExecutionHandler<?> handler = getHandler(conn);
+ HttpAsyncClientExchangeHandler handler = getHandler(conn);
if (handler != null && handler.isDone()) {
closeHandler(handler);
state.reset();
@@ -145,15 +144,7 @@ public class HttpAsyncRequestExecutor im
return;
}
- final HttpContext context = handler.getContext();
- context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
-
final HttpRequest request = handler.generateRequest();
- context.setAttribute(ExecutionContext.HTTP_REQUEST, request);
-
- final HttpProcessor httppocessor = handler.getHttpProcessor();
- httppocessor.process(request, context);
-
state.setRequest(request);
conn.submitRequest(request);
@@ -168,7 +159,7 @@ public class HttpAsyncRequestExecutor im
state.setRequestState(MessageState.BODY_STREAM);
}
} else {
- handler.requestCompleted(context);
+ handler.requestCompleted();
state.setRequestState(MessageState.COMPLETED);
}
}
@@ -177,16 +168,15 @@ public class HttpAsyncRequestExecutor im
final NHttpClientConnection conn,
final ContentEncoder encoder) throws IOException {
final State state = ensureNotNull(getState(conn));
- final HttpAsyncRequestExecutionHandler<?> handler = ensureNotNull(getHandler(conn));
+ final HttpAsyncClientExchangeHandler handler = ensureNotNull(getHandler(conn));
if (state.getRequestState() == MessageState.ACK_EXPECTED) {
conn.suspendOutput();
return;
}
- final HttpContext context = handler.getContext();
handler.produceContent(encoder, conn);
state.setRequestState(MessageState.BODY_STREAM);
if (encoder.isCompleted()) {
- handler.requestCompleted(context);
+ handler.requestCompleted();
state.setRequestState(MessageState.COMPLETED);
}
}
@@ -194,7 +184,7 @@ public class HttpAsyncRequestExecutor im
public void responseReceived(
final NHttpClientConnection conn) throws HttpException, IOException {
final State state = ensureNotNull(getState(conn));
- final HttpAsyncRequestExecutionHandler<?> handler = ensureNotNull(getHandler(conn));
+ final HttpAsyncClientExchangeHandler handler = ensureNotNull(getHandler(conn));
final HttpResponse response = conn.getHttpResponse();
final HttpRequest request = state.getRequest();
@@ -229,12 +219,6 @@ public class HttpAsyncRequestExecutor im
handler.responseReceived(response);
- final HttpContext context = handler.getContext();
- final HttpProcessor httpprocessor = handler.getHttpProcessor();
-
- context.setAttribute(ExecutionContext.HTTP_RESPONSE, response);
- httpprocessor.process(response, context);
-
state.setResponseState(MessageState.BODY_STREAM);
if (!canResponseHaveBody(request, response)) {
response.setEntity(null);
@@ -247,7 +231,7 @@ public class HttpAsyncRequestExecutor im
final NHttpClientConnection conn,
final ContentDecoder decoder) throws IOException {
final State state = ensureNotNull(getState(conn));
- final HttpAsyncRequestExecutionHandler<?> handler = ensureNotNull(getHandler(conn));
+ final HttpAsyncClientExchangeHandler handler = ensureNotNull(getHandler(conn));
handler.consumeContent(decoder, conn);
state.setResponseState(MessageState.BODY_STREAM);
if (decoder.isCompleted()) {
@@ -260,7 +244,7 @@ public class HttpAsyncRequestExecutor im
if (state != null) {
if (state.getRequestState().compareTo(MessageState.READY) != 0) {
state.invalidate();
- HttpAsyncRequestExecutionHandler<?> handler = getHandler(conn);
+ HttpAsyncClientExchangeHandler handler = getHandler(conn);
handler.failed(new ConnectionClosedException("Connection closed"));
}
}
@@ -286,7 +270,7 @@ public class HttpAsyncRequestExecutor im
return;
} else {
state.invalidate();
- HttpAsyncRequestExecutionHandler<?> handler = getHandler(conn);
+ HttpAsyncClientExchangeHandler handler = getHandler(conn);
if (handler != null) {
handler.failed(new SocketTimeoutException());
handler.close();
@@ -323,11 +307,11 @@ public class HttpAsyncRequestExecutor im
return state;
}
- private HttpAsyncRequestExecutionHandler<?> getHandler(final NHttpConnection conn) {
- return (HttpAsyncRequestExecutionHandler<?>) conn.getContext().getAttribute(HTTP_HANDLER);
+ private HttpAsyncClientExchangeHandler getHandler(final NHttpConnection conn) {
+ return (HttpAsyncClientExchangeHandler) conn.getContext().getAttribute(HTTP_HANDLER);
}
- private HttpAsyncRequestExecutionHandler<?> ensureNotNull(final HttpAsyncRequestExecutionHandler<?> handler) {
+ private HttpAsyncClientExchangeHandler ensureNotNull(final HttpAsyncClientExchangeHandler handler) {
Asserts.notNull(handler, "HTTP exchange handler");
return handler;
}
@@ -340,7 +324,7 @@ public class HttpAsyncRequestExecutor im
}
}
- private void closeHandler(final HttpAsyncRequestExecutionHandler<?> handler) {
+ private void closeHandler(final HttpAsyncClientExchangeHandler handler) {
if (handler != null) {
try {
handler.close();
@@ -353,23 +337,21 @@ public class HttpAsyncRequestExecutor im
private void processResponse(
final NHttpClientConnection conn,
final State state,
- final HttpAsyncRequestExecutionHandler<?> handler) throws IOException {
- final HttpContext context = handler.getContext();
+ final HttpAsyncClientExchangeHandler handler) throws IOException {
if (state.isValid()) {
final HttpRequest request = state.getRequest();
final HttpResponse response = state.getResponse();
final String method = request.getRequestLine().getMethod();
final int status = response.getStatusLine().getStatusCode();
if (!(method.equalsIgnoreCase("CONNECT") && status < 300)) {
- final ConnectionReuseStrategy connReuseStrategy = handler.getConnectionReuseStrategy();
- if (!connReuseStrategy.keepAlive(response, context)) {
+ if (!handler.keepAlive(response)) {
conn.close();
}
}
} else {
conn.close();
}
- handler.responseCompleted(context);
+ handler.responseCompleted();
state.reset();
}
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequester.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequester.java?rev=1439908&r1=1439907&r2=1439908&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequester.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequester.java Tue Jan 29 14:34:57 2013
@@ -61,7 +61,7 @@ import org.apache.http.util.Args;
public class HttpAsyncRequester {
private final HttpProcessor httppocessor;
- private final ConnectionReuseStrategy reuseStrategy;
+ private final ConnectionReuseStrategy connReuseStrategy;
/**
* @deprecated (4.3) use {@link HttpAsyncRequester#HttpAsyncRequester(HttpProcessor,
@@ -78,26 +78,20 @@ public class HttpAsyncRequester {
/**
* Creates new instance of HttpAsyncRequester.
*
- * @param httppocessor the HTTP protocol processor.
- * @param reuseStrategy the connection re-use strategy. If <code>null</code>
- * {@link DefaultConnectionReuseStrategy#INSTANCE} will be used.
- *
* @since 4.3
*/
public HttpAsyncRequester(
final HttpProcessor httppocessor,
- final ConnectionReuseStrategy reuseStrategy) {
+ final ConnectionReuseStrategy connReuseStrategy) {
super();
- this.httppocessor = httppocessor;
- this.reuseStrategy = reuseStrategy != null ? reuseStrategy :
+ this.httppocessor = Args.notNull(httppocessor, "HTTP processor");
+ this.connReuseStrategy = connReuseStrategy != null ? connReuseStrategy :
DefaultConnectionReuseStrategy.INSTANCE;
}
/**
* Creates new instance of HttpAsyncRequester.
*
- * @param httppocessor the HTTP protocol processor.
- *
* @since 4.3
*/
public HttpAsyncRequester(final HttpProcessor httppocessor) {
@@ -125,15 +119,15 @@ public class HttpAsyncRequester {
Args.notNull(responseConsumer, "HTTP response consumer");
Args.notNull(conn, "HTTP connection");
Args.notNull(context, "HTTP context");
- final BasicAsyncRequestExecutionHandler<T> handler = new BasicAsyncRequestExecutionHandler<T>(
- requestProducer, responseConsumer, callback, context,
- this.httppocessor, this.reuseStrategy);
+ final BasicAsyncClientExchangeHandler<T> handler = new BasicAsyncClientExchangeHandler<T>(
+ requestProducer, responseConsumer, callback, context, conn,
+ this.httppocessor, this.connReuseStrategy);
initExection(handler, conn);
return handler.getFuture();
}
- private <T> void initExection(
- final HttpAsyncRequestExecutionHandler<T> handler, final NHttpClientConnection conn) {
+ private void initExection(
+ final HttpAsyncClientExchangeHandler handler, final NHttpClientConnection conn) {
conn.getContext().setAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER, handler);
if (!conn.isOpen()) {
handler.failed(new ConnectionClosedException("Connection closed"));
@@ -241,11 +235,11 @@ public class HttpAsyncRequester {
Args.notNull(context, "HTTP context");
final BasicFuture<T> future = new BasicFuture<T>(callback);
final NHttpClientConnection conn = poolEntry.getConnection();
- final BasicAsyncRequestExecutionHandler<T> handler = new BasicAsyncRequestExecutionHandler<T>(
+ final BasicAsyncClientExchangeHandler<T> handler = new BasicAsyncClientExchangeHandler<T>(
requestProducer, responseConsumer,
new RequestExecutionCallback<T, E>(future, poolEntry, connPool),
- context,
- this.httppocessor, this.reuseStrategy);
+ context, conn,
+ this.httppocessor, this.connReuseStrategy);
initExection(handler, conn);
return future;
}
@@ -314,10 +308,10 @@ public class HttpAsyncRequester {
return;
}
final NHttpClientConnection conn = result.getConnection();
- final BasicAsyncRequestExecutionHandler<T> handler = new BasicAsyncRequestExecutionHandler<T>(
+ final BasicAsyncClientExchangeHandler<T> handler = new BasicAsyncClientExchangeHandler<T>(
this.requestProducer, this.responseConsumer,
new RequestExecutionCallback<T, E>(this.requestFuture, result, this.connPool),
- this.context, httppocessor, reuseStrategy);
+ this.context, conn, httppocessor, connReuseStrategy);
initExection(handler, conn);
}
Copied: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncClientExchangeHandler.java (from r1439907, httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncRequestExecutionHandler.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncClientExchangeHandler.java?p2=httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncClientExchangeHandler.java&p1=httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncRequestExecutionHandler.java&r1=1439907&r2=1439908&rev=1439908&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncRequestExecutionHandler.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncClientExchangeHandler.java Tue Jan 29 14:34:57 2013
@@ -30,7 +30,6 @@ package org.apache.http.nio.protocol;
import java.util.concurrent.ExecutionException;
import org.apache.http.ConnectionReuseStrategy;
-import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpVersion;
import org.apache.http.message.BasicHttpRequest;
@@ -39,6 +38,7 @@ import org.apache.http.nio.ContentDecode
import org.apache.http.nio.ContentEncoder;
import org.apache.http.nio.NHttpClientConnection;
import org.apache.http.protocol.BasicHttpContext;
+import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.HttpProcessor;
import org.junit.After;
@@ -47,7 +47,7 @@ import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
-public class TestBasicAsyncRequestExecutionHandler {
+public class TestBasicAsyncClientExchangeHandler {
private HttpAsyncRequestProducer requestProducer;
private HttpAsyncResponseConsumer<Object> responseConsumer;
@@ -55,7 +55,7 @@ public class TestBasicAsyncRequestExecut
private HttpProcessor httpProcessor;
private NHttpClientConnection conn;
private ConnectionReuseStrategy reuseStrategy;
- private BasicAsyncRequestExecutionHandler<Object> exchangeHandler;
+ private BasicAsyncClientExchangeHandler<Object> exchangeHandler;
private ContentEncoder encoder;
private ContentDecoder decoder;
@@ -65,13 +65,15 @@ public class TestBasicAsyncRequestExecut
this.requestProducer = Mockito.mock(HttpAsyncRequestProducer.class);
this.responseConsumer = Mockito.mock(HttpAsyncResponseConsumer.class);
this.context = new BasicHttpContext();
+ this.conn = Mockito.mock(NHttpClientConnection.class);
this.httpProcessor = Mockito.mock(HttpProcessor.class);
this.reuseStrategy = Mockito.mock(ConnectionReuseStrategy.class);
- this.exchangeHandler = new BasicAsyncRequestExecutionHandler<Object>(
+ this.exchangeHandler = new BasicAsyncClientExchangeHandler<Object>(
this.requestProducer,
this.responseConsumer,
null,
this.context,
+ this.conn,
this.httpProcessor,
this.reuseStrategy);
this.encoder = Mockito.mock(ContentEncoder.class);
@@ -85,45 +87,61 @@ public class TestBasicAsyncRequestExecut
@Test
public void testInvalidExecution() throws Exception {
try {
- new BasicAsyncRequestExecutionHandler<Object>(
+ new BasicAsyncClientExchangeHandler<Object>(
null,
this.responseConsumer,
null,
this.context,
+ this.conn,
this.httpProcessor,
this.reuseStrategy);
Assert.fail("IllegalArgumentException expected");
} catch (final IllegalArgumentException ex) {
}
try {
- new BasicAsyncRequestExecutionHandler<Object>(
+ new BasicAsyncClientExchangeHandler<Object>(
this.requestProducer,
null,
null,
this.context,
+ this.conn,
this.httpProcessor,
this.reuseStrategy);
Assert.fail("IllegalArgumentException expected");
} catch (final IllegalArgumentException ex) {
}
try {
- new BasicAsyncRequestExecutionHandler<Object>(
+ new BasicAsyncClientExchangeHandler<Object>(
this.requestProducer,
this.responseConsumer,
null,
null,
+ this.conn,
this.httpProcessor,
this.reuseStrategy);
Assert.fail("IllegalArgumentException expected");
} catch (final IllegalArgumentException ex) {
}
try {
- new BasicAsyncRequestExecutionHandler<Object>(
+ new BasicAsyncClientExchangeHandler<Object>(
this.requestProducer,
this.responseConsumer,
null,
this.context,
null,
+ this.httpProcessor,
+ this.reuseStrategy);
+ Assert.fail("IllegalArgumentException expected");
+ } catch (final IllegalArgumentException ex) {
+ }
+ try {
+ new BasicAsyncClientExchangeHandler<Object>(
+ this.requestProducer,
+ this.responseConsumer,
+ null,
+ this.context,
+ this.conn,
+ null,
this.reuseStrategy);
Assert.fail("IllegalArgumentException expected");
} catch (final IllegalArgumentException ex) {
@@ -140,13 +158,6 @@ public class TestBasicAsyncRequestExecut
}
@Test
- public void testGetTarget() throws Exception {
- final HttpHost target = new HttpHost("somehost");
- Mockito.when(this.requestProducer.getTarget()).thenReturn(target);
- Assert.assertSame(target, this.exchangeHandler.getTarget());
- }
-
- @Test
public void testGenerateRequest() throws Exception {
final BasicHttpRequest request = new BasicHttpRequest("GET", "/", HttpVersion.HTTP_1_1);
Mockito.when(this.requestProducer.generateRequest()).thenReturn(request);
@@ -156,6 +167,9 @@ public class TestBasicAsyncRequestExecut
Assert.assertSame(request, result);
Mockito.verify(this.requestProducer).generateRequest();
+ Assert.assertSame(request, this.context.getAttribute(ExecutionContext.HTTP_REQUEST));
+ Assert.assertSame(this.conn, this.context.getAttribute(ExecutionContext.HTTP_CONNECTION));
+ Mockito.verify(this.httpProcessor).process(request, this.context);
}
@Test
@@ -178,7 +192,7 @@ public class TestBasicAsyncRequestExecut
@Test
public void testRequestCompleted() throws Exception {
- this.exchangeHandler.requestCompleted(this.context);
+ this.exchangeHandler.requestCompleted();
Mockito.verify(this.requestProducer).requestCompleted(this.context);
}
@@ -190,6 +204,8 @@ public class TestBasicAsyncRequestExecut
this.exchangeHandler.responseReceived(response);
Mockito.verify(this.responseConsumer).responseReceived(response);
+ Assert.assertSame(response, this.context.getAttribute(ExecutionContext.HTTP_RESPONSE));
+ Mockito.verify(this.httpProcessor).process(response, this.context);
}
@Test
@@ -218,7 +234,7 @@ public class TestBasicAsyncRequestExecut
@Test
public void testFailedAfterRequest() throws Exception {
final Exception ooopsie = new Exception();
- this.exchangeHandler.requestCompleted(this.context);
+ this.exchangeHandler.requestCompleted();
this.exchangeHandler.failed(ooopsie);
Mockito.verify(this.requestProducer, Mockito.never()).failed(ooopsie);
@@ -282,7 +298,7 @@ public class TestBasicAsyncRequestExecut
final Object obj = new Object();
Mockito.when(this.responseConsumer.getResult()).thenReturn(obj);
- this.exchangeHandler.responseCompleted(this.context);
+ this.exchangeHandler.responseCompleted();
Mockito.verify(this.responseConsumer).responseCompleted(this.context);
Mockito.verify(this.requestProducer).close();
@@ -296,7 +312,7 @@ public class TestBasicAsyncRequestExecut
final Exception ooopsie = new Exception();
Mockito.when(this.responseConsumer.getException()).thenReturn(ooopsie);
- this.exchangeHandler.responseCompleted(this.context);
+ this.exchangeHandler.responseCompleted();
Mockito.verify(this.responseConsumer).responseCompleted(this.context);
Mockito.verify(this.requestProducer).close();
@@ -312,7 +328,7 @@ public class TestBasicAsyncRequestExecut
public void testResponseCompletedWithException() throws Exception {
Mockito.doThrow(new RuntimeException()).when(this.responseConsumer).responseCompleted(this.context);
try {
- this.exchangeHandler.responseCompleted(this.context);
+ this.exchangeHandler.responseCompleted();
Assert.fail("RuntimeException expected");
} catch (final RuntimeException ex) {
Mockito.verify(this.requestProducer).close();
@@ -326,27 +342,16 @@ public class TestBasicAsyncRequestExecut
}
@Test
- public void testMisc() throws Exception {
- Assert.assertFalse(this.exchangeHandler.isRepeatable());
- final Object obj = new Object();
- Mockito.when(this.responseConsumer.getResult()).thenReturn(obj);
-
- final Object result = this.exchangeHandler.getResult();
- Assert.assertSame(obj, result);
- Mockito.verify(this.responseConsumer).getResult();
-
- final Exception ooopsie = new Exception();
- Mockito.when(this.responseConsumer.getException()).thenReturn(ooopsie);
-
- final Exception ex = this.exchangeHandler.getException();
- Assert.assertSame(ooopsie, ex);
- Mockito.verify(this.responseConsumer).getException();
+ public void testKeepAlive() throws Exception {
+ final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
+ this.exchangeHandler.keepAlive(response);
+ Mockito.verify(this.reuseStrategy).keepAlive(response, this.context);
+ }
+ @Test
+ public void testIsDone() throws Exception {
this.exchangeHandler.isDone();
Mockito.verify(this.responseConsumer).isDone();
-
- Assert.assertSame(this.context, this.exchangeHandler.getContext());
- Assert.assertSame(this.reuseStrategy, this.exchangeHandler.getConnectionReuseStrategy());
}
}
Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncClientExchangeHandler.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncClientExchangeHandler.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncClientExchangeHandler.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncRequestExecutor.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncRequestExecutor.java?rev=1439908&r1=1439907&r2=1439908&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncRequestExecutor.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncRequestExecutor.java Tue Jan 29 14:34:57 2013
@@ -31,7 +31,6 @@ import java.io.IOException;
import java.net.SocketTimeoutException;
import org.apache.http.ConnectionClosedException;
-import org.apache.http.ConnectionReuseStrategy;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpStatus;
@@ -47,10 +46,8 @@ import org.apache.http.nio.NHttpConnecti
import org.apache.http.nio.entity.NStringEntity;
import org.apache.http.nio.protocol.HttpAsyncRequestExecutor.State;
import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpProcessor;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -62,29 +59,19 @@ public class TestHttpAsyncRequestExecuto
private HttpAsyncRequestExecutor protocolHandler;
private HttpContext connContext;
private NHttpClientConnection conn;
- private HttpAsyncRequestExecutionHandler<?> exchangeHandler;
- private HttpContext exchangeContext;
+ private HttpAsyncClientExchangeHandler exchangeHandler;
private ContentEncoder encoder;
private ContentDecoder decoder;
- private HttpProcessor httpprocessor;
- private ConnectionReuseStrategy reuseStrategy;
@Before
public void setUp() throws Exception {
this.protocolHandler = new HttpAsyncRequestExecutor();
this.connContext = new BasicHttpContext();
this.conn = Mockito.mock(NHttpClientConnection.class);
- this.exchangeHandler = Mockito.mock(HttpAsyncRequestExecutionHandler.class);
- this.exchangeContext = new BasicHttpContext();
+ this.exchangeHandler = Mockito.mock(HttpAsyncClientExchangeHandler.class);
this.encoder = Mockito.mock(ContentEncoder.class);
this.decoder = Mockito.mock(ContentDecoder.class);
- this.httpprocessor = Mockito.mock(HttpProcessor.class);
- this.reuseStrategy = Mockito.mock(ConnectionReuseStrategy.class);
-
Mockito.when(this.conn.getContext()).thenReturn(this.connContext);
- Mockito.when(this.exchangeHandler.getContext()).thenReturn(this.exchangeContext);
- Mockito.when(this.exchangeHandler.getHttpProcessor()).thenReturn(this.httpprocessor);
- Mockito.when(this.exchangeHandler.getConnectionReuseStrategy()).thenReturn(this.reuseStrategy);
}
@After
@@ -105,7 +92,7 @@ public class TestHttpAsyncRequestExecuto
Mockito.verify(this.exchangeHandler).generateRequest();
Assert.assertSame(request, state.getRequest());
Mockito.verify(this.conn).submitRequest(request);
- Mockito.verify(this.exchangeHandler).requestCompleted(this.exchangeContext);
+ Mockito.verify(this.exchangeHandler).requestCompleted();
Assert.assertEquals(MessageState.COMPLETED, state.getRequestState());
Assert.assertEquals("request state: COMPLETED; request: GET / HTTP/1.1; " +
"response state: READY; response: ; valid: true;", state.toString());
@@ -178,13 +165,8 @@ public class TestHttpAsyncRequestExecuto
Mockito.verify(this.exchangeHandler).generateRequest();
Assert.assertSame(request, state.getRequest());
- Assert.assertSame(request, this.exchangeContext.getAttribute(ExecutionContext.HTTP_REQUEST));
- Assert.assertSame(this.conn, this.exchangeContext.getAttribute(ExecutionContext.HTTP_CONNECTION));
- Mockito.verify(this.httpprocessor).process(request, this.exchangeContext);
-
-
Mockito.verify(this.conn).submitRequest(request);
- Mockito.verify(this.exchangeHandler).requestCompleted(this.exchangeContext);
+ Mockito.verify(this.exchangeHandler).requestCompleted();
Assert.assertEquals(MessageState.COMPLETED, state.getRequestState());
}
@@ -202,7 +184,7 @@ public class TestHttpAsyncRequestExecuto
Mockito.verify(this.exchangeHandler).generateRequest();
Assert.assertSame(request, state.getRequest());
Mockito.verify(this.conn).submitRequest(request);
- Mockito.verify(this.exchangeHandler, Mockito.never()).requestCompleted(this.exchangeContext);
+ Mockito.verify(this.exchangeHandler, Mockito.never()).requestCompleted();
Assert.assertEquals(MessageState.BODY_STREAM, state.getRequestState());
}
@@ -223,7 +205,7 @@ public class TestHttpAsyncRequestExecuto
Mockito.verify(this.conn).submitRequest(request);
Mockito.verify(this.conn).setSocketTimeout(3000);
Assert.assertEquals(1000, state.getTimeout());
- Mockito.verify(this.exchangeHandler, Mockito.never()).requestCompleted(this.exchangeContext);
+ Mockito.verify(this.exchangeHandler, Mockito.never()).requestCompleted();
Assert.assertEquals(MessageState.ACK_EXPECTED, state.getRequestState());
}
@@ -250,7 +232,7 @@ public class TestHttpAsyncRequestExecuto
this.protocolHandler.outputReady(this.conn, this.encoder);
Mockito.verify(this.exchangeHandler).produceContent(this.encoder, this.conn);
- Mockito.verify(this.exchangeHandler).requestCompleted(this.exchangeContext);
+ Mockito.verify(this.exchangeHandler).requestCompleted();
Assert.assertEquals(MessageState.COMPLETED, state.getRequestState());
}
@@ -282,8 +264,6 @@ public class TestHttpAsyncRequestExecuto
Assert.assertSame(response, state.getResponse());
Assert.assertEquals(MessageState.BODY_STREAM, state.getResponseState());
- Assert.assertSame(response, this.exchangeContext.getAttribute(ExecutionContext.HTTP_RESPONSE));
- Mockito.verify(this.httpprocessor).process(response, this.exchangeContext);
}
@Test
@@ -397,7 +377,7 @@ public class TestHttpAsyncRequestExecuto
this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER, this.exchangeHandler);
final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
Mockito.when(this.conn.getHttpResponse()).thenReturn(response);
- Mockito.when(this.reuseStrategy.keepAlive(response, this.exchangeContext)).thenReturn(Boolean.TRUE);
+ Mockito.when(this.exchangeHandler.keepAlive(response)).thenReturn(Boolean.TRUE);
this.protocolHandler.responseReceived(this.conn);
@@ -419,7 +399,7 @@ public class TestHttpAsyncRequestExecuto
this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER, this.exchangeHandler);
final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
Mockito.when(this.conn.getHttpResponse()).thenReturn(response);
- Mockito.when(this.reuseStrategy.keepAlive(response, this.exchangeContext)).thenReturn(Boolean.TRUE);
+ Mockito.when(this.exchangeHandler.keepAlive(response)).thenReturn(Boolean.TRUE);
this.protocolHandler.responseReceived(this.conn);
@@ -443,7 +423,7 @@ public class TestHttpAsyncRequestExecuto
HttpStatus.SC_NOT_MODIFIED, "Not modified");
response.setEntity(new BasicHttpEntity());
Mockito.when(this.conn.getHttpResponse()).thenReturn(response);
- Mockito.when(this.reuseStrategy.keepAlive(response, this.exchangeContext)).thenReturn(Boolean.TRUE);
+ Mockito.when(this.exchangeHandler.keepAlive(response)).thenReturn(Boolean.TRUE);
this.protocolHandler.responseReceived(this.conn);
@@ -479,7 +459,7 @@ public class TestHttpAsyncRequestExecuto
state.setResponse(response);
this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_EXCHANGE_STATE, state);
this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER, this.exchangeHandler);
- Mockito.when(this.reuseStrategy.keepAlive(response, this.exchangeContext)).thenReturn(Boolean.TRUE);
+ Mockito.when(this.exchangeHandler.keepAlive(response)).thenReturn(Boolean.TRUE);
Mockito.when(this.decoder.isCompleted()).thenReturn(Boolean.TRUE);
this.protocolHandler.inputReady(this.conn, this.decoder);
@@ -487,7 +467,7 @@ public class TestHttpAsyncRequestExecuto
Assert.assertEquals(MessageState.READY, state.getRequestState());
Assert.assertEquals(MessageState.READY, state.getResponseState());
Mockito.verify(this.exchangeHandler).consumeContent(this.decoder, this.conn);
- Mockito.verify(this.exchangeHandler).responseCompleted(this.exchangeContext);
+ Mockito.verify(this.exchangeHandler).responseCompleted();
Mockito.verify(this.conn, Mockito.never()).close();
}
@@ -509,7 +489,6 @@ public class TestHttpAsyncRequestExecuto
Assert.assertEquals(MessageState.READY, state.getResponseState());
Mockito.verify(this.exchangeHandler).consumeContent(this.decoder, this.conn);
Mockito.verify(this.conn).close();
- Mockito.verify(this.exchangeHandler, Mockito.never()).getConnectionReuseStrategy();
}
@Test
@@ -521,7 +500,7 @@ public class TestHttpAsyncRequestExecuto
state.setResponse(response);
this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_EXCHANGE_STATE, state);
this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER, this.exchangeHandler);
- Mockito.when(this.reuseStrategy.keepAlive(response, this.exchangeContext)).thenReturn(Boolean.FALSE);
+ Mockito.when(this.exchangeHandler.keepAlive(response)).thenReturn(Boolean.FALSE);
Mockito.when(this.decoder.isCompleted()).thenReturn(Boolean.TRUE);
this.protocolHandler.inputReady(this.conn, this.decoder);
@@ -529,7 +508,7 @@ public class TestHttpAsyncRequestExecuto
Assert.assertEquals(MessageState.READY, state.getRequestState());
Assert.assertEquals(MessageState.READY, state.getResponseState());
Mockito.verify(this.exchangeHandler).consumeContent(this.decoder, this.conn);
- Mockito.verify(this.exchangeHandler).responseCompleted(this.exchangeContext);
+ Mockito.verify(this.exchangeHandler).responseCompleted();
Mockito.verify(this.conn).close();
}
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncRequester.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncRequester.java?rev=1439908&r1=1439907&r2=1439908&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncRequester.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncRequester.java Tue Jan 29 14:34:57 2013
@@ -280,14 +280,14 @@ public class TestHttpAsyncRequester {
final BasicNIOPoolEntry entry = new BasicNIOPoolEntry("id", host, this.conn);
connRequestCallback.completed(entry);
- final BasicAsyncRequestExecutionHandler exchangeHandler = (BasicAsyncRequestExecutionHandler) this.connContext.getAttribute(
+ final BasicAsyncClientExchangeHandler exchangeHandler = (BasicAsyncClientExchangeHandler) this.connContext.getAttribute(
HttpAsyncRequestExecutor.HTTP_HANDLER);
Assert.assertNotNull(exchangeHandler);
Mockito.verify(this.conn).requestOutput();
final Object result = new Object();
Mockito.when(this.responseConsumer.getResult()).thenReturn(result);
- exchangeHandler.responseCompleted(this.exchangeContext);
+ exchangeHandler.responseCompleted();
Mockito.verify(this.callback).completed(result);
Mockito.verify(this.responseConsumer).close();
Mockito.verify(this.requestProducer).close();
@@ -313,7 +313,7 @@ public class TestHttpAsyncRequester {
final BasicNIOPoolEntry entry = new BasicNIOPoolEntry("id", host, this.conn);
connRequestCallback.completed(entry);
- final BasicAsyncRequestExecutionHandler exchangeHandler = (BasicAsyncRequestExecutionHandler) this.connContext.getAttribute(
+ final BasicAsyncClientExchangeHandler exchangeHandler = (BasicAsyncClientExchangeHandler) this.connContext.getAttribute(
HttpAsyncRequestExecutor.HTTP_HANDLER);
Assert.assertNotNull(exchangeHandler);
Mockito.verify(this.conn).requestOutput();
@@ -346,7 +346,7 @@ public class TestHttpAsyncRequester {
final BasicNIOPoolEntry entry = new BasicNIOPoolEntry("id", host, this.conn);
connRequestCallback.completed(entry);
- final BasicAsyncRequestExecutionHandler exchangeHandler = (BasicAsyncRequestExecutionHandler) this.connContext.getAttribute(
+ final BasicAsyncClientExchangeHandler exchangeHandler = (BasicAsyncClientExchangeHandler) this.connContext.getAttribute(
HttpAsyncRequestExecutor.HTTP_HANDLER);
Assert.assertNotNull(exchangeHandler);
Mockito.verify(this.conn).requestOutput();