Return-Path: X-Original-To: apmail-hc-commits-archive@www.apache.org Delivered-To: apmail-hc-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 10BDB10340 for ; Wed, 26 Nov 2014 20:30:37 +0000 (UTC) Received: (qmail 92576 invoked by uid 500); 26 Nov 2014 20:30:37 -0000 Delivered-To: apmail-hc-commits-archive@hc.apache.org Received: (qmail 92482 invoked by uid 500); 26 Nov 2014 20:30:36 -0000 Mailing-List: contact commits-help@hc.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "HttpComponents Project" Delivered-To: mailing list commits@hc.apache.org Received: (qmail 92467 invoked by uid 99); 26 Nov 2014 20:30:36 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 26 Nov 2014 20:30:36 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 26 Nov 2014 20:30:31 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id B31002388AB8 for ; Wed, 26 Nov 2014 20:30:11 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1641930 [1/3] - in /httpcomponents/httpcore/trunk: httpcore-ab/src/main/java/org/apache/http/benchmark/ httpcore-nio/src/examples/org/apache/http/examples/nio/ httpcore-nio/src/main/java/org/apache/http/impl/nio/ httpcore-nio/src/main/java... Date: Wed, 26 Nov 2014 20:30:09 -0000 To: commits@hc.apache.org From: olegk@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20141126203011.B31002388AB8@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: olegk Date: Wed Nov 26 20:30:08 2014 New Revision: 1641930 URL: http://svn.apache.org/r1641930 Log: RFC 7230: it is legal for any request method to enclose an entity; revised message delineation logic; removes HttpEntityEnclosingRequest interface; fixes HTTPCORE-318, HTTPCORE-380 Removed: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpEntityEnclosingRequest.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/entity/DisallowIdentityContentLengthStrategy.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHttpEntityEnclosingRequest.java httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/entity/TestDisallowIdentityContentLengthStrategy.java Modified: httpcomponents/httpcore/trunk/httpcore-ab/src/main/java/org/apache/http/benchmark/BenchmarkConnection.java httpcomponents/httpcore/trunk/httpcore-ab/src/main/java/org/apache/http/benchmark/HttpBenchmark.java httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpReverseProxy.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/DefaultNHttpClientConnection.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/DefaultNHttpServerConnection.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/NHttpConnectionBase.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/AbstractAsyncRequestConsumer.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestConsumer.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestProducer.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/HttpAsyncService.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/TestDefaultNHttpClientConnection.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/TestDefaultNHttpServerConnection.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/TestNHttpConnectionBase.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/SimpleRequestHandler.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/TestHttpAsyncHandlers.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/TestHttpAsyncHandlersPipelining.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/TestServerSidePipelining.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncRequestConsumer.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncRequestProducer.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/TestHttpAsyncService.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/testserver/LoggingNHttpClientConnection.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/testserver/LoggingNHttpServerConnection.java httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/ElementalHttpPost.java httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/HttpFileServer.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpClientConnection.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpEntity.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpMessage.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpRequest.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpResponse.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpServerConnection.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ContentLengthStrategy.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/BHttpConnectionBase.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpClientConnection.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpServerConnection.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultHttpRequestFactory.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/entity/LaxContentLengthStrategy.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/entity/StrictContentLengthStrategy.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/AbstractHttpMessage.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHttpResponse.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/HttpRequestExecutor.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/HttpService.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/RequestContent.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/RequestDate.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/RequestExpectContinue.java httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/TestBHttpConnectionBase.java httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/TestDefaultBHttpClientConnection.java httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/TestDefaultBHttpServerConnection.java httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/entity/TestLaxContentLengthStrategy.java httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/entity/TestStrictContentLengthStrategy.java httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/integration/TestSyncHttp.java httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicMessages.java httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/protocol/TestHttpRequestExecutor.java httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/protocol/TestHttpService.java httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/protocol/TestStandardInterceptors.java Modified: httpcomponents/httpcore/trunk/httpcore-ab/src/main/java/org/apache/http/benchmark/BenchmarkConnection.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-ab/src/main/java/org/apache/http/benchmark/BenchmarkConnection.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-ab/src/main/java/org/apache/http/benchmark/BenchmarkConnection.java (original) +++ httpcomponents/httpcore/trunk/httpcore-ab/src/main/java/org/apache/http/benchmark/BenchmarkConnection.java Wed Nov 26 20:30:08 2014 @@ -43,13 +43,13 @@ class BenchmarkConnection extends Defaul } @Override - protected OutputStream createOutputStream(final long len, final SessionOutputBuffer outbuffer) { - return new CountingOutputStream(super.createOutputStream(len, outbuffer), this.stats); + protected OutputStream createContentOutputStream(final long len, final SessionOutputBuffer outbuffer) { + return new CountingOutputStream(super.createContentOutputStream(len, outbuffer), this.stats); } @Override - protected InputStream createInputStream(final long len, final SessionInputBuffer inbuffer) { - return new CountingInputStream(super.createInputStream(len, inbuffer), this.stats); + protected InputStream createContentInputStream(final long len, final SessionInputBuffer inbuffer) { + return new CountingInputStream(super.createContentInputStream(len, inbuffer), this.stats); } } Modified: httpcomponents/httpcore/trunk/httpcore-ab/src/main/java/org/apache/http/benchmark/HttpBenchmark.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-ab/src/main/java/org/apache/http/benchmark/HttpBenchmark.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-ab/src/main/java/org/apache/http/benchmark/HttpBenchmark.java (original) +++ httpcomponents/httpcore/trunk/httpcore-ab/src/main/java/org/apache/http/benchmark/HttpBenchmark.java Wed Nov 26 20:30:08 2014 @@ -52,7 +52,6 @@ import org.apache.http.HttpVersion; import org.apache.http.entity.ContentType; import org.apache.http.entity.FileEntity; import org.apache.http.entity.StringEntity; -import org.apache.http.message.BasicHttpEntityEnclosingRequest; import org.apache.http.message.BasicHttpRequest; import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.ssl.TrustStrategy; @@ -114,13 +113,13 @@ public class HttpBenchmark { final HttpVersion ver = config.isUseHttp1_0() ? HttpVersion.HTTP_1_0 : HttpVersion.HTTP_1_1; final HttpRequest request; if ("POST".equals(config.getMethod())) { - final BasicHttpEntityEnclosingRequest httppost = - new BasicHttpEntityEnclosingRequest("POST", url.getPath(), ver); + final BasicHttpRequest httppost = + new BasicHttpRequest("POST", url.getPath(), ver); httppost.setEntity(entity); request = httppost; } else if ("PUT".equals(config.getMethod())) { - final BasicHttpEntityEnclosingRequest httpput = - new BasicHttpEntityEnclosingRequest("PUT", url.getPath(), ver); + final BasicHttpRequest httpput = + new BasicHttpRequest("PUT", url.getPath(), ver); httpput.setEntity(entity); request = httpput; } else { Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpReverseProxy.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpReverseProxy.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpReverseProxy.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpReverseProxy.java Wed Nov 26 20:30:08 2014 @@ -35,7 +35,6 @@ import java.util.Locale; import java.util.concurrent.atomic.AtomicLong; import org.apache.http.ConnectionReuseStrategy; -import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpException; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; @@ -55,7 +54,6 @@ import org.apache.http.impl.nio.pool.Bas import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor; import org.apache.http.impl.nio.reactor.DefaultListeningIOReactor; import org.apache.http.impl.nio.reactor.IOReactorConfig; -import org.apache.http.message.BasicHttpEntityEnclosingRequest; import org.apache.http.message.BasicHttpRequest; import org.apache.http.message.BasicHttpResponse; import org.apache.http.nio.ContentDecoder; @@ -525,14 +523,9 @@ public class NHttpReverseProxy { HttpRequest request = this.httpExchange.getRequest(); System.out.println("[proxy->origin] " + this.httpExchange.getId() + " " + request.getRequestLine()); // Rewrite request!!!! - if (request instanceof HttpEntityEnclosingRequest) { - BasicHttpEntityEnclosingRequest r = new BasicHttpEntityEnclosingRequest( - request.getRequestLine()); - r.setEntity(((HttpEntityEnclosingRequest) request).getEntity()); - return r; - } else { - return new BasicHttpRequest(request.getRequestLine()); - } + BasicHttpRequest newREquest = new BasicHttpRequest(request.getRequestLine()); + newREquest.setEntity(request.getEntity()); + return newREquest; } } Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/DefaultNHttpClientConnection.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/DefaultNHttpClientConnection.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/DefaultNHttpClientConnection.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/DefaultNHttpClientConnection.java Wed Nov 26 20:30:08 2014 @@ -33,13 +33,15 @@ import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; import org.apache.http.HttpEntity; -import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; +import org.apache.http.ProtocolException; import org.apache.http.annotation.NotThreadSafe; import org.apache.http.config.MessageConstraints; import org.apache.http.entity.ContentLengthStrategy; +import org.apache.http.impl.entity.LaxContentLengthStrategy; +import org.apache.http.impl.entity.StrictContentLengthStrategy; import org.apache.http.impl.nio.codecs.DefaultHttpRequestWriterFactory; import org.apache.http.impl.nio.codecs.DefaultHttpResponseParserFactory; import org.apache.http.nio.NHttpClientConnection; @@ -63,8 +65,11 @@ import org.apache.http.util.Args; public class DefaultNHttpClientConnection extends NHttpConnectionBase implements NHttpClientConnection { - protected final NHttpMessageParser responseParser; - protected final NHttpMessageWriter requestWriter; + private final ContentLengthStrategy incomingContentStrategy; + private final ContentLengthStrategy outgoingContentStrategy; + + private final NHttpMessageParser responseParser; + private final NHttpMessageWriter requestWriter; /** * Creates new instance DefaultNHttpClientConnection given the underlying I/O session. @@ -100,12 +105,15 @@ public class DefaultNHttpClientConnectio final ContentLengthStrategy outgoingContentStrategy, final NHttpMessageWriterFactory requestWriterFactory, final NHttpMessageParserFactory responseParserFactory) { - super(session, buffersize, fragmentSizeHint, allocator, chardecoder, charencoder, - constraints, incomingContentStrategy, outgoingContentStrategy); + super(session, buffersize, fragmentSizeHint, allocator, chardecoder, charencoder, constraints); this.requestWriter = (requestWriterFactory != null ? requestWriterFactory : DefaultHttpRequestWriterFactory.INSTANCE).create(); this.responseParser = (responseParserFactory != null ? responseParserFactory : DefaultHttpResponseParserFactory.INSTANCE).create(constraints); + this.incomingContentStrategy = incomingContentStrategy != null ? incomingContentStrategy : + LaxContentLengthStrategy.INSTANCE; + this.outgoingContentStrategy = outgoingContentStrategy != null ? outgoingContentStrategy : + StrictContentLengthStrategy.INSTANCE; } /** @@ -171,8 +179,17 @@ public class DefaultNHttpClientConnectio } while (bytesRead > 0 && this.response == null); if (this.response != null) { if (this.response.getStatusLine().getStatusCode() >= 200) { - final HttpEntity entity = prepareDecoder(this.response); - this.response.setEntity(entity); + final long len = this.incomingContentStrategy.determineLength(this.response); + if (len != ContentLengthStrategy.UNDEFINED) { + this.contentDecoder = createContentDecoder( + len, + this.session.channel(), + this.inbuf, + this.inTransportMetrics); + + final HttpEntity entity = createIncomingEntity(this.response, len); + this.response.setEntity(entity); + } this.connMetrics.incrementResponseCount(); } this.hasBufferedInput = this.inbuf.hasData(); @@ -253,10 +270,17 @@ public class DefaultNHttpClientConnectio this.requestWriter.write(request, this.outbuf); this.hasBufferedOutput = this.outbuf.hasData(); - if (request instanceof HttpEntityEnclosingRequest - && ((HttpEntityEnclosingRequest) request).getEntity() != null) { - prepareEncoder(request); + if (request.getEntity() != null) { this.request = request; + final long len = this.outgoingContentStrategy.determineLength(request); + if (len == ContentLengthStrategy.IDENTITY || len == ContentLengthStrategy.UNDEFINED) { + throw new ProtocolException("Identity transfer encoding is not allowed for request messages"); + } + this.contentEncoder = createContentEncoder( + len, + this.session.channel(), + this.outbuf, + this.outTransportMetrics); } this.connMetrics.incrementRequestCount(); this.session.setEvent(EventMask.WRITE); Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/DefaultNHttpServerConnection.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/DefaultNHttpServerConnection.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/DefaultNHttpServerConnection.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/DefaultNHttpServerConnection.java Wed Nov 26 20:30:08 2014 @@ -33,14 +33,14 @@ import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; import org.apache.http.HttpEntity; -import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; +import org.apache.http.ProtocolException; import org.apache.http.annotation.NotThreadSafe; import org.apache.http.config.MessageConstraints; import org.apache.http.entity.ContentLengthStrategy; -import org.apache.http.impl.entity.DisallowIdentityContentLengthStrategy; +import org.apache.http.impl.entity.LaxContentLengthStrategy; import org.apache.http.impl.entity.StrictContentLengthStrategy; import org.apache.http.impl.nio.codecs.DefaultHttpRequestParserFactory; import org.apache.http.impl.nio.codecs.DefaultHttpResponseWriterFactory; @@ -65,8 +65,10 @@ import org.apache.http.util.Args; public class DefaultNHttpServerConnection extends NHttpConnectionBase implements NHttpServerConnection { - protected final NHttpMessageParser requestParser; - protected final NHttpMessageWriter responseWriter; + private final ContentLengthStrategy incomingContentStrategy; + private final ContentLengthStrategy outgoingContentStrategy; + private final NHttpMessageParser requestParser; + private final NHttpMessageWriter responseWriter; /** * Creates new instance DefaultNHttpServerConnection given the underlying I/O session. @@ -84,7 +86,7 @@ public class DefaultNHttpServerConnectio * @param constraints Message constraints. If {@code null} * {@link MessageConstraints#DEFAULT} will be used. * @param incomingContentStrategy incoming content length strategy. If {@code null} - * {@link DisallowIdentityContentLengthStrategy#INSTANCE} will be used. + * {@link org.apache.http.impl.entity.LaxContentLengthStrategy#INSTANCE} will be used. * @param outgoingContentStrategy outgoing content length strategy. If {@code null} * {@link StrictContentLengthStrategy#INSTANCE} will be used. * @param requestParserFactory request parser factory. If {@code null} @@ -106,16 +108,15 @@ public class DefaultNHttpServerConnectio final ContentLengthStrategy outgoingContentStrategy, final NHttpMessageParserFactory requestParserFactory, final NHttpMessageWriterFactory responseWriterFactory) { - super(session, buffersize, fragmentSizeHint, allocator, chardecoder, charencoder, - constraints, - incomingContentStrategy != null ? incomingContentStrategy : - DisallowIdentityContentLengthStrategy.INSTANCE, - outgoingContentStrategy != null ? outgoingContentStrategy : - StrictContentLengthStrategy.INSTANCE); + super(session, buffersize, fragmentSizeHint, allocator, chardecoder, charencoder, constraints); this.requestParser = (requestParserFactory != null ? requestParserFactory : DefaultHttpRequestParserFactory.INSTANCE).create(constraints); this.responseWriter = (responseWriterFactory != null ? responseWriterFactory : DefaultHttpResponseWriterFactory.INSTANCE).create(); + this.incomingContentStrategy = incomingContentStrategy != null ? incomingContentStrategy : + LaxContentLengthStrategy.INSTANCE; + this.outgoingContentStrategy = outgoingContentStrategy != null ? outgoingContentStrategy : + StrictContentLengthStrategy.INSTANCE; } /** @@ -180,10 +181,18 @@ public class DefaultNHttpServerConnectio this.request = this.requestParser.parse(this.inbuf, bytesRead == -1); } while (bytesRead > 0 && this.request == null); if (this.request != null) { - if (this.request instanceof HttpEntityEnclosingRequest) { - // Receive incoming entity - final HttpEntity entity = prepareDecoder(this.request); - ((HttpEntityEnclosingRequest)this.request).setEntity(entity); + final long len = this.incomingContentStrategy.determineLength(this.request); + if (len == ContentLengthStrategy.IDENTITY) { + throw new ProtocolException("Identity transfer encoding is not allowed for request messages"); + } + if (len != ContentLengthStrategy.UNDEFINED) { + this.contentDecoder = createContentDecoder( + len, + this.session.channel(), + this.inbuf, + this.inTransportMetrics); + final HttpEntity entity = createIncomingEntity(this.request, len); + this.request.setEntity(entity); } this.connMetrics.incrementRequestCount(); this.hasBufferedInput = this.inbuf.hasData(); @@ -267,7 +276,12 @@ public class DefaultNHttpServerConnectio this.connMetrics.incrementResponseCount(); if (response.getEntity() != null) { this.response = response; - prepareEncoder(response); + final long len = this.outgoingContentStrategy.determineLength(response); + this.contentEncoder = createContentEncoder( + len, + this.session.channel(), + this.outbuf, + this.outTransportMetrics); } } Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/NHttpConnectionBase.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/NHttpConnectionBase.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/NHttpConnectionBase.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/NHttpConnectionBase.java Wed Nov 26 20:30:08 2014 @@ -44,13 +44,10 @@ import org.apache.http.HttpHeaders; import org.apache.http.HttpMessage; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; -import org.apache.http.annotation.NotThreadSafe; import org.apache.http.config.MessageConstraints; import org.apache.http.entity.BasicHttpEntity; import org.apache.http.entity.ContentLengthStrategy; import org.apache.http.impl.HttpConnectionMetricsImpl; -import org.apache.http.impl.entity.LaxContentLengthStrategy; -import org.apache.http.impl.entity.StrictContentLengthStrategy; import org.apache.http.impl.io.HttpTransportMetricsImpl; import org.apache.http.impl.nio.codecs.ChunkDecoder; import org.apache.http.impl.nio.codecs.ChunkEncoder; @@ -74,71 +71,36 @@ import org.apache.http.protocol.HttpCont import org.apache.http.util.Args; import org.apache.http.util.NetUtils; -/** - * This class serves as a base for all {@link NHttpConnection} implementations and provides - * functionality common to both client and server HTTP connections. - * - * @since 4.0 - */ -@NotThreadSafe -public class NHttpConnectionBase implements NHttpConnection, SessionBufferStatus, SocketAccessor { - - protected final ContentLengthStrategy incomingContentStrategy; - protected final ContentLengthStrategy outgoingContentStrategy; - - protected final SessionInputBufferImpl inbuf; - protected final SessionOutputBufferImpl outbuf; - private final int fragmentSizeHint; - private final MessageConstraints constraints; - - protected final HttpTransportMetricsImpl inTransportMetrics; - protected final HttpTransportMetricsImpl outTransportMetrics; - protected final HttpConnectionMetricsImpl connMetrics; - - protected HttpContext context; - protected IOSession session; - protected SocketAddress remote; - protected volatile ContentDecoder contentDecoder; - protected volatile boolean hasBufferedInput; - protected volatile ContentEncoder contentEncoder; - protected volatile boolean hasBufferedOutput; - protected volatile HttpRequest request; - protected volatile HttpResponse response; +class NHttpConnectionBase implements NHttpConnection, SessionBufferStatus, SocketAccessor { - protected volatile int status; + final SessionInputBufferImpl inbuf; + final SessionOutputBufferImpl outbuf; + final int fragmentSizeHint; + final MessageConstraints constraints; + + final HttpTransportMetricsImpl inTransportMetrics; + final HttpTransportMetricsImpl outTransportMetrics; + final HttpConnectionMetricsImpl connMetrics; + + volatile HttpContext context; + volatile IOSession session; + volatile ContentDecoder contentDecoder; + volatile boolean hasBufferedInput; + volatile ContentEncoder contentEncoder; + volatile boolean hasBufferedOutput; + volatile HttpRequest request; + volatile HttpResponse response; - /** - * Creates new instance NHttpConnectionBase given the underlying I/O session. - * - * @param session the underlying I/O session. - * @param buffersize buffer size. Must be a positive number. - * @param fragmentSizeHint fragment size hint. - * @param allocator memory allocator. - * If {@code null} {@link org.apache.http.nio.util.HeapByteBufferAllocator#INSTANCE} - * will be used. - * @param chardecoder decoder to be used for decoding HTTP protocol elements. - * If {@code null} simple type cast will be used for byte to char conversion. - * @param charencoder encoder to be used for encoding HTTP protocol elements. - * If {@code null} simple type cast will be used for char to byte conversion. - * @param constraints Message constraints. If {@code null} - * {@link MessageConstraints#DEFAULT} will be used. - * @param incomingContentStrategy incoming content length strategy. If {@code null} - * {@link LaxContentLengthStrategy#INSTANCE} will be used. - * @param outgoingContentStrategy outgoing content length strategy. If {@code null} - * {@link StrictContentLengthStrategy#INSTANCE} will be used. - * - * @since 4.4 - */ - protected NHttpConnectionBase( + volatile int status; + + NHttpConnectionBase( final IOSession session, final int buffersize, final int fragmentSizeHint, final ByteBufferAllocator allocator, final CharsetDecoder chardecoder, final CharsetEncoder charencoder, - final MessageConstraints constraints, - final ContentLengthStrategy incomingContentStrategy, - final ContentLengthStrategy outgoingContentStrategy) { + final MessageConstraints constraints) { Args.notNull(session, "I/O session"); Args.positive(buffersize, "Buffer size"); int linebuffersize = buffersize; @@ -148,58 +110,29 @@ public class NHttpConnectionBase impleme this.inbuf = new SessionInputBufferImpl(buffersize, linebuffersize, chardecoder, allocator); this.outbuf = new SessionOutputBufferImpl(buffersize, linebuffersize, charencoder, allocator); this.fragmentSizeHint = fragmentSizeHint >= 0 ? fragmentSizeHint : buffersize; - this.inTransportMetrics = new HttpTransportMetricsImpl(); this.outTransportMetrics = new HttpTransportMetricsImpl(); this.connMetrics = new HttpConnectionMetricsImpl(this.inTransportMetrics, this.outTransportMetrics); this.constraints = constraints != null ? constraints : MessageConstraints.DEFAULT; - this.incomingContentStrategy = incomingContentStrategy != null ? incomingContentStrategy : - LaxContentLengthStrategy.INSTANCE; - this.outgoingContentStrategy = outgoingContentStrategy != null ? outgoingContentStrategy : - StrictContentLengthStrategy.INSTANCE; setSession(session); this.status = ACTIVE; } - /** - * Creates new instance NHttpConnectionBase given the underlying I/O session. - * - * @param session the underlying I/O session. - * @param buffersize buffer size. Must be a positive number. - * @param fragmentSizeHint fragment size hint. - * @param allocator memory allocator. - * If {@code null} {@link org.apache.http.nio.util.HeapByteBufferAllocator#INSTANCE} - * will be used. - * @param chardecoder decoder to be used for decoding HTTP protocol elements. - * If {@code null} simple type cast will be used for byte to char conversion. - * @param charencoder encoder to be used for encoding HTTP protocol elements. - * If {@code null} simple type cast will be used for char to byte conversion. - * @param incomingContentStrategy incoming content length strategy. If {@code null} - * {@link LaxContentLengthStrategy#INSTANCE} will be used. - * @param outgoingContentStrategy outgoing content length strategy. If {@code null} - * {@link StrictContentLengthStrategy#INSTANCE} will be used. - * - * @since 4.3 - */ - protected NHttpConnectionBase( + NHttpConnectionBase( final IOSession session, final int buffersize, final int fragmentSizeHint, final ByteBufferAllocator allocator, final CharsetDecoder chardecoder, - final CharsetEncoder charencoder, - final ContentLengthStrategy incomingContentStrategy, - final ContentLengthStrategy outgoingContentStrategy) { - this(session, buffersize, fragmentSizeHint, allocator, chardecoder, charencoder, - null, incomingContentStrategy, outgoingContentStrategy); + final CharsetEncoder charencoder) { + this(session, buffersize, fragmentSizeHint, allocator, chardecoder, charencoder, null); } private void setSession(final IOSession session) { this.session = session; this.context = new SessionHttpContext(this.session); this.session.setBufferStatus(this); - this.remote = this.session.getRemoteAddress(); } /** @@ -253,34 +186,20 @@ public class NHttpConnectionBase impleme this.session.clearEvent(EventMask.WRITE); } - /** - * Initializes a specific {@link ContentDecoder} implementation based on the - * properties of the given {@link HttpMessage} and generates an instance of - * {@link HttpEntity} matching the properties of the content decoder. - * - * @param message the HTTP message. - * @return HTTP entity. - * @throws HttpException in case of an HTTP protocol violation. - */ - protected HttpEntity prepareDecoder(final HttpMessage message) throws HttpException { + HttpEntity createIncomingEntity( + final HttpMessage message, + final long len) throws HttpException { final BasicHttpEntity entity = new BasicHttpEntity(); - final long len = this.incomingContentStrategy.determineLength(message); - this.contentDecoder = createContentDecoder( - len, - this.session.channel(), - this.inbuf, - this.inTransportMetrics); - if (len == ContentLengthStrategy.CHUNKED) { - entity.setChunked(true); - entity.setContentLength(-1); - } else if (len == ContentLengthStrategy.IDENTITY) { + if (len >= 0) { entity.setChunked(false); + entity.setContentLength(len); + } else if (len == ContentLengthStrategy.CHUNKED) { + entity.setChunked(true); entity.setContentLength(-1); } else { entity.setChunked(false); - entity.setContentLength(len); + entity.setContentLength(-1); } - final Header contentTypeHeader = message.getFirstHeader(HttpHeaders.CONTENT_TYPE); if (contentTypeHeader != null) { entity.setContentType(contentTypeHeader); @@ -296,7 +215,7 @@ public class NHttpConnectionBase impleme * Factory method for {@link ContentDecoder} instances. * * @param len content length, if known, {@link ContentLengthStrategy#CHUNKED} or - * {@link ContentLengthStrategy#IDENTITY}, if unknown. + * {@link ContentLengthStrategy#UNDEFINED}, if unknown. * @param channel the session channel. * @param buffer the session buffer. * @param metrics transport metrics. @@ -310,36 +229,20 @@ public class NHttpConnectionBase impleme final ReadableByteChannel channel, final SessionInputBuffer buffer, final HttpTransportMetricsImpl metrics) { - if (len == ContentLengthStrategy.CHUNKED) { + if (len >= 0) { + return new LengthDelimitedDecoder(channel, buffer, metrics, len); + } else if (len == ContentLengthStrategy.CHUNKED) { return new ChunkDecoder(channel, buffer, this.constraints, metrics); - } else if (len == ContentLengthStrategy.IDENTITY) { - return new IdentityDecoder(channel, buffer, metrics); } else { - return new LengthDelimitedDecoder(channel, buffer, metrics, len); + return new IdentityDecoder(channel, buffer, metrics); } } /** - * Initializes a specific {@link ContentEncoder} implementation based on the - * properties of the given {@link HttpMessage}. - * - * @param message the HTTP message. - * @throws HttpException in case of an HTTP protocol violation. - */ - protected void prepareEncoder(final HttpMessage message) throws HttpException { - final long len = this.outgoingContentStrategy.determineLength(message); - this.contentEncoder = createContentEncoder( - len, - this.session.channel(), - this.outbuf, - this.outTransportMetrics); - } - - /** * Factory method for {@link ContentEncoder} instances. * * @param len content length, if known, {@link ContentLengthStrategy#CHUNKED} or - * {@link ContentLengthStrategy#IDENTITY}, if unknown. + * {@link ContentLengthStrategy#UNDEFINED}, if unknown. * @param channel the session channel. * @param buffer the session buffer. * @param metrics transport metrics. @@ -353,12 +256,12 @@ public class NHttpConnectionBase impleme final WritableByteChannel channel, final SessionOutputBuffer buffer, final HttpTransportMetricsImpl metrics) { - if (len == ContentLengthStrategy.CHUNKED) { + if (len >= 0) { + return new LengthDelimitedEncoder(channel, buffer, metrics, len, this.fragmentSizeHint); + } else if (len == ContentLengthStrategy.CHUNKED) { return new ChunkEncoder(channel, buffer, metrics, this.fragmentSizeHint); - } else if (len == ContentLengthStrategy.IDENTITY) { - return new IdentityEncoder(channel, buffer, metrics, this.fragmentSizeHint); } else { - return new LengthDelimitedEncoder(channel, buffer, metrics, len, this.fragmentSizeHint); + return new IdentityEncoder(channel, buffer, metrics, this.fragmentSizeHint); } } Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/AbstractAsyncRequestConsumer.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/AbstractAsyncRequestConsumer.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/AbstractAsyncRequestConsumer.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/AbstractAsyncRequestConsumer.java Wed Nov 26 20:30:08 2014 @@ -30,7 +30,6 @@ import java.io.IOException; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.http.HttpEntity; -import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.entity.ContentType; @@ -60,8 +59,7 @@ public abstract class AbstractAsyncReque /** * Invoked when a HTTP request message is received. Please note * that the {@link #onContentReceived(ContentDecoder, IOControl)} method - * will be invoked only for if the request message implements - * {@link HttpEntityEnclosingRequest} interface and has a content + * will be invoked only for if the request message has a content * entity enclosed. * * @param request HTTP request message. @@ -127,12 +125,10 @@ public abstract class AbstractAsyncReque public final void requestReceived( final HttpRequest request) throws HttpException, IOException { onRequestReceived(request); - if (request instanceof HttpEntityEnclosingRequest) { - final HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity(); - if (entity != null) { - final ContentType contentType = ContentType.getOrDefault(entity); - onEntityEnclosed(entity, contentType); - } + final HttpEntity entity = request.getEntity(); + if (entity != null) { + final ContentType contentType = ContentType.getOrDefault(entity); + onEntityEnclosed(entity, contentType); } } Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestConsumer.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestConsumer.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestConsumer.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestConsumer.java Wed Nov 26 20:30:08 2014 @@ -30,7 +30,6 @@ import java.io.IOException; import org.apache.http.ContentTooLongException; import org.apache.http.HttpEntity; -import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpRequest; import org.apache.http.entity.ContentType; import org.apache.http.nio.ContentDecoder; @@ -73,8 +72,7 @@ public class BasicAsyncRequestConsumer e len = 4096; } this.buf = new SimpleInputBuffer((int) len, new HeapByteBufferAllocator()); - ((HttpEntityEnclosingRequest) this.request).setEntity( - new ContentBufferEntity(entity, this.buf)); + this.request.setEntity(new ContentBufferEntity(entity, this.buf)); } @Override Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestProducer.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestProducer.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestProducer.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestProducer.java Wed Nov 26 20:30:08 2014 @@ -29,7 +29,6 @@ package org.apache.http.nio.protocol; import java.io.IOException; import org.apache.http.HttpEntity; -import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; import org.apache.http.nio.ContentEncoder; @@ -68,7 +67,7 @@ public class BasicAsyncRequestProducer i */ protected BasicAsyncRequestProducer( final HttpHost target, - final HttpEntityEnclosingRequest request, + final HttpRequest request, final HttpAsyncContentProducer producer) { super(); Args.notNull(target, "HTTP host"); @@ -92,16 +91,12 @@ public class BasicAsyncRequestProducer i Args.notNull(request, "HTTP request"); this.target = target; this.request = request; - if (request instanceof HttpEntityEnclosingRequest) { - final HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity(); - if (entity != null) { - if (entity instanceof HttpAsyncContentProducer) { - this.producer = (HttpAsyncContentProducer) entity; - } else { - this.producer = new EntityAsyncContentProducer(entity); - } + final HttpEntity entity = request.getEntity(); + if (entity != null) { + if (entity instanceof HttpAsyncContentProducer) { + this.producer = (HttpAsyncContentProducer) entity; } else { - this.producer = null; + this.producer = new EntityAsyncContentProducer(entity); } } else { this.producer = null; 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=1641930&r1=1641929&r2=1641930&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 Wed Nov 26 20:30:08 2014 @@ -32,9 +32,10 @@ import java.net.SocketTimeoutException; import org.apache.http.ConnectionClosedException; import org.apache.http.ExceptionLogger; +import org.apache.http.Header; import org.apache.http.HttpEntity; -import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpException; +import org.apache.http.HttpHeaders; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; @@ -183,8 +184,10 @@ public class HttpAsyncRequestExecutor im } state.setRequest(request); - if (request instanceof HttpEntityEnclosingRequest) { - final boolean expectContinue = ((HttpEntityEnclosingRequest) request).expectContinue(); + final HttpEntity entity = request.getEntity(); + if (entity != null) { + final Header expect = request.getFirstHeader(HttpHeaders.EXPECT); + final boolean expectContinue = expect != null && "100-continue".equalsIgnoreCase(expect.getValue()); if (expectContinue && pipelined) { throw new ProtocolException("Expect-continue handshake cannot be used with request pipelining"); } @@ -195,13 +198,7 @@ public class HttpAsyncRequestExecutor im conn.setSocketTimeout(this.waitForContinue); state.setRequestState(MessageState.ACK_EXPECTED); } else { - final HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity(); - if (entity != null) { - state.setRequestState(MessageState.BODY_STREAM); - } else { - handler.requestCompleted(); - state.setRequestState(pipelined ? MessageState.READY : MessageState.COMPLETED); - } + state.setRequestState(MessageState.BODY_STREAM); } } else { conn.submitRequest(request); Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncService.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncService.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncService.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncService.java Wed Nov 26 20:30:08 2014 @@ -35,9 +35,10 @@ import java.util.concurrent.atomic.Atomi import org.apache.http.ConnectionReuseStrategy; import org.apache.http.ExceptionLogger; +import org.apache.http.Header; import org.apache.http.HttpEntity; -import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpException; +import org.apache.http.HttpHeaders; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.HttpResponseFactory; @@ -283,11 +284,13 @@ public class HttpAsyncService implements final Incoming incoming = new Incoming(request, requestHandler, consumer, context); state.setIncoming(incoming); - if (request instanceof HttpEntityEnclosingRequest) { - + final HttpEntity entity = request.getEntity(); + if (entity != null) { // If 100-continue is expected make sure // there is no pending response data, no pipelined requests or buffered input - if (((HttpEntityEnclosingRequest) request).expectContinue() + final Header expect = request.getFirstHeader(HttpHeaders.EXPECT); + final boolean expectContinue = expect != null && "100-continue".equalsIgnoreCase(expect.getValue()); + if (expectContinue && state.getResponseState() == MessageState.READY && state.getPipeline().isEmpty() && !conn.isDataAvailable()) { Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/TestDefaultNHttpClientConnection.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/TestDefaultNHttpClientConnection.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/TestDefaultNHttpClientConnection.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/TestDefaultNHttpClientConnection.java Wed Nov 26 20:30:08 2014 @@ -33,6 +33,7 @@ import java.util.LinkedList; import org.apache.http.ByteChannelMock; import org.apache.http.Consts; +import org.apache.http.HeaderElements; import org.apache.http.HttpEntity; import org.apache.http.HttpHeaders; import org.apache.http.HttpRequest; @@ -42,7 +43,6 @@ import org.apache.http.ReadableByteChann import org.apache.http.WritableByteChannelMock; import org.apache.http.entity.StringEntity; import org.apache.http.impl.nio.codecs.LengthDelimitedDecoder; -import org.apache.http.message.BasicHttpEntityEnclosingRequest; import org.apache.http.message.BasicHttpRequest; import org.apache.http.nio.ContentDecoder; import org.apache.http.nio.ContentEncoder; @@ -94,7 +94,8 @@ public class TestDefaultNHttpClientConne @Test public void testSubmitEntityEnclosingRequest() throws Exception { - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/"); + final BasicHttpRequest request = new BasicHttpRequest("POST", "/"); + request.setHeader(HttpHeaders.CONTENT_LENGTH, "5"); request.setEntity(new StringEntity("stuff")); Mockito.when(session.channel()).thenReturn(byteChan); @@ -113,7 +114,8 @@ public class TestDefaultNHttpClientConne @Test public void testOutputReset() throws Exception { - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/"); + final BasicHttpRequest request = new BasicHttpRequest("POST", "/"); + request.setHeader(HttpHeaders.CONTENT_LENGTH, "5"); request.setEntity(new StringEntity("stuff")); Mockito.when(session.channel()).thenReturn(byteChan); @@ -168,7 +170,8 @@ public class TestDefaultNHttpClientConne @Test public void testProduceOutputShortMessageAfterSubmit() throws Exception { - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/"); + final BasicHttpRequest request = new BasicHttpRequest("POST", "/"); + request.setHeader(HttpHeaders.CONTENT_LENGTH, "5"); final NStringEntity entity = new NStringEntity("stuff"); request.setEntity(entity); @@ -177,7 +180,7 @@ public class TestDefaultNHttpClientConne Mockito.when(session.channel()).thenReturn(channel); conn.submitRequest(request); - Assert.assertEquals(19, conn.outbuf.length()); + Assert.assertTrue(conn.outbuf.hasData()); Mockito.doAnswer(new ProduceContentAnswer(entity)).when( handler).outputReady(Mockito.any(), Mockito.any()); @@ -186,15 +189,16 @@ public class TestDefaultNHttpClientConne Assert.assertNull(conn.getHttpRequest()); Assert.assertNull(conn.contentEncoder); - Assert.assertEquals("POST / HTTP/1.1\r\n\r\nstuff", wchannel.dump(Consts.ASCII)); + Assert.assertEquals("POST / HTTP/1.1\r\nContent-Length: 5\r\n\r\nstuff", wchannel.dump(Consts.ASCII)); Mockito.verify(session, Mockito.times(1)).clearEvent(SelectionKey.OP_WRITE); - Mockito.verify(wchannel, Mockito.times(1)).write(Matchers.any()); + Mockito.verify(wchannel, Mockito.times(2)).write(Matchers.any()); } @Test public void testProduceOutputLongMessageAfterSubmit() throws Exception { - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/"); + final BasicHttpRequest request = new BasicHttpRequest("POST", "/"); + request.setHeader(HttpHeaders.CONTENT_LENGTH, "22"); final NStringEntity entity = new NStringEntity("a lot of various stuff"); request.setEntity(entity); @@ -203,7 +207,7 @@ public class TestDefaultNHttpClientConne Mockito.when(session.channel()).thenReturn(channel); conn.submitRequest(request); - Assert.assertEquals(19, conn.outbuf.length()); + Assert.assertEquals(39, conn.outbuf.length()); Mockito.doAnswer(new ProduceContentAnswer(entity)).when( handler).outputReady(Mockito.any(), Mockito.any()); @@ -212,7 +216,7 @@ public class TestDefaultNHttpClientConne Assert.assertNull(conn.getHttpRequest()); Assert.assertNull(conn.contentEncoder); - Assert.assertEquals("POST / HTTP/1.1\r\n\r\na lot of various stuff", wchannel.dump(Consts.ASCII)); + Assert.assertEquals("POST / HTTP/1.1\r\nContent-Length: 22\r\n\r\na lot of various stuff", wchannel.dump(Consts.ASCII)); Mockito.verify(session, Mockito.times(1)).clearEvent(SelectionKey.OP_WRITE); Mockito.verify(wchannel, Mockito.times(2)).write(Matchers.any()); @@ -220,7 +224,8 @@ public class TestDefaultNHttpClientConne @Test public void testProduceOutputShortMessage() throws Exception { - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/"); + final BasicHttpRequest request = new BasicHttpRequest("POST", "/"); + request.setHeader(HttpHeaders.CONTENT_LENGTH, "5"); final NStringEntity entity = new NStringEntity("stuff"); request.setEntity(entity); @@ -238,15 +243,16 @@ public class TestDefaultNHttpClientConne Assert.assertNull(conn.getHttpRequest()); Assert.assertNull(conn.contentEncoder); - Assert.assertEquals("POST / HTTP/1.1\r\n\r\nstuff", wchannel.dump(Consts.ASCII)); + Assert.assertEquals("POST / HTTP/1.1\r\nContent-Length: 5\r\n\r\nstuff", wchannel.dump(Consts.ASCII)); Mockito.verify(session, Mockito.times(1)).clearEvent(SelectionKey.OP_WRITE); - Mockito.verify(wchannel, Mockito.times(1)).write(Matchers.any()); + Mockito.verify(wchannel, Mockito.times(2)).write(Matchers.any()); } @Test public void testProduceOutputLongMessage() throws Exception { - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/"); + final BasicHttpRequest request = new BasicHttpRequest("POST", "/"); + request.setHeader(HttpHeaders.CONTENT_LENGTH, "22"); final NStringEntity entity = new NStringEntity("a lot of various stuff"); request.setEntity(entity); @@ -264,7 +270,8 @@ public class TestDefaultNHttpClientConne Assert.assertNull(conn.getHttpRequest()); Assert.assertNull(conn.contentEncoder); - Assert.assertEquals("POST / HTTP/1.1\r\n\r\na lot of various stuff", wchannel.dump(Consts.ASCII)); + Assert.assertEquals("POST / HTTP/1.1\r\nContent-Length: 22\r\n\r\na lot of various stuff", + wchannel.dump(Consts.ASCII)); Mockito.verify(session, Mockito.times(1)).clearEvent(SelectionKey.OP_WRITE); Mockito.verify(wchannel, Mockito.times(2)).write(Matchers.any()); @@ -272,11 +279,12 @@ public class TestDefaultNHttpClientConne @Test public void testProduceOutputLongMessageSaturatedChannel() throws Exception { - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/"); + final BasicHttpRequest request = new BasicHttpRequest("POST", "/"); + request.setHeader(HttpHeaders.CONTENT_LENGTH, "22"); final NStringEntity entity = new NStringEntity("a lot of various stuff"); request.setEntity(entity); - final WritableByteChannelMock wchannel = Mockito.spy(new WritableByteChannelMock(64, 24)); + final WritableByteChannelMock wchannel = Mockito.spy(new WritableByteChannelMock(64, 48)); final ByteChannelMock channel = new ByteChannelMock(null, wchannel); Mockito.when(session.channel()).thenReturn(channel); @@ -290,8 +298,7 @@ public class TestDefaultNHttpClientConne Assert.assertNull(conn.getHttpRequest()); Assert.assertNull(conn.contentEncoder); - Assert.assertEquals("POST / HTTP/1.1\r\n\r\na lot", wchannel.dump(Consts.ASCII)); - Assert.assertEquals(17, conn.outbuf.length()); + Assert.assertTrue(conn.outbuf.hasData()); Mockito.verify(session, Mockito.never()).clearEvent(SelectionKey.OP_WRITE); Mockito.verify(wchannel, Mockito.times(2)).write(Matchers.any()); @@ -300,11 +307,12 @@ public class TestDefaultNHttpClientConne @Test public void testProduceOutputLongMessageSaturatedChannel2() throws Exception { conn = new DefaultNHttpClientConnection(session, 24); - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/"); + final BasicHttpRequest request = new BasicHttpRequest("POST", "/"); + request.setHeader(HttpHeaders.CONTENT_LENGTH, "45"); final NStringEntity entity = new NStringEntity("a loooooooooooooooooooooooot of various stuff"); request.setEntity(entity); - final WritableByteChannelMock wchannel = Mockito.spy(new WritableByteChannelMock(64, 24)); + final WritableByteChannelMock wchannel = Mockito.spy(new WritableByteChannelMock(64, 48)); final ByteChannelMock channel = new ByteChannelMock(null, wchannel); Mockito.when(session.channel()).thenReturn(channel); @@ -318,7 +326,7 @@ public class TestDefaultNHttpClientConne Assert.assertNotNull(conn.getHttpRequest()); Assert.assertNotNull(conn.contentEncoder); - Assert.assertEquals("POST / HTTP/1.1\r\n\r\na loo", wchannel.dump(Consts.ASCII)); + Assert.assertFalse(conn.outbuf.hasData()); Mockito.verify(session, Mockito.never()).clearEvent(SelectionKey.OP_WRITE); Mockito.verify(wchannel, Mockito.times(3)).write(Matchers.any()); @@ -328,8 +336,8 @@ public class TestDefaultNHttpClientConne public void testProduceOutputLongChunkedMessage() throws Exception { conn = new DefaultNHttpClientConnection(session, 64); - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/"); - request.addHeader(HttpHeaders.TRANSFER_ENCODING, "chunked"); + final BasicHttpRequest request = new BasicHttpRequest("POST", "/"); + request.setHeader(HttpHeaders.TRANSFER_ENCODING, HeaderElements.CHUNKED_ENCODING); final NStringEntity entity = new NStringEntity("a lot of various stuff"); entity.setChunked(true); request.setEntity(entity); @@ -359,8 +367,8 @@ public class TestDefaultNHttpClientConne public void testProduceOutputLongChunkedMessageSaturatedChannel() throws Exception { conn = new DefaultNHttpClientConnection(session, 64); - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/"); - request.addHeader(HttpHeaders.TRANSFER_ENCODING, "chunked"); + final BasicHttpRequest request = new BasicHttpRequest("POST", "/"); + request.setHeader(HttpHeaders.TRANSFER_ENCODING, HeaderElements.CHUNKED_ENCODING); final NStringEntity entity = new NStringEntity("a lot of various stuff"); entity.setChunked(true); request.setEntity(entity); Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/TestDefaultNHttpServerConnection.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/TestDefaultNHttpServerConnection.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/TestDefaultNHttpServerConnection.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/TestDefaultNHttpServerConnection.java Wed Nov 26 20:30:08 2014 @@ -34,7 +34,6 @@ import java.util.LinkedList; import org.apache.http.ByteChannelMock; import org.apache.http.Consts; import org.apache.http.HttpEntity; -import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpHeaders; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; @@ -325,7 +324,7 @@ public class TestDefaultNHttpServerConne conn = new DefaultNHttpServerConnection(session, 64); final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); - response.addHeader(HttpHeaders.TRANSFER_ENCODING, "chunked"); + response.setHeader(HttpHeaders.TRANSFER_ENCODING, "chunked"); final NStringEntity entity = new NStringEntity("a lot of various stuff"); entity.setChunked(true); response.setEntity(entity); @@ -355,7 +354,7 @@ public class TestDefaultNHttpServerConne conn = new DefaultNHttpServerConnection(session, 64); final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); - response.addHeader(HttpHeaders.TRANSFER_ENCODING, "chunked"); + response.setHeader(HttpHeaders.TRANSFER_ENCODING, "chunked"); final NStringEntity entity = new NStringEntity("a lot of various stuff"); entity.setChunked(true); response.setEntity(entity); @@ -489,8 +488,8 @@ public class TestDefaultNHttpServerConne Assert.assertEquals(HttpVersion.HTTP_1_1, request.getRequestLine().getProtocolVersion()); Assert.assertEquals("POST", request.getRequestLine().getMethod()); Assert.assertEquals("/", request.getRequestLine().getUri()); - Assert.assertTrue(request instanceof HttpEntityEnclosingRequest); - final HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity(); + Assert.assertTrue(request instanceof HttpRequest); + final HttpEntity entity = ((HttpRequest) request).getEntity(); Assert.assertNotNull(entity); Assert.assertEquals(5, entity.getContentLength()); } @@ -535,8 +534,8 @@ public class TestDefaultNHttpServerConne Assert.assertEquals(HttpVersion.HTTP_1_1, request.getRequestLine().getProtocolVersion()); Assert.assertEquals("POST", request.getRequestLine().getMethod()); Assert.assertEquals("/", request.getRequestLine().getUri()); - Assert.assertTrue(request instanceof HttpEntityEnclosingRequest); - final HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity(); + Assert.assertTrue(request instanceof HttpRequest); + final HttpEntity entity = ((HttpRequest) request).getEntity(); Assert.assertNotNull(entity); Assert.assertEquals(100, entity.getContentLength()); @@ -584,7 +583,6 @@ public class TestDefaultNHttpServerConne Assert.assertEquals(HttpVersion.HTTP_1_1, request.getRequestLine().getProtocolVersion()); Assert.assertEquals("GET", request.getRequestLine().getMethod()); Assert.assertEquals("/", request.getRequestLine().getUri()); - Assert.assertFalse(request instanceof HttpEntityEnclosingRequest); } @Test Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/TestNHttpConnectionBase.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/TestNHttpConnectionBase.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/TestNHttpConnectionBase.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/TestNHttpConnectionBase.java Wed Nov 26 20:30:08 2014 @@ -31,17 +31,11 @@ import java.net.InetSocketAddress; import java.nio.channels.ByteChannel; import java.nio.channels.SelectionKey; +import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpHeaders; import org.apache.http.HttpVersion; -import org.apache.http.impl.entity.LaxContentLengthStrategy; -import org.apache.http.impl.entity.StrictContentLengthStrategy; -import org.apache.http.impl.nio.codecs.ChunkDecoder; -import org.apache.http.impl.nio.codecs.ChunkEncoder; -import org.apache.http.impl.nio.codecs.IdentityDecoder; -import org.apache.http.impl.nio.codecs.IdentityEncoder; -import org.apache.http.impl.nio.codecs.LengthDelimitedDecoder; -import org.apache.http.impl.nio.codecs.LengthDelimitedEncoder; +import org.apache.http.entity.ContentLengthStrategy; import org.apache.http.message.BasicHttpResponse; import org.apache.http.nio.NHttpConnection; import org.apache.http.nio.reactor.IOSession; @@ -66,10 +60,7 @@ public class TestNHttpConnectionBase { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - conn = new NHttpConnectionBase(session, 1024, 1024, HeapByteBufferAllocator.INSTANCE, - null, null, - LaxContentLengthStrategy.INSTANCE, - StrictContentLengthStrategy.INSTANCE); + conn = new NHttpConnectionBase(session, 1024, 1024, HeapByteBufferAllocator.INSTANCE, null, null); } @Test @@ -98,7 +89,7 @@ public class TestNHttpConnectionBase { Assert.assertEquals(new InetSocketAddress( InetAddress.getByAddress(new byte[] {127, 0, 0, 1}), 8888), conn.getLocalAddress()); Assert.assertEquals(new InetSocketAddress( - InetAddress.getByAddress(new byte[] {10, 0, 0, 2}), 80), conn.getRemoteAddress()); + InetAddress.getByAddress(new byte[]{10, 0, 0, 2}), 80), conn.getRemoteAddress()); } @Test @@ -200,82 +191,54 @@ public class TestNHttpConnectionBase { } @Test - public void testPrepareIdentityDecoder() throws Exception { + public void testCreateIdentityEntity() throws Exception { final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); - Mockito.when(session.channel()).thenReturn(channel); - - final HttpEntity entity = conn.prepareDecoder(response); + final HttpEntity entity = conn.createIncomingEntity(response, ContentLengthStrategy.IDENTITY); Assert.assertNotNull(entity); Assert.assertEquals(-1, entity.getContentLength()); Assert.assertFalse(entity.isChunked()); - Assert.assertTrue(conn.contentDecoder instanceof IdentityDecoder); + final Header h1 = entity.getContentType(); + Assert.assertNull(h1); + final Header h2 = entity.getContentEncoding(); + Assert.assertNull(h2); } @Test - public void testPrepareLengthDelimitedDecoder() throws Exception { + public void testCreateEntityWithContentLength() throws Exception { final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); response.addHeader(HttpHeaders.CONTENT_LENGTH, "10"); response.addHeader(HttpHeaders.CONTENT_TYPE, "stuff"); response.addHeader(HttpHeaders.CONTENT_ENCODING, "identity"); - Mockito.when(session.channel()).thenReturn(channel); - final HttpEntity entity = conn.prepareDecoder(response); + final HttpEntity entity = conn.createIncomingEntity(response, 10); Assert.assertNotNull(entity); Assert.assertEquals(10, entity.getContentLength()); Assert.assertFalse(entity.isChunked()); - Assert.assertNotNull(entity.getContentType()); - Assert.assertEquals("stuff", entity.getContentType().getValue()); - Assert.assertNotNull(entity.getContentEncoding()); - Assert.assertEquals("identity", entity.getContentEncoding().getValue()); - Assert.assertTrue(conn.contentDecoder instanceof LengthDelimitedDecoder); + final Header h1 = entity.getContentType(); + Assert.assertNotNull(h1); + Assert.assertEquals("stuff", h1.getValue()); + final Header h2 = entity.getContentEncoding(); + Assert.assertNotNull(h2); + Assert.assertEquals("identity", h2.getValue()); } @Test - public void testPrepareChunkDecoder() throws Exception { + public void testCreateEntityChunkCoded() throws Exception { final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); response.addHeader(HttpHeaders.TRANSFER_ENCODING, "chunked"); response.addHeader(HttpHeaders.CONTENT_TYPE, "stuff"); response.addHeader(HttpHeaders.CONTENT_ENCODING, "identity"); - Mockito.when(session.channel()).thenReturn(channel); - final HttpEntity entity = conn.prepareDecoder(response); + final HttpEntity entity = conn.createIncomingEntity(response, ContentLengthStrategy.CHUNKED); Assert.assertNotNull(entity); Assert.assertEquals(-1, entity.getContentLength()); Assert.assertTrue(entity.isChunked()); - Assert.assertNotNull(entity.getContentType()); - Assert.assertEquals("stuff", entity.getContentType().getValue()); - Assert.assertNotNull(entity.getContentEncoding()); - Assert.assertEquals("identity", entity.getContentEncoding().getValue()); - Assert.assertTrue(conn.contentDecoder instanceof ChunkDecoder); - } - - @Test - public void testPrepareIdentityEncoder() throws Exception { - final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); - Mockito.when(session.channel()).thenReturn(channel); - - conn.prepareEncoder(response); - Assert.assertTrue(conn.contentEncoder instanceof IdentityEncoder); - } - - @Test - public void testPrepareLengthDelimitedEncoder() throws Exception { - final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); - response.addHeader(HttpHeaders.CONTENT_LENGTH, "10"); - Mockito.when(session.channel()).thenReturn(channel); - - conn.prepareEncoder(response); - Assert.assertTrue(conn.contentEncoder instanceof LengthDelimitedEncoder); - } - - @Test - public void testPrepareChunkEncoder() throws Exception { - final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); - response.addHeader(HttpHeaders.TRANSFER_ENCODING, "chunked"); - Mockito.when(session.channel()).thenReturn(channel); - - conn.prepareEncoder(response); - Assert.assertTrue(conn.contentEncoder instanceof ChunkEncoder); + final Header h1 = entity.getContentType(); + Assert.assertNotNull(h1); + Assert.assertEquals("stuff", h1.getValue()); + final Header h2 = entity.getContentEncoding(); + Assert.assertNotNull(h2); + Assert.assertEquals("identity", h2.getValue()); } } Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/SimpleRequestHandler.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/SimpleRequestHandler.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/SimpleRequestHandler.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/SimpleRequestHandler.java Wed Nov 26 20:30:08 2014 @@ -30,11 +30,9 @@ package org.apache.http.nio.integration; import java.io.IOException; import org.apache.http.HttpEntity; -import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; import org.apache.http.entity.ContentType; import org.apache.http.nio.entity.NStringEntity; import org.apache.http.protocol.HttpContext; @@ -70,14 +68,9 @@ final class SimpleRequestHandler impleme response.addHeader("Pattern", pattern); final String content; - if (request instanceof HttpEntityEnclosingRequest) { - final HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity(); - if (entity != null) { - content = EntityUtils.toString(entity); - } else { - response.setStatusCode(HttpStatus.SC_BAD_REQUEST); - content = "Request entity not available"; - } + final HttpEntity incomingEntity = request.getEntity(); + if (incomingEntity != null) { + content = EntityUtils.toString(incomingEntity); } else { final StringBuilder buffer = new StringBuilder(); for (int i = 0; i < count; i++) { @@ -85,9 +78,9 @@ final class SimpleRequestHandler impleme } content = buffer.toString(); } - final NStringEntity entity = new NStringEntity(content, ContentType.DEFAULT_TEXT); - entity.setChunked(this.chunking); - response.setEntity(entity); + final NStringEntity outgoingEntity = new NStringEntity(content, ContentType.DEFAULT_TEXT); + outgoingEntity.setChunked(this.chunking); + response.setEntity(outgoingEntity); } } Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/TestHttpAsyncHandlers.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/TestHttpAsyncHandlers.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/TestHttpAsyncHandlers.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/TestHttpAsyncHandlers.java Wed Nov 26 20:30:08 2014 @@ -45,7 +45,6 @@ import org.apache.http.HttpStatus; import org.apache.http.HttpVersion; import org.apache.http.ProtocolVersion; import org.apache.http.entity.ContentType; -import org.apache.http.message.BasicHttpEntityEnclosingRequest; import org.apache.http.message.BasicHttpRequest; import org.apache.http.message.BasicHttpResponse; import org.apache.http.nio.entity.NStringEntity; @@ -214,7 +213,7 @@ public class TestHttpAsyncHandlers exten final Queue> queue = new ConcurrentLinkedQueue>(); for (int i = 0; i < 30; i++) { - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest( + final BasicHttpRequest request = new BasicHttpRequest( "POST", createRequestUri(pattern, count)); final NStringEntity entity = new NStringEntity(expectedPattern, ContentType.DEFAULT_TEXT); request.setEntity(entity); @@ -246,7 +245,7 @@ public class TestHttpAsyncHandlers exten final Queue> queue = new ConcurrentLinkedQueue>(); for (int i = 0; i < 30; i++) { - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest( + final BasicHttpRequest request = new BasicHttpRequest( "POST", createRequestUri(pattern, count)); final NStringEntity entity = new NStringEntity(expectedPattern, ContentType.DEFAULT_TEXT); entity.setChunked(true); @@ -279,7 +278,7 @@ public class TestHttpAsyncHandlers exten final Queue> queue = new ConcurrentLinkedQueue>(); for (int i = 0; i < 30; i++) { - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest( + final BasicHttpRequest request = new BasicHttpRequest( "POST", createRequestUri(pattern, count), HttpVersion.HTTP_1_0); final NStringEntity entity = new NStringEntity(expectedPattern, ContentType.DEFAULT_TEXT); request.setEntity(entity); @@ -309,7 +308,7 @@ public class TestHttpAsyncHandlers exten final Queue> queue = new ConcurrentLinkedQueue>(); for (int i = 0; i < 30; i++) { - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest( + final BasicHttpRequest request = new BasicHttpRequest( "POST", createRequestUri(pattern, count)); request.setEntity(null); final Future future = this.client.execute(target, request); @@ -343,7 +342,7 @@ public class TestHttpAsyncHandlers exten final String pattern = RndTestPatternGenerator.generateText(); final int count = RndTestPatternGenerator.generateCount(1000); - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest( + final BasicHttpRequest request = new BasicHttpRequest( "POST", createRequestUri(pattern, count)); request.setEntity(null); @@ -383,7 +382,7 @@ public class TestHttpAsyncHandlers exten final String pattern = RndTestPatternGenerator.generateText(); final int count = RndTestPatternGenerator.generateCount(1000); - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest( + final BasicHttpRequest request = new BasicHttpRequest( "POST", createRequestUri(pattern, count)); request.setEntity(null); @@ -410,7 +409,7 @@ public class TestHttpAsyncHandlers exten final Queue> queue = new ConcurrentLinkedQueue>(); for (int i = 0; i < 30; i++) { - final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest( + final BasicHttpRequest request = new BasicHttpRequest( "POST", createRequestUri(pattern, count)); final NStringEntity entity = new NStringEntity(expectedPattern, ContentType.DEFAULT_TEXT); request.setEntity(entity); @@ -458,13 +457,13 @@ public class TestHttpAsyncHandlers exten registry.register("*", new BasicAsyncRequestHandler(new SimpleRequestHandler())); final HttpHost target = start(registry, expectationVerifier); - final BasicHttpEntityEnclosingRequest request1 = new BasicHttpEntityEnclosingRequest( + final BasicHttpRequest request1 = new BasicHttpRequest( "POST", createRequestUri("AAAAA", 10)); request1.setEntity(new NStringEntity(createExpectedString("AAAAA", 10))); - final BasicHttpEntityEnclosingRequest request2 = new BasicHttpEntityEnclosingRequest( + final BasicHttpRequest request2 = new BasicHttpRequest( "POST", createRequestUri("AAAAA", 10)); request2.setEntity(new NStringEntity(createExpectedString("AAAAA", 10))); - final BasicHttpEntityEnclosingRequest request3 = new BasicHttpEntityEnclosingRequest( + final BasicHttpRequest request3 = new BasicHttpRequest( "POST", createRequestUri("BBBBB", 10)); request3.setEntity(new NStringEntity(createExpectedString("BBBBB", 10))); @@ -600,13 +599,13 @@ public class TestHttpAsyncHandlers exten registry.register("*", new BasicAsyncRequestHandler(new SimpleRequestHandler())); final HttpHost target = start(registry, expectationVerifier); - final BasicHttpEntityEnclosingRequest request1 = new BasicHttpEntityEnclosingRequest( + final BasicHttpRequest request1 = new BasicHttpRequest( "POST", createRequestUri("AAAAA", 10)); request1.setEntity(new NStringEntity(createExpectedString("AAAAA", 10))); - final BasicHttpEntityEnclosingRequest request2 = new BasicHttpEntityEnclosingRequest( + final BasicHttpRequest request2 = new BasicHttpRequest( "POST", createRequestUri("AAAAA", 10)); request2.setEntity(new NStringEntity(createExpectedString("AAAAA", 10))); - final BasicHttpEntityEnclosingRequest request3 = new BasicHttpEntityEnclosingRequest( + final BasicHttpRequest request3 = new BasicHttpRequest( "POST", createRequestUri("BBBBB", 10)); request3.setEntity(new NStringEntity(createExpectedString("BBBBB", 10))); Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/TestHttpAsyncHandlersPipelining.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/TestHttpAsyncHandlersPipelining.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/TestHttpAsyncHandlersPipelining.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/TestHttpAsyncHandlersPipelining.java Wed Nov 26 20:30:08 2014 @@ -36,7 +36,6 @@ import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Future; -import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpException; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; @@ -44,7 +43,6 @@ import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.HttpVersion; import org.apache.http.entity.ContentType; -import org.apache.http.message.BasicHttpEntityEnclosingRequest; import org.apache.http.message.BasicHttpRequest; import org.apache.http.message.BasicHttpResponse; import org.apache.http.nio.entity.NStringEntity; @@ -231,15 +229,15 @@ public class TestHttpAsyncHandlersPipeli final Queue>> queue = new ConcurrentLinkedQueue>>(); for (int i = 0; i < 10; i++) { final String requestUri = createRequestUri(pattern, count); - final HttpEntityEnclosingRequest request1 = new BasicHttpEntityEnclosingRequest("POST", requestUri); + final HttpRequest request1 = new BasicHttpRequest("POST", requestUri); final NStringEntity entity1 = new NStringEntity(expectedPattern, ContentType.DEFAULT_TEXT); entity1.setChunked(RndTestPatternGenerator.generateBoolean()); request1.setEntity(entity1); - final HttpEntityEnclosingRequest request2 = new BasicHttpEntityEnclosingRequest("POST", requestUri); + final HttpRequest request2 = new BasicHttpRequest("POST", requestUri); final NStringEntity entity2 = new NStringEntity(expectedPattern, ContentType.DEFAULT_TEXT); entity2.setChunked(RndTestPatternGenerator.generateBoolean()); request2.setEntity(entity2); - final HttpEntityEnclosingRequest request3 = new BasicHttpEntityEnclosingRequest("POST", requestUri); + final HttpRequest request3 = new BasicHttpRequest("POST", requestUri); final NStringEntity entity3 = new NStringEntity(expectedPattern, ContentType.DEFAULT_TEXT); entity3.setChunked(RndTestPatternGenerator.generateBoolean()); request3.setEntity(entity3); @@ -322,12 +320,12 @@ public class TestHttpAsyncHandlersPipeli final Queue>> queue = new ConcurrentLinkedQueue>>(); for (int i = 0; i < 1; i++) { final HttpRequest request1 = new BasicHttpRequest("GET", createRequestUri(pattern1, count)); - final HttpEntityEnclosingRequest request2 = new BasicHttpEntityEnclosingRequest("POST", + final HttpRequest request2 = new BasicHttpRequest("POST", createRequestUri(pattern2, count)); final NStringEntity entity2 = new NStringEntity(expectedPattern2, ContentType.DEFAULT_TEXT); entity2.setChunked(RndTestPatternGenerator.generateBoolean()); request2.setEntity(entity2); - final HttpEntityEnclosingRequest request3 = new BasicHttpEntityEnclosingRequest("POST", + final HttpRequest request3 = new BasicHttpRequest("POST", createRequestUri(pattern3, count)); final NStringEntity entity3 = new NStringEntity(expectedPattern3, ContentType.DEFAULT_TEXT); entity3.setChunked(RndTestPatternGenerator.generateBoolean()); Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/TestServerSidePipelining.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/TestServerSidePipelining.java?rev=1641930&r1=1641929&r2=1641930&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/TestServerSidePipelining.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/integration/TestServerSidePipelining.java Wed Nov 26 20:30:08 2014 @@ -38,7 +38,6 @@ import java.net.InetSocketAddress; import java.net.Socket; import org.apache.http.HttpEntity; -import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpException; import org.apache.http.HttpHeaders; import org.apache.http.HttpRequest; @@ -113,9 +112,9 @@ public class TestServerSidePipelining ex final HttpRequest request, final HttpResponse response, final HttpContext context) throws HttpException, IOException { + final HttpEntity requestEntity = request.getEntity(); final HttpEntity responseEntity; - if (request instanceof HttpEntityEnclosingRequest) { - final HttpEntity requestEntity = ((HttpEntityEnclosingRequest) request).getEntity(); + if (requestEntity != null) { final ContentType contentType = ContentType.getOrDefault(requestEntity); responseEntity = new NByteArrayEntity( EntityUtils.toByteArray(requestEntity), contentType);