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 2011/09/05 16:34:40 UTC
svn commit: r1165298 [2/2] - in
/httpcomponents/httpcore/trunk/httpcore-nio/src:
main/java/org/apache/http/nio/entity/ main/java/org/apache/http/nio/protocol/
test/java/org/apache/http/impl/nio/reactor/
test/java/org/apache/http/nio/protocol/ test/java...
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestTruncatedChunks.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestTruncatedChunks.java?rev=1165298&r1=1165297&r2=1165298&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestTruncatedChunks.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestTruncatedChunks.java Mon Sep 5 14:34:39 2011
@@ -28,17 +28,14 @@
package org.apache.http.nio.protocol;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.WritableByteChannel;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
import org.apache.http.HttpCoreNIOTestBase;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpRequest;
+import org.apache.http.HttpHost;
import org.apache.http.HttpRequestFactory;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
@@ -47,9 +44,8 @@ import org.apache.http.LoggingNHttpServe
import org.apache.http.MalformedChunkCodingException;
import org.apache.http.TruncatedChunkException;
import org.apache.http.entity.ContentLengthStrategy;
-import org.apache.http.entity.HttpEntityWrapper;
+import org.apache.http.entity.InputStreamEntity;
import org.apache.http.impl.DefaultConnectionReuseStrategy;
-import org.apache.http.impl.DefaultHttpResponseFactory;
import org.apache.http.impl.io.HttpTransportMetricsImpl;
import org.apache.http.impl.nio.DefaultNHttpServerConnectionFactory;
import org.apache.http.impl.nio.codecs.AbstractContentEncoder;
@@ -58,11 +54,10 @@ import org.apache.http.nio.ContentDecode
import org.apache.http.nio.ContentEncoder;
import org.apache.http.nio.IOControl;
import org.apache.http.nio.NHttpClientIOTarget;
-import org.apache.http.nio.NHttpConnection;
import org.apache.http.nio.NHttpConnectionFactory;
import org.apache.http.nio.NHttpServerIOTarget;
-import org.apache.http.nio.entity.ConsumingNHttpEntity;
import org.apache.http.nio.entity.ContentInputStream;
+import org.apache.http.nio.reactor.IOReactorStatus;
import org.apache.http.nio.reactor.IOSession;
import org.apache.http.nio.reactor.ListenerEndpoint;
import org.apache.http.nio.reactor.SessionOutputBuffer;
@@ -70,10 +65,9 @@ import org.apache.http.nio.util.ByteBuff
import org.apache.http.nio.util.HeapByteBufferAllocator;
import org.apache.http.nio.util.SimpleInputBuffer;
import org.apache.http.params.HttpParams;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.testserver.SimpleEventListener;
-import org.apache.http.testserver.SimpleNHttpRequestHandlerResolver;
+import org.apache.http.protocol.HTTP;
import org.apache.http.util.CharArrayBuffer;
+import org.apache.http.util.EntityUtils;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -88,10 +82,12 @@ public class TestTruncatedChunks extends
public void setUp() throws Exception {
initServer();
initClient();
+ initConnPool();
}
@After
public void tearDown() throws Exception {
+ shutDownConnPool();
shutDownClient();
shutDownServer();
}
@@ -187,207 +183,118 @@ public class TestTruncatedChunks extends
@Test
public void testTruncatedChunkException() throws Exception {
-
- NHttpRequestExecutionHandler requestExecutionHandler = new RequestExecutionHandler() {
-
- @Override
- protected HttpRequest generateRequest(Job testjob) {
- String s = testjob.getPattern() + "x" + testjob.getCount();
- return new BasicHttpRequest("GET", s);
- }
-
- };
-
- Job testjob = new Job(2000);
- Queue<Job> queue = new ConcurrentLinkedQueue<Job>();
- queue.add(testjob);
-
- AsyncNHttpServiceHandler serviceHandler = new AsyncNHttpServiceHandler(
+ HttpAsyncRequestHandlerRegistry registry = new HttpAsyncRequestHandlerRegistry();
+ registry.register("*", new BufferingAsyncRequestHandler(new SimpleRequestHandler(true)));
+ HttpAsyncServiceHandler serviceHandler = new HttpAsyncServiceHandler(
+ registry,
this.serverHttpProc,
- new DefaultHttpResponseFactory(),
new DefaultConnectionReuseStrategy(),
this.serverParams);
-
- serviceHandler.setHandlerResolver(
- new SimpleNHttpRequestHandlerResolver(new RequestHandler(true)));
- serviceHandler.setEventListener(
- new SimpleEventListener());
-
- AsyncNHttpClientHandler clientHandler = new AsyncNHttpClientHandler(
- this.clientHttpProc,
- requestExecutionHandler,
- new DefaultConnectionReuseStrategy(),
- this.clientParams);
-
- clientHandler.setEventListener(
- new SimpleEventListener() {
-
- @Override
- public void fatalIOException(
- final IOException ex,
- final NHttpConnection conn) {
- HttpContext context = conn.getContext();
- Job testjob = (Job) context.getAttribute("job");
- testjob.fail(ex.getMessage(), ex);
- }
-
- });
-
+ HttpAsyncClientProtocolHandler clientHandler = new HttpAsyncClientProtocolHandler();
this.server.start(serviceHandler);
this.client.start(clientHandler);
ListenerEndpoint endpoint = this.server.getListenerEndpoint();
endpoint.waitFor();
- InetSocketAddress serverAddress = (InetSocketAddress) endpoint.getAddress();
- this.client.openConnection(
- new InetSocketAddress("localhost", serverAddress.getPort()),
- queue);
-
- testjob.waitFor();
- Assert.assertFalse(testjob.isSuccessful());
- Assert.assertNotNull(testjob.getException());
- Assert.assertTrue(testjob.getException() instanceof MalformedChunkCodingException);
- }
+ Assert.assertEquals("Test server status", IOReactorStatus.ACTIVE, this.server.getStatus());
- static class LenientNHttpEntity extends HttpEntityWrapper implements ConsumingNHttpEntity {
+ String pattern = RndTestPatternGenerator.generateText();
+ int count = RndTestPatternGenerator.generateCount(1000);
- private final static int BUFFER_SIZE = 2048;
+ HttpHost target = new HttpHost("localhost", ((InetSocketAddress)endpoint.getAddress()).getPort());
+ BasicHttpRequest request = new BasicHttpRequest("GET", pattern + "x" + count);
+ Future<HttpResponse> future = this.executor.execute(
+ new BasicAsyncRequestProducer(target, request),
+ new BasicAsyncResponseConsumer(),
+ this.connpool);
+ try {
+ future.get();
+ Assert.fail("ExecutionException should have been thrown");
+ } catch (ExecutionException ex) {
+ Throwable cause = ex.getCause();
+ Assert.assertTrue(cause instanceof MalformedChunkCodingException);
+ }
+ }
+
+ static class LenientAsyncResponseConsumer extends AbstractAsyncResponseConsumer<HttpResponse> {
private final SimpleInputBuffer buffer;
- private boolean finished;
- private boolean consumed;
+ private volatile HttpResponse response;
- public LenientNHttpEntity(
- final HttpEntity httpEntity,
- final ByteBufferAllocator allocator) {
- super(httpEntity);
- this.buffer = new SimpleInputBuffer(BUFFER_SIZE, allocator);
+ public LenientAsyncResponseConsumer() {
+ super();
+ this.buffer = new SimpleInputBuffer(2048, new HeapByteBufferAllocator());
+ }
+
+ @Override
+ protected void onResponseReceived(final HttpResponse response) {
+ this.response = response;
}
- public void consumeContent(
- final ContentDecoder decoder,
- final IOControl ioctrl) throws IOException {
+ @Override
+ protected void onContentReceived(
+ final ContentDecoder decoder, final IOControl ioctrl) throws IOException {
+ boolean finished = false;
try {
this.buffer.consumeContent(decoder);
if (decoder.isCompleted()) {
- this.finished = true;
+ finished = true;
}
} catch (TruncatedChunkException ex) {
this.buffer.shutdown();
- this.finished = true;
+ finished = true;
}
- }
-
- public void finish() {
- this.finished = true;
- }
-
- @Override
- public void consumeContent() throws IOException {
- }
-
- @Override
- public InputStream getContent() throws IOException {
- if (!this.finished) {
- throw new IllegalStateException("Entity content has not been fully received");
+ if (finished) {
+ this.response.setEntity(
+ new InputStreamEntity(new ContentInputStream(this.buffer), -1));
}
- if (this.consumed) {
- throw new IllegalStateException("Entity content has been consumed");
- }
- this.consumed = true;
- return new ContentInputStream(this.buffer);
- }
-
- @Override
- public boolean isRepeatable() {
- return false;
}
@Override
- public boolean isStreaming() {
- return true;
+ protected void releaseResources() {
}
@Override
- public void writeTo(final OutputStream outstream) throws IOException {
- if (outstream == null) {
- throw new IllegalArgumentException("Output stream may not be null");
- }
- InputStream instream = getContent();
- byte[] buffer = new byte[BUFFER_SIZE];
- int l;
- // consume until EOF
- while ((l = instream.read(buffer)) != -1) {
- outstream.write(buffer, 0, l);
- }
+ protected HttpResponse buildResult() {
+ return this.response;
}
}
@Test
public void testIgnoreTruncatedChunkException() throws Exception {
-
- NHttpRequestExecutionHandler requestExecutionHandler = new RequestExecutionHandler() {
-
- @Override
- protected HttpRequest generateRequest(final Job testjob) {
- String s = testjob.getPattern() + "x" + testjob.getCount();
- return new BasicHttpRequest("GET", s);
- }
-
- @Override
- public ConsumingNHttpEntity responseEntity(
- final HttpResponse response,
- final HttpContext context) throws IOException {
- return new LenientNHttpEntity(response.getEntity(),
- new HeapByteBufferAllocator());
- }
-
- };
-
- Job testjob = new Job(2000);
- Queue<Job> queue = new ConcurrentLinkedQueue<Job>();
- queue.add(testjob);
-
- AsyncNHttpServiceHandler serviceHandler = new AsyncNHttpServiceHandler(
+ HttpAsyncRequestHandlerRegistry registry = new HttpAsyncRequestHandlerRegistry();
+ registry.register("*", new BufferingAsyncRequestHandler(new SimpleRequestHandler(true)));
+ HttpAsyncServiceHandler serviceHandler = new HttpAsyncServiceHandler(
+ registry,
this.serverHttpProc,
- new DefaultHttpResponseFactory(),
new DefaultConnectionReuseStrategy(),
this.serverParams);
-
- serviceHandler.setHandlerResolver(
- new SimpleNHttpRequestHandlerResolver(new RequestHandler(true)));
- serviceHandler.setEventListener(
- new SimpleEventListener());
-
- AsyncNHttpClientHandler clientHandler = new AsyncNHttpClientHandler(
- this.clientHttpProc,
- requestExecutionHandler,
- new DefaultConnectionReuseStrategy(),
- this.clientParams);
-
- clientHandler.setEventListener(
- new SimpleEventListener());
-
+ HttpAsyncClientProtocolHandler clientHandler = new HttpAsyncClientProtocolHandler();
this.server.start(serviceHandler);
this.client.start(clientHandler);
ListenerEndpoint endpoint = this.server.getListenerEndpoint();
endpoint.waitFor();
- InetSocketAddress serverAddress = (InetSocketAddress) endpoint.getAddress();
- this.client.openConnection(
- new InetSocketAddress("localhost", serverAddress.getPort()),
- queue);
-
- testjob.waitFor();
- if (testjob.isSuccessful()) {
- Assert.assertEquals(HttpStatus.SC_OK, testjob.getStatusCode());
- Assert.assertEquals(new String(GARBAGE, "US-ASCII"), testjob.getResult());
- } else {
- Assert.fail(testjob.getFailureMessage());
- }
+ Assert.assertEquals("Test server status", IOReactorStatus.ACTIVE, this.server.getStatus());
+
+ String pattern = RndTestPatternGenerator.generateText();
+ int count = RndTestPatternGenerator.generateCount(1000);
+
+ HttpHost target = new HttpHost("localhost", ((InetSocketAddress)endpoint.getAddress()).getPort());
+ BasicHttpRequest request = new BasicHttpRequest("GET", pattern + "x" + count);
+ Future<HttpResponse> future = this.executor.execute(
+ new BasicAsyncRequestProducer(target, request),
+ new LenientAsyncResponseConsumer(),
+ this.connpool);
+
+ HttpResponse response = future.get();
+ Assert.assertNotNull(response);
+ Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
+ Assert.assertEquals(new String(GARBAGE, HTTP.DEFAULT_CONTENT_CHARSET),
+ EntityUtils.toString(response.getEntity()));
}
}
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/HttpServerNio.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/HttpServerNio.java?rev=1165298&r1=1165297&r2=1165298&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/HttpServerNio.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/HttpServerNio.java Mon Sep 5 14:34:39 2011
@@ -43,10 +43,6 @@ import org.apache.http.nio.reactor.IORea
import org.apache.http.nio.reactor.ListenerEndpoint;
import org.apache.http.nio.reactor.ListeningIOReactor;
-/**
- * Trivial test server based on HttpCore NIO
- *
- */
public class HttpServerNio {
private final DefaultListeningIOReactor ioReactor;
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/SimpleEventListener.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/SimpleEventListener.java?rev=1165298&r1=1165297&r2=1165298&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/SimpleEventListener.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/SimpleEventListener.java Mon Sep 5 14:34:39 2011
@@ -33,6 +33,7 @@ import org.apache.http.HttpException;
import org.apache.http.nio.NHttpConnection;
import org.apache.http.nio.protocol.EventListener;
+@Deprecated
public class SimpleEventListener implements EventListener {
public SimpleEventListener() {
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/SimpleHttpRequestHandlerResolver.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/SimpleHttpRequestHandlerResolver.java?rev=1165298&r1=1165297&r2=1165298&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/SimpleHttpRequestHandlerResolver.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/SimpleHttpRequestHandlerResolver.java Mon Sep 5 14:34:39 2011
@@ -29,6 +29,7 @@ package org.apache.http.testserver;
import org.apache.http.protocol.HttpRequestHandler;
import org.apache.http.protocol.HttpRequestHandlerResolver;
+@Deprecated
public class SimpleHttpRequestHandlerResolver implements HttpRequestHandlerResolver {
private final HttpRequestHandler handler;
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/SimpleNHttpRequestHandlerResolver.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/SimpleNHttpRequestHandlerResolver.java?rev=1165298&r1=1165297&r2=1165298&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/SimpleNHttpRequestHandlerResolver.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/SimpleNHttpRequestHandlerResolver.java Mon Sep 5 14:34:39 2011
@@ -29,6 +29,7 @@ package org.apache.http.testserver;
import org.apache.http.nio.protocol.NHttpRequestHandler;
import org.apache.http.nio.protocol.NHttpRequestHandlerResolver;
+@Deprecated
public class SimpleNHttpRequestHandlerResolver implements NHttpRequestHandlerResolver {
private final NHttpRequestHandler handler;