You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2014/11/26 21:30:09 UTC

svn commit: r1641930 [2/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...

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncRequestConsumer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncRequestConsumer.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncRequestConsumer.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncRequestConsumer.java Wed Nov 26 20:30:08 2014
@@ -31,7 +31,7 @@ import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import org.apache.http.HttpEntityEnclosingRequest;
+import org.apache.http.HttpRequest;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.nio.ContentDecoder;
 import org.apache.http.nio.IOControl;
@@ -47,7 +47,7 @@ import org.mockito.MockitoAnnotations;
 public class TestBasicAsyncRequestConsumer {
 
     private BasicAsyncRequestConsumer consumer;
-    @Mock private HttpEntityEnclosingRequest request;
+    @Mock private HttpRequest request;
     @Mock private HttpContext context;
     @Mock private ContentDecoder decoder;
     @Mock private IOControl ioctrl;

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncRequestProducer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncRequestProducer.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncRequestProducer.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestBasicAsyncRequestProducer.java Wed Nov 26 20:30:08 2014
@@ -31,7 +31,6 @@ import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import org.apache.http.HttpEntityEnclosingRequest;
 import org.apache.http.HttpHost;
 import org.apache.http.HttpRequest;
 import org.apache.http.nio.ContentEncoder;
@@ -48,7 +47,7 @@ public class TestBasicAsyncRequestProduc
     private BasicAsyncRequestProducer producer;
     private HttpHost target;
     @Mock private HttpAsyncContentProducer contentProducer;
-    @Mock private HttpEntityEnclosingRequest request;
+    @Mock private HttpRequest request;
     @Mock private ContentEncoder encoder;
 
     @Before

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncRequestExecutor.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncRequestExecutor.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncRequestExecutor.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncRequestExecutor.java Wed Nov 26 20:30:08 2014
@@ -38,7 +38,6 @@ import org.apache.http.HttpRequest;
 import org.apache.http.HttpStatus;
 import org.apache.http.HttpVersion;
 import org.apache.http.entity.BasicHttpEntity;
-import org.apache.http.message.BasicHttpEntityEnclosingRequest;
 import org.apache.http.message.BasicHttpRequest;
 import org.apache.http.message.BasicHttpResponse;
 import org.apache.http.nio.ContentDecoder;
@@ -202,8 +201,10 @@ public class TestHttpAsyncRequestExecuto
         final State state = new HttpAsyncRequestExecutor.State();
         this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_EXCHANGE_STATE, state);
         this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER, this.exchangeHandler);
-        final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/");
-        request.setEntity(new NStringEntity("stuff"));
+        final BasicHttpRequest request = new BasicHttpRequest("POST", "/");
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         Mockito.when(this.exchangeHandler.generateRequest()).thenReturn(request);
 
         this.protocolHandler.requestReady(this.conn);
@@ -220,7 +221,10 @@ public class TestHttpAsyncRequestExecuto
         final State state = new HttpAsyncRequestExecutor.State();
         this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_EXCHANGE_STATE, state);
         this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER, this.exchangeHandler);
-        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);
         request.setHeader(HttpHeaders.EXPECT, HeaderElements.CONTINUE);
         Mockito.when(this.exchangeHandler.generateRequest()).thenReturn(request);
         Mockito.when(this.conn.getSocketTimeout()).thenReturn(1000);
@@ -300,8 +304,10 @@ public class TestHttpAsyncRequestExecuto
         final State state = new HttpAsyncRequestExecutor.State();
         state.setRequestState(MessageState.ACK_EXPECTED);
         state.setTimeout(1000);
-        final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/");
-        request.setEntity(new NStringEntity("stuff"));
+        final BasicHttpRequest request = new BasicHttpRequest("POST", "/");
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         state.setRequest(request);
         this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_EXCHANGE_STATE, state);
         this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER, this.exchangeHandler);
@@ -321,8 +327,10 @@ public class TestHttpAsyncRequestExecuto
     public void testResponseContinueOutOfSequence() throws Exception {
         final State state = new HttpAsyncRequestExecutor.State();
         state.setRequestState(MessageState.COMPLETED);
-        final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/");
-        request.setEntity(new NStringEntity("stuff"));
+        final BasicHttpRequest request = new BasicHttpRequest("POST", "/");
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         state.setRequest(request);
         this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_EXCHANGE_STATE, state);
         this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER, this.exchangeHandler);
@@ -341,8 +349,10 @@ public class TestHttpAsyncRequestExecuto
         final State state = new HttpAsyncRequestExecutor.State();
         state.setRequestState(MessageState.ACK_EXPECTED);
         state.setTimeout(1000);
-        final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/");
-        request.setEntity(new NStringEntity("stuff"));
+        final BasicHttpRequest request = new BasicHttpRequest("POST", "/");
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         state.setRequest(request);
         this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_EXCHANGE_STATE, state);
         this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER, this.exchangeHandler);
@@ -357,8 +367,10 @@ public class TestHttpAsyncRequestExecuto
         final State state = new HttpAsyncRequestExecutor.State();
         state.setRequestState(MessageState.ACK_EXPECTED);
         state.setTimeout(1000);
-        final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/");
-        request.setEntity(new NStringEntity("stuff"));
+        final BasicHttpRequest request = new BasicHttpRequest("POST", "/");
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         state.setRequest(request);
         this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_EXCHANGE_STATE, state);
         this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER, this.exchangeHandler);
@@ -379,8 +391,10 @@ public class TestHttpAsyncRequestExecuto
         final State state = new HttpAsyncRequestExecutor.State();
         state.setRequestState(MessageState.BODY_STREAM);
         state.setTimeout(1000);
-        final BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/");
-        request.setEntity(new NStringEntity("stuff"));
+        final BasicHttpRequest request = new BasicHttpRequest("POST", "/");
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         state.setRequest(request);
         this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_EXCHANGE_STATE, state);
         this.connContext.setAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER, this.exchangeHandler);

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncService.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncService.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncService.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncService.java Wed Nov 26 20:30:08 2014
@@ -33,7 +33,6 @@ import java.util.Queue;
 
 import org.apache.http.ConnectionReuseStrategy;
 import org.apache.http.HeaderElements;
-import org.apache.http.HttpEntityEnclosingRequest;
 import org.apache.http.HttpException;
 import org.apache.http.HttpHeaders;
 import org.apache.http.HttpRequest;
@@ -43,7 +42,6 @@ import org.apache.http.HttpStatus;
 import org.apache.http.HttpVersion;
 import org.apache.http.concurrent.Cancellable;
 import org.apache.http.impl.DefaultHttpResponseFactory;
-import org.apache.http.message.BasicHttpEntityEnclosingRequest;
 import org.apache.http.message.BasicHttpRequest;
 import org.apache.http.message.BasicHttpResponse;
 import org.apache.http.nio.ContentDecoder;
@@ -417,9 +415,10 @@ public class TestHttpAsyncService {
         final State state = new State();
         this.connContext.setAttribute(HttpAsyncService.HTTP_EXCHANGE_STATE, state);
 
-        final HttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST",
-                "/stuff", HttpVersion.HTTP_1_1);
-        request.setEntity(new NStringEntity("stuff"));
+        final HttpRequest request = new BasicHttpRequest("POST", "/stuff", HttpVersion.HTTP_1_1);
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         Mockito.when(this.conn.getHttpRequest()).thenReturn(request);
         Mockito.when(this.requestHandler.processRequest(
                 Mockito.eq(request), Mockito.any(HttpContext.class))).thenReturn(this.requestConsumer);
@@ -440,8 +439,10 @@ public class TestHttpAsyncService {
         final State state = new State();
         this.connContext.setAttribute(HttpAsyncService.HTTP_EXCHANGE_STATE, state);
 
-        final HttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/",
-                HttpVersion.HTTP_1_1);
+        final HttpRequest request = new BasicHttpRequest("POST", "/", HttpVersion.HTTP_1_1);
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         Mockito.when(this.conn.getHttpRequest()).thenReturn(request);
         Mockito.when(this.requestHandler.processRequest(
                 Mockito.eq(request), Mockito.any(HttpContext.class))).thenReturn(this.requestConsumer);
@@ -473,9 +474,11 @@ public class TestHttpAsyncService {
         final State state = new State();
         this.connContext.setAttribute(HttpAsyncService.HTTP_EXCHANGE_STATE, state);
 
-        final HttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/",
-                HttpVersion.HTTP_1_1);
+        final HttpRequest request = new BasicHttpRequest("POST", "/", HttpVersion.HTTP_1_1);
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
         request.setHeader(HttpHeaders.EXPECT, HeaderElements.CONTINUE);
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         Mockito.when(this.conn.getHttpRequest()).thenReturn(request);
         Mockito.when(this.requestHandler.processRequest(
                 Mockito.eq(request), Mockito.any(HttpContext.class))).thenReturn(this.requestConsumer);
@@ -521,9 +524,11 @@ public class TestHttpAsyncService {
         final State state = new State();
         this.connContext.setAttribute(HttpAsyncService.HTTP_EXCHANGE_STATE, state);
 
-        final HttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/",
-                HttpVersion.HTTP_1_1);
+        final HttpRequest request = new BasicHttpRequest("POST", "/", HttpVersion.HTTP_1_1);
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
         request.setHeader(HttpHeaders.EXPECT, HeaderElements.CONTINUE);
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         Mockito.when(this.conn.getHttpRequest()).thenReturn(request);
         Mockito.when(this.requestHandler.processRequest(
                 Mockito.eq(request), Mockito.any(HttpContext.class))).thenReturn(this.requestConsumer);
@@ -604,9 +609,11 @@ public class TestHttpAsyncService {
         state.setResponseState(MessageState.INIT);
         this.connContext.setAttribute(HttpAsyncService.HTTP_EXCHANGE_STATE, state);
 
-        final HttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/",
-                HttpVersion.HTTP_1_1);
+        final HttpRequest request = new BasicHttpRequest("POST", "/", HttpVersion.HTTP_1_1);
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
         request.setHeader(HttpHeaders.EXPECT, HeaderElements.CONTINUE);
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
 
         Mockito.when(this.conn.getHttpRequest()).thenReturn(request);
         Mockito.when(this.requestHandler.processRequest(
@@ -636,9 +643,11 @@ public class TestHttpAsyncService {
 
         this.connContext.setAttribute(HttpAsyncService.HTTP_EXCHANGE_STATE, state);
 
-        final HttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/",
-                HttpVersion.HTTP_1_1);
+        final HttpRequest request = new BasicHttpRequest("POST", "/", HttpVersion.HTTP_1_1);
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
         request.setHeader(HttpHeaders.EXPECT, HeaderElements.CONTINUE);
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
 
         Mockito.when(this.conn.getHttpRequest()).thenReturn(request);
         Mockito.when(this.requestHandler.processRequest(
@@ -663,9 +672,11 @@ public class TestHttpAsyncService {
         this.conn = Mockito.mock(NHttpServerConnection.class,
                 Mockito.withSettings().extraInterfaces(SessionBufferStatus.class));
 
-        final HttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/",
-                HttpVersion.HTTP_1_1);
+        final HttpRequest request = new BasicHttpRequest("POST", "/", HttpVersion.HTTP_1_1);
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
         request.setHeader(HttpHeaders.EXPECT, HeaderElements.CONTINUE);
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
 
         Mockito.when(this.conn.getContext()).thenReturn(this.connContext);
         Mockito.when(this.conn.getHttpRequest()).thenReturn(request);
@@ -718,8 +729,10 @@ public class TestHttpAsyncService {
     public void testRequestContent() throws Exception {
         final State state = new State();
         final HttpContext exchangeContext = new BasicHttpContext();
-        final HttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/",
-                HttpVersion.HTTP_1_1);
+        final HttpRequest request = new BasicHttpRequest("POST", "/", HttpVersion.HTTP_1_1);
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         state.setRequestState(MessageState.BODY_STREAM);
         final Incoming incoming = new Incoming(
                 request, this.requestHandler, this.requestConsumer, exchangeContext);
@@ -740,8 +753,10 @@ public class TestHttpAsyncService {
     public void testRequestContentCompleted() throws Exception {
         final State state = new State();
         final HttpContext exchangeContext = new BasicHttpContext();
-        final HttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/",
-                HttpVersion.HTTP_1_1);
+        final HttpRequest request = new BasicHttpRequest("POST", "/", HttpVersion.HTTP_1_1);
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         state.setRequestState(MessageState.BODY_STREAM);
         final Incoming incoming = new Incoming(
                 request, this.requestHandler, this.requestConsumer, exchangeContext);
@@ -773,8 +788,10 @@ public class TestHttpAsyncService {
     public void testRequestCompletedWithException() throws Exception {
         final State state = new State();
         final HttpContext exchangeContext = new BasicHttpContext();
-        final HttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/",
-                HttpVersion.HTTP_1_1);
+        final HttpRequest request = new BasicHttpRequest("POST", "/", HttpVersion.HTTP_1_1);
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         state.setRequestState(MessageState.BODY_STREAM);
         final Incoming incoming = new Incoming(
                 request, this.requestHandler, this.requestConsumer, exchangeContext);
@@ -997,8 +1014,10 @@ public class TestHttpAsyncService {
     public void testResponseContinue() throws Exception {
         final State state = new State();
         final HttpContext exchangeContext = new BasicHttpContext();
-        final HttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/",
-                HttpVersion.HTTP_1_1);
+        final HttpRequest request = new BasicHttpRequest("POST", "/", HttpVersion.HTTP_1_1);
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         final Incoming incoming = new Incoming(
                 request, this.requestHandler, this.requestConsumer, exchangeContext);
         state.setIncoming(incoming);
@@ -1033,8 +1052,10 @@ public class TestHttpAsyncService {
     public void testResponseFailedExpectation() throws Exception {
         final State state = new State();
         final HttpContext exchangeContext = new BasicHttpContext();
-        final HttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/",
-                HttpVersion.HTTP_1_1);
+        final HttpRequest request = new BasicHttpRequest("POST", "/", HttpVersion.HTTP_1_1);
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         final Incoming incoming = new Incoming(
                 request, this.requestHandler, this.requestConsumer, exchangeContext);
         state.setIncoming(incoming);
@@ -1141,8 +1162,10 @@ public class TestHttpAsyncService {
     public void testInvalidResponseStatus() throws Exception {
         final State state = new State();
         final HttpContext exchangeContext = new BasicHttpContext();
-        final HttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/",
-                HttpVersion.HTTP_1_1);
+        final HttpRequest request = new BasicHttpRequest("POST", "/", HttpVersion.HTTP_1_1);
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         final Incoming incoming = new Incoming(
                 request, this.requestHandler, this.requestConsumer, exchangeContext);
         state.setIncoming(incoming);
@@ -1164,8 +1187,10 @@ public class TestHttpAsyncService {
     public void testInvalidResponseStatusToExpection() throws Exception {
         final State state = new State();
         final HttpContext exchangeContext = new BasicHttpContext();
-        final HttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", "/",
-                HttpVersion.HTTP_1_1);
+        final HttpRequest request = new BasicHttpRequest("POST", "/", HttpVersion.HTTP_1_1);
+        request.setHeader(HttpHeaders.CONTENT_LENGTH, "5");
+        final NStringEntity entity = new NStringEntity("stuff");
+        request.setEntity(entity);
         final Incoming incoming = new Incoming(
                 request, this.requestHandler, this.requestConsumer, exchangeContext);
         state.setIncoming(incoming);

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/testserver/LoggingNHttpClientConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/testserver/LoggingNHttpClientConnection.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/testserver/LoggingNHttpClientConnection.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/testserver/LoggingNHttpClientConnection.java Wed Nov 26 20:30:08 2014
@@ -58,7 +58,7 @@ public class LoggingNHttpClientConnectio
         this.wirelog = LogFactory.getLog("org.apache.http.wire");
         this.id = "http-outgoing-" + COUNT.incrementAndGet();
         if (this.iolog.isDebugEnabled() || this.wirelog.isDebugEnabled()) {
-            this.session = new LoggingIOSession(session, this.id, this.iolog, this.wirelog);
+            bind(new LoggingIOSession(session, this.id, this.iolog, this.wirelog));
         }
     }
 

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/testserver/LoggingNHttpServerConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/testserver/LoggingNHttpServerConnection.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/testserver/LoggingNHttpServerConnection.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/testserver/LoggingNHttpServerConnection.java Wed Nov 26 20:30:08 2014
@@ -58,7 +58,7 @@ public class LoggingNHttpServerConnectio
         this.wirelog = LogFactory.getLog("org.apache.http.wire");
         this.id = "http-incoming-" + COUNT.incrementAndGet();
         if (this.iolog.isDebugEnabled() || this.wirelog.isDebugEnabled()) {
-            this.session = new LoggingIOSession(session, this.id, this.iolog, this.wirelog);
+            bind(new LoggingIOSession(session, this.id, this.iolog, this.wirelog));
         }
     }
 

Modified: httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/ElementalHttpPost.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/ElementalHttpPost.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/ElementalHttpPost.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/ElementalHttpPost.java Wed Nov 26 20:30:08 2014
@@ -34,6 +34,7 @@ import org.apache.http.ConnectionReuseSt
 import org.apache.http.Consts;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpHost;
+import org.apache.http.HttpRequest;
 import org.apache.http.HttpResponse;
 import org.apache.http.entity.ByteArrayEntity;
 import org.apache.http.entity.ContentType;
@@ -41,7 +42,7 @@ import org.apache.http.entity.InputStrea
 import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.DefaultBHttpClientConnection;
 import org.apache.http.impl.DefaultConnectionReuseStrategy;
-import org.apache.http.message.BasicHttpEntityEnclosingRequest;
+import org.apache.http.message.BasicHttpRequest;
 import org.apache.http.protocol.HttpCoreContext;
 import org.apache.http.protocol.HttpProcessor;
 import org.apache.http.protocol.HttpProcessorBuilder;
@@ -96,7 +97,7 @@ public class ElementalHttpPost {
                     Socket socket = new Socket(host.getHostName(), host.getPort());
                     conn.bind(socket);
                 }
-                BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST",
+                HttpRequest request = new BasicHttpRequest("POST",
                         "/servlets-examples/servlet/RequestInfoExample");
                 request.setEntity(requestBodies[i]);
                 System.out.println(">> Request URI: " + request.getRequestLine().getUri());

Modified: httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/HttpFileServer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/HttpFileServer.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/HttpFileServer.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/HttpFileServer.java Wed Nov 26 20:30:08 2014
@@ -42,7 +42,6 @@ import org.apache.http.ConnectionClosedE
 import org.apache.http.ExceptionLogger;
 import org.apache.http.HttpConnection;
 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;
@@ -151,30 +150,30 @@ public class HttpFileServer {
             }
             String target = request.getRequestLine().getUri();
 
-            if (request instanceof HttpEntityEnclosingRequest) {
-                HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity();
-                byte[] entityContent = EntityUtils.toByteArray(entity);
-                System.out.println("Incoming entity content (bytes): " + entityContent.length);
+            HttpEntity incomingEntity = request.getEntity();
+            if (incomingEntity != null) {
+                byte[] entityContent = EntityUtils.toByteArray(incomingEntity);
+                System.out.println("Incoming incomingEntity content (bytes): " + entityContent.length);
             }
 
             final File file = new File(this.docRoot, URLDecoder.decode(target, "UTF-8"));
             if (!file.exists()) {
 
                 response.setStatusCode(HttpStatus.SC_NOT_FOUND);
-                StringEntity entity = new StringEntity(
+                StringEntity outgoingEntity = new StringEntity(
                         "<html><body><h1>File" + file.getPath() +
                         " not found</h1></body></html>",
                         ContentType.create("text/html", "UTF-8"));
-                response.setEntity(entity);
+                response.setEntity(outgoingEntity);
                 System.out.println("File " + file.getPath() + " not found");
 
             } else if (!file.canRead() || file.isDirectory()) {
 
                 response.setStatusCode(HttpStatus.SC_FORBIDDEN);
-                StringEntity entity = new StringEntity(
+                StringEntity outgoingEntity = new StringEntity(
                         "<html><body><h1>Access denied</h1></body></html>",
                         ContentType.create("text/html", "UTF-8"));
-                response.setEntity(entity);
+                response.setEntity(outgoingEntity);
                 System.out.println("Cannot read file " + file.getPath());
 
             } else {

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpClientConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpClientConnection.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpClientConnection.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpClientConnection.java Wed Nov 26 20:30:08 2014
@@ -52,7 +52,7 @@ public interface HttpClientConnection ex
      * @throws HttpException in case of HTTP protocol violation
      * @throws IOException in case of an I/O error
      */
-    void sendRequestEntity(HttpEntityEnclosingRequest request)
+    void sendRequestEntity(HttpRequest request)
         throws HttpException, IOException;
 
     /**

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpEntity.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpEntity.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpEntity.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpEntity.java Wed Nov 26 20:30:08 2014
@@ -33,9 +33,6 @@ import java.io.OutputStream;
 
 /**
  * An entity that can be sent or received with an HTTP message.
- * Entities can be found in some
- * {@link HttpEntityEnclosingRequest requests} and in
- * {@link HttpResponse responses}, where they are optional.
  * <p>
  * There are three distinct types of entities in HttpCore,
  * depending on where their {@link #getContent content} originates:

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpMessage.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpMessage.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpMessage.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpMessage.java Wed Nov 26 20:30:08 2014
@@ -35,7 +35,7 @@ import java.util.Iterator;
  *
  * @since 4.0
  */
-public interface HttpMessage {
+public interface HttpMessage<T> {
 
     /**
      * Returns the protocol version this message is compatible with.
@@ -168,4 +168,25 @@ public interface HttpMessage {
      */
     Iterator<Header> headerIterator(String name);
 
+    /**
+     * Obtains the message entity, if available.
+     *
+     * @return  the message entity, or {@code null} if not available
+     *
+     * @since 5.0
+     */
+    T getEntity();
+
+    /**
+     * Sets an entity for this message.
+     * <p>
+     * Please note that if an entity has already been set it is responsibility of the caller
+     * to ensure release of the resources that may be associated with that entity.
+     *
+     * @param entity    the entity to set of this message, or {@code null} to unset
+     *
+     * @since 5.0
+     */
+    void setEntity(T entity);
+
 }

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpRequest.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpRequest.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpRequest.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpRequest.java Wed Nov 26 20:30:08 2014
@@ -34,7 +34,7 @@ package org.apache.http;
  *
  * @since 4.0
  */
-public interface HttpRequest extends HttpMessage {
+public interface HttpRequest extends HttpMessage<HttpEntity> {
 
     /**
      * Returns the request line of this request.

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpResponse.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpResponse.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpResponse.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpResponse.java Wed Nov 26 20:30:08 2014
@@ -35,7 +35,7 @@ import java.util.Locale;
  *
  * @since 4.0
  */
-public interface HttpResponse extends HttpMessage {
+public interface HttpResponse extends HttpMessage<HttpEntity> {
 
     /**
      * Obtains the status line of this response.
@@ -104,30 +104,6 @@ public interface HttpResponse extends Ht
         throws IllegalStateException;
 
     /**
-     * Obtains the message entity of this response, if any.
-     * The entity is provided by calling {@link #setEntity setEntity}.
-     *
-     * @return  the response entity, or
-     *          {@code null} if there is none
-     */
-    HttpEntity getEntity();
-
-    /**
-     * Associates a response entity with this response.
-     * <p>
-     * Please note that if an entity has already been set for this response and it depends on
-     * an input stream ({@link HttpEntity#isStreaming()} returns {@code true}),
-     * it must be fully consumed in order to ensure release of resources.
-     *
-     * @param entity    the entity to associate with this response, or
-     *                  {@code null} to unset
-     *
-     * @see HttpEntity#isStreaming()
-     * @see org.apache.http.util.EntityUtils#updateEntity(HttpResponse, HttpEntity)
-     */
-    void setEntity(HttpEntity entity);
-
-    /**
      * Obtains the locale of this response.
      * The locale is used to determine the reason phrase
      * for the {@link #setStatusCode status code}.

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpServerConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpServerConnection.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpServerConnection.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpServerConnection.java Wed Nov 26 20:30:08 2014
@@ -57,7 +57,7 @@ public interface HttpServerConnection ex
      * @throws HttpException in case of HTTP protocol violation
      * @throws IOException in case of an I/O error
      */
-    void receiveRequestEntity(HttpEntityEnclosingRequest request)
+    void receiveRequestEntity(HttpRequest request)
         throws HttpException, IOException;
 
     /**

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ContentLengthStrategy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ContentLengthStrategy.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ContentLengthStrategy.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ContentLengthStrategy.java Wed Nov 26 20:30:08 2014
@@ -38,17 +38,32 @@ import org.apache.http.HttpMessage;
  */
 public interface ContentLengthStrategy {
 
-    public static final int IDENTITY         = -1;
-    public static final int CHUNKED          = -2;
+    /**
+     * Identity transfer encoding. Message content is delineated
+     * by the end of connection.
+     */
+    public static final int IDENTITY = -1;
+
+    /**
+     * Message body chunk coded
+     */
+    public static final long CHUNKED = -2;
+
+    /**
+     * Message body not explicitly delineated. Legal for HTTP response messages
+     * and illegal for HTTP request messages.
+     */
+    public static final long UNDEFINED = -Long.MAX_VALUE;
 
     /**
      * Returns length of the given message in bytes. The returned value
      * must be a non-negative number, {@link #IDENTITY} if the end of the
-     * message will be delimited by the end of connection, or {@link #CHUNKED}
-     * if the message is chunk coded
+     * message is delineated by the end of connection, {@link #CHUNKED}
+     * if the message is chunk coded, or {@link #UNDEFINED} if the message
+     * is not explicitly delineated.
      *
      * @param message HTTP message
-     * @return content length, {@link #IDENTITY}, or {@link #CHUNKED}
+     * @return content length, {@link #UNDEFINED}, or {@link #CHUNKED}
      *
      * @throws HttpException in case of HTTP protocol violation
      */

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/BHttpConnectionBase.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/BHttpConnectionBase.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/BHttpConnectionBase.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/BHttpConnectionBase.java Wed Nov 26 20:30:08 2014
@@ -45,12 +45,9 @@ import org.apache.http.HttpEntity;
 import org.apache.http.HttpException;
 import org.apache.http.HttpHeaders;
 import org.apache.http.HttpMessage;
-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.entity.LaxContentLengthStrategy;
-import org.apache.http.impl.entity.StrictContentLengthStrategy;
 import org.apache.http.impl.io.ChunkedInputStream;
 import org.apache.http.impl.io.ChunkedOutputStream;
 import org.apache.http.impl.io.ContentLengthInputStream;
@@ -67,47 +64,20 @@ import org.apache.http.util.Args;
 import org.apache.http.util.Asserts;
 import org.apache.http.util.NetUtils;
 
-/**
- * This class serves as a base for all {@link org.apache.http.BHttpConnection} implementations
- * and provides functionality common to both client and server HTTP connections.
- *
- * @since 4.0
- */
-@NotThreadSafe
-public class BHttpConnectionBase implements BHttpConnection {
-
-    private final SessionInputBufferImpl inbuffer;
-    private final SessionOutputBufferImpl outbuffer;
-    private final MessageConstraints messageConstraints;
-    private final HttpConnectionMetricsImpl connMetrics;
-    private final ContentLengthStrategy incomingContentStrategy;
-    private final ContentLengthStrategy outgoingContentStrategy;
-    private final AtomicReference<Socket> socketHolder;
+class BHttpConnectionBase implements BHttpConnection {
 
-    /**
-     * Creates new instance of BHttpConnectionBase.
-     *
-     * @param buffersize buffer size. Must be a positive number.
-     * @param fragmentSizeHint fragment size hint.
-     * @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 messageConstraints 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.
-     */
-    protected BHttpConnectionBase(
+    final SessionInputBufferImpl inbuffer;
+    final SessionOutputBufferImpl outbuffer;
+    final MessageConstraints messageConstraints;
+    final HttpConnectionMetricsImpl connMetrics;
+    final AtomicReference<Socket> socketHolder;
+
+    BHttpConnectionBase(
             final int buffersize,
             final int fragmentSizeHint,
             final CharsetDecoder chardecoder,
             final CharsetEncoder charencoder,
-            final MessageConstraints messageConstraints,
-            final ContentLengthStrategy incomingContentStrategy,
-            final ContentLengthStrategy outgoingContentStrategy) {
+            final MessageConstraints messageConstraints) {
         super();
         Args.positive(buffersize, "Buffer size");
         final HttpTransportMetricsImpl inTransportMetrics = new HttpTransportMetricsImpl();
@@ -118,10 +88,6 @@ public class BHttpConnectionBase impleme
                 charencoder);
         this.messageConstraints = messageConstraints;
         this.connMetrics = new HttpConnectionMetricsImpl(inTransportMetrics, outTransportMetrics);
-        this.incomingContentStrategy = incomingContentStrategy != null ? incomingContentStrategy :
-            LaxContentLengthStrategy.INSTANCE;
-        this.outgoingContentStrategy = outgoingContentStrategy != null ? outgoingContentStrategy :
-            StrictContentLengthStrategy.INSTANCE;
         this.socketHolder = new AtomicReference<Socket>();
     }
 
@@ -161,76 +127,57 @@ public class BHttpConnectionBase impleme
         this.outbuffer.bind(null);
     }
 
-    protected SessionInputBuffer getSessionInputBuffer() {
-        return this.inbuffer;
-    }
-
-    protected SessionOutputBuffer getSessionOutputBuffer() {
-        return this.outbuffer;
-    }
-
-    protected void doFlush() throws IOException {
-        this.outbuffer.flush();
-    }
-
     @Override
     public boolean isOpen() {
         return this.socketHolder.get() != null;
     }
 
-    protected Socket getSocket() {
+    Socket getSocket() {
         return this.socketHolder.get();
     }
 
-    protected OutputStream createOutputStream(
+    protected OutputStream createContentOutputStream(
             final long len,
             final SessionOutputBuffer outbuffer) {
-        if (len == ContentLengthStrategy.CHUNKED) {
+        if (len >= 0) {
+            return new ContentLengthOutputStream(outbuffer, len);
+        } else if (len == ContentLengthStrategy.CHUNKED) {
             return new ChunkedOutputStream(2048, outbuffer);
-        } else if (len == ContentLengthStrategy.IDENTITY) {
-            return new IdentityOutputStream(outbuffer);
         } else {
-            return new ContentLengthOutputStream(outbuffer, len);
+            return new IdentityOutputStream(outbuffer);
         }
     }
 
-    protected OutputStream prepareOutput(final HttpMessage message) throws HttpException {
-        final long len = this.outgoingContentStrategy.determineLength(message);
-        return createOutputStream(len, this.outbuffer);
-    }
-
-    protected InputStream createInputStream(
+    protected InputStream createContentInputStream(
             final long len,
             final SessionInputBuffer inbuffer) {
-        if (len == ContentLengthStrategy.CHUNKED) {
-            return new ChunkedInputStream(inbuffer, this.messageConstraints);
-        } else if (len == ContentLengthStrategy.IDENTITY) {
-            return new IdentityInputStream(inbuffer);
-        } else if (len == 0L) {
+        if (len > 0) {
+            return new ContentLengthInputStream(inbuffer, len);
+        } else if (len == 0) {
             return EmptyInputStream.INSTANCE;
+        } else if (len == ContentLengthStrategy.CHUNKED) {
+            return new ChunkedInputStream(inbuffer, this.messageConstraints);
         } else {
-            return new ContentLengthInputStream(inbuffer, len);
+            return new IdentityInputStream(inbuffer);
         }
     }
 
-    protected HttpEntity prepareInput(final HttpMessage message) throws HttpException {
+    HttpEntity createIncomingEntity(
+            final HttpMessage message,
+            final SessionInputBuffer inbuffer,
+            final long len) throws HttpException {
         final BasicHttpEntity entity = new BasicHttpEntity();
-
-        final long len = this.incomingContentStrategy.determineLength(message);
-        final InputStream instream = createInputStream(len, this.inbuffer);
-        if (len == ContentLengthStrategy.CHUNKED) {
-            entity.setChunked(true);
-            entity.setContentLength(-1);
-            entity.setContent(instream);
-        } 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);
-            entity.setContent(instream);
         } else {
             entity.setChunked(false);
-            entity.setContentLength(len);
-            entity.setContent(instream);
+            entity.setContentLength(-1);
         }
+        entity.setContent(createContentInputStream(len, inbuffer));
 
         final Header contentTypeHeader = message.getFirstHeader(HttpHeaders.CONTENT_TYPE);
         if (contentTypeHeader != null) {
@@ -365,7 +312,7 @@ public class BHttpConnectionBase impleme
     @Override
     public void flush() throws IOException {
         ensureOpen();
-        doFlush();
+        this.outbuffer.flush();
     }
 
     protected void incrementRequestCount() {

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpClientConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpClientConnection.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpClientConnection.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpClientConnection.java Wed Nov 26 20:30:08 2014
@@ -35,14 +35,16 @@ import java.nio.charset.CharsetEncoder;
 
 import org.apache.http.HttpClientConnection;
 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.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.io.DefaultHttpRequestWriterFactory;
 import org.apache.http.impl.io.DefaultHttpResponseParserFactory;
 import org.apache.http.io.HttpMessageParser;
@@ -62,6 +64,8 @@ public class DefaultBHttpClientConnectio
 
     private final HttpMessageParser<HttpResponse> responseParser;
     private final HttpMessageWriter<HttpRequest> requestWriter;
+    private final ContentLengthStrategy incomingContentStrategy;
+    private final ContentLengthStrategy outgoingContentStrategy;
 
     /**
      * Creates new instance of DefaultBHttpClientConnection.
@@ -93,12 +97,15 @@ public class DefaultBHttpClientConnectio
             final ContentLengthStrategy outgoingContentStrategy,
             final HttpMessageWriterFactory<HttpRequest> requestWriterFactory,
             final HttpMessageParserFactory<HttpResponse> responseParserFactory) {
-        super(buffersize, fragmentSizeHint, chardecoder, charencoder,
-                constraints, incomingContentStrategy, outgoingContentStrategy);
+        super(buffersize, fragmentSizeHint, 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;
     }
 
     public DefaultBHttpClientConnection(
@@ -129,21 +136,24 @@ public class DefaultBHttpClientConnectio
             throws HttpException, IOException {
         Args.notNull(request, "HTTP request");
         ensureOpen();
-        this.requestWriter.write(request, getSessionOutputBuffer());
+        this.requestWriter.write(request, this.outbuffer);
         onRequestSubmitted(request);
         incrementRequestCount();
     }
 
     @Override
-    public void sendRequestEntity(final HttpEntityEnclosingRequest request)
-            throws HttpException, IOException {
+    public void sendRequestEntity(final HttpRequest request) throws HttpException, IOException {
         Args.notNull(request, "HTTP request");
         ensureOpen();
         final HttpEntity entity = request.getEntity();
         if (entity == null) {
             return;
         }
-        final OutputStream outstream = prepareOutput(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");
+        }
+        final OutputStream outstream = createContentOutputStream(len, this.outbuffer);
         entity.writeTo(outstream);
         outstream.close();
     }
@@ -151,7 +161,7 @@ public class DefaultBHttpClientConnectio
     @Override
     public HttpResponse receiveResponseHeader() throws HttpException, IOException {
         ensureOpen();
-        final HttpResponse response = this.responseParser.parse(getSessionInputBuffer());
+        final HttpResponse response = this.responseParser.parse(this.inbuffer);
         onResponseReceived(response);
         if (response.getStatusLine().getStatusCode() >= HttpStatus.SC_OK) {
             incrementResponseCount();
@@ -164,8 +174,11 @@ public class DefaultBHttpClientConnectio
             final HttpResponse response) throws HttpException, IOException {
         Args.notNull(response, "HTTP response");
         ensureOpen();
-        final HttpEntity entity = prepareInput(response);
-        response.setEntity(entity);
+        final long len = this.incomingContentStrategy.determineLength(response);
+        if (len == ContentLengthStrategy.UNDEFINED) {
+            return;
+        }
+        response.setEntity(createIncomingEntity(response, this.inbuffer, len));
     }
 
 }

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpServerConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpServerConnection.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpServerConnection.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpServerConnection.java Wed Nov 26 20:30:08 2014
@@ -34,15 +34,16 @@ 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.HttpServerConnection;
+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.io.DefaultHttpRequestParserFactory;
 import org.apache.http.impl.io.DefaultHttpResponseWriterFactory;
 import org.apache.http.io.HttpMessageParser;
@@ -60,6 +61,8 @@ import org.apache.http.util.Args;
 public class DefaultBHttpServerConnection extends BHttpConnectionBase
                                                    implements HttpServerConnection {
 
+    private final ContentLengthStrategy incomingContentStrategy;
+    private final ContentLengthStrategy outgoingContentStrategy;
     private final HttpMessageParser<HttpRequest> requestParser;
     private final HttpMessageWriter<HttpResponse> responseWriter;
 
@@ -75,7 +78,7 @@ public class DefaultBHttpServerConnectio
      * @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 org.apache.http.impl.entity.StrictContentLengthStrategy#INSTANCE} will be used.
      * @param requestParserFactory request parser factory. If {@code null}
@@ -93,13 +96,15 @@ public class DefaultBHttpServerConnectio
             final ContentLengthStrategy outgoingContentStrategy,
             final HttpMessageParserFactory<HttpRequest> requestParserFactory,
             final HttpMessageWriterFactory<HttpResponse> responseWriterFactory) {
-        super(buffersize, fragmentSizeHint, chardecoder, charencoder, constraints,
-                incomingContentStrategy != null ? incomingContentStrategy :
-                    DisallowIdentityContentLengthStrategy.INSTANCE, outgoingContentStrategy);
+        super(buffersize, fragmentSizeHint, 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;
     }
 
     public DefaultBHttpServerConnection(
@@ -129,18 +134,25 @@ public class DefaultBHttpServerConnectio
     public HttpRequest receiveRequestHeader()
             throws HttpException, IOException {
         ensureOpen();
-        final HttpRequest request = this.requestParser.parse(getSessionInputBuffer());
+        final HttpRequest request = this.requestParser.parse(this.inbuffer);
         onRequestReceived(request);
         incrementRequestCount();
         return request;
     }
 
     @Override
-    public void receiveRequestEntity(final HttpEntityEnclosingRequest request)
+    public void receiveRequestEntity(final HttpRequest request)
             throws HttpException, IOException {
         Args.notNull(request, "HTTP request");
         ensureOpen();
-        final HttpEntity entity = prepareInput(request);
+
+        final long len = this.incomingContentStrategy.determineLength(request);
+        if (len == ContentLengthStrategy.UNDEFINED) {
+            return;
+        } else if (len == ContentLengthStrategy.IDENTITY) {
+            throw new ProtocolException("Identity transfer encoding is not allowed for request messages");
+        }
+        final HttpEntity entity = createIncomingEntity(request, this.inbuffer, len);
         request.setEntity(entity);
     }
 
@@ -149,7 +161,7 @@ public class DefaultBHttpServerConnectio
             throws HttpException, IOException {
         Args.notNull(response, "HTTP response");
         ensureOpen();
-        this.responseWriter.write(response, getSessionOutputBuffer());
+        this.responseWriter.write(response, this.outbuffer);
         onResponseSubmitted(response);
         if (response.getStatusLine().getStatusCode() >= 200) {
             incrementResponseCount();
@@ -165,7 +177,8 @@ public class DefaultBHttpServerConnectio
         if (entity == null) {
             return;
         }
-        final OutputStream outstream = prepareOutput(response);
+        final long len = this.outgoingContentStrategy.determineLength(response);
+        final OutputStream outstream = createContentOutputStream(len, this.outbuffer);
         entity.writeTo(outstream);
         outstream.close();
     }

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultHttpRequestFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultHttpRequestFactory.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultHttpRequestFactory.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultHttpRequestFactory.java Wed Nov 26 20:30:08 2014
@@ -32,7 +32,6 @@ import org.apache.http.HttpRequestFactor
 import org.apache.http.MethodNotSupportedException;
 import org.apache.http.RequestLine;
 import org.apache.http.annotation.Immutable;
-import org.apache.http.message.BasicHttpEntityEnclosingRequest;
 import org.apache.http.message.BasicHttpRequest;
 import org.apache.http.util.Args;
 
@@ -46,24 +45,17 @@ public class DefaultHttpRequestFactory i
 
     public static final DefaultHttpRequestFactory INSTANCE = new DefaultHttpRequestFactory();
 
-    private static final String[] RFC2616_COMMON_METHODS = {
-        "GET"
+    private static final String[] SUPPORTED_METHODS = {
+            "GET",
+            "POST",
+            "PUT",
+            "HEAD",
+            "OPTIONS",
+            "DELETE",
+            "TRACE",
+            "CONNECT"
     };
 
-    private static final String[] RFC2616_ENTITY_ENC_METHODS = {
-        "POST",
-        "PUT"
-    };
-
-    private static final String[] RFC2616_SPECIAL_METHODS = {
-        "HEAD",
-        "OPTIONS",
-        "DELETE",
-        "TRACE",
-        "CONNECT"
-    };
-
-
     public DefaultHttpRequestFactory() {
         super();
     }
@@ -82,11 +74,7 @@ public class DefaultHttpRequestFactory i
             throws MethodNotSupportedException {
         Args.notNull(requestline, "Request line");
         final String method = requestline.getMethod();
-        if (isOneOf(RFC2616_COMMON_METHODS, method)) {
-            return new BasicHttpRequest(requestline);
-        } else if (isOneOf(RFC2616_ENTITY_ENC_METHODS, method)) {
-            return new BasicHttpEntityEnclosingRequest(requestline);
-        } else if (isOneOf(RFC2616_SPECIAL_METHODS, method)) {
+        if (isOneOf(SUPPORTED_METHODS, method)) {
             return new BasicHttpRequest(requestline);
         } else {
             throw new MethodNotSupportedException(method +  " method not supported");
@@ -96,11 +84,7 @@ public class DefaultHttpRequestFactory i
     @Override
     public HttpRequest newHttpRequest(final String method, final String uri)
             throws MethodNotSupportedException {
-        if (isOneOf(RFC2616_COMMON_METHODS, method)) {
-            return new BasicHttpRequest(method, uri);
-        } else if (isOneOf(RFC2616_ENTITY_ENC_METHODS, method)) {
-            return new BasicHttpEntityEnclosingRequest(method, uri);
-        } else if (isOneOf(RFC2616_SPECIAL_METHODS, method)) {
+        if (isOneOf(SUPPORTED_METHODS, method)) {
             return new BasicHttpRequest(method, uri);
         } else {
             throw new MethodNotSupportedException(method

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/entity/LaxContentLengthStrategy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/entity/LaxContentLengthStrategy.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/entity/LaxContentLengthStrategy.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/entity/LaxContentLengthStrategy.java Wed Nov 26 20:30:08 2014
@@ -28,12 +28,10 @@
 package org.apache.http.impl.entity;
 
 import org.apache.http.Header;
-import org.apache.http.HeaderElement;
 import org.apache.http.HeaderElements;
 import org.apache.http.HttpException;
 import org.apache.http.HttpHeaders;
 import org.apache.http.HttpMessage;
-import org.apache.http.ParseException;
 import org.apache.http.ProtocolException;
 import org.apache.http.annotation.Immutable;
 import org.apache.http.entity.ContentLengthStrategy;
@@ -44,7 +42,7 @@ import org.apache.http.util.Args;
  * unrecognized transfer encodings and malformed {@code Content-Length}
  * header values.
  * <p>
- * This class recognizes "chunked" and "identitiy" transfer-coding only.
+ * This class recognizes "chunked" transfer-coding only.
  *
  * @since 4.0
  */
@@ -53,27 +51,11 @@ public class LaxContentLengthStrategy im
 
     public static final LaxContentLengthStrategy INSTANCE = new LaxContentLengthStrategy();
 
-    private final int implicitLen;
-
-    /**
-     * Creates {@code LaxContentLengthStrategy} instance with the given length used per default
-     * when content length is not explicitly specified in the message.
-     *
-     * @param implicitLen implicit content length.
-     *
-     * @since 4.2
-     */
-    public LaxContentLengthStrategy(final int implicitLen) {
-        super();
-        this.implicitLen = implicitLen;
-    }
-
     /**
-     * Creates {@code LaxContentLengthStrategy} instance. {@link ContentLengthStrategy#IDENTITY}
+     * Creates {@code LaxContentLengthStrategy} instance. {@link ContentLengthStrategy#UNDEFINED}
      * is used per default when content length is not explicitly specified in the message.
      */
     public LaxContentLengthStrategy() {
-        this(IDENTITY);
     }
 
     @Override
@@ -81,27 +63,17 @@ public class LaxContentLengthStrategy im
         Args.notNull(message, "HTTP message");
 
         final Header transferEncodingHeader = message.getFirstHeader(HttpHeaders.TRANSFER_ENCODING);
-        // We use Transfer-Encoding if present and ignore Content-Length.
-        // RFC2616, 4.4 item number 3
+        // Although Transfer-Encoding is specified as a list, in practice
+        // it is either missing or has the single value "chunked". So we
+        // treat it as a single-valued header here.
         if (transferEncodingHeader != null) {
-            final HeaderElement[] encodings;
-            try {
-                encodings = transferEncodingHeader.getElements();
-            } catch (final ParseException px) {
-                throw new ProtocolException
-                    ("Invalid Transfer-Encoding header value: " +
-                     transferEncodingHeader, px);
-            }
-            // The chunked encoding must be the last one applied RFC2616, 14.41
-            final int len = encodings.length;
-            if (HeaderElements.IDENTITY_ENCODING.equalsIgnoreCase(
-                    transferEncodingHeader.getValue())) {
-                return IDENTITY;
-            } else if ((len > 0) && (HeaderElements.CHUNKED_ENCODING.equalsIgnoreCase
-                    (encodings[len - 1].getName()))) {
+            final String s = transferEncodingHeader.getValue();
+            if (HeaderElements.CHUNKED_ENCODING.equalsIgnoreCase(s)) {
                 return CHUNKED;
-            } else {
+            } else if (HeaderElements.IDENTITY_ENCODING.equalsIgnoreCase(s)) {
                 return IDENTITY;
+            } else {
+                throw new ProtocolException("Unsupported transfer encoding: " + s);
             }
         }
         if (message.containsHeader(HttpHeaders.CONTENT_LENGTH)) {
@@ -119,10 +91,10 @@ public class LaxContentLengthStrategy im
             if (contentlen >= 0) {
                 return contentlen;
             } else {
-                return IDENTITY;
+                throw new ProtocolException("Invalid content length");
             }
         }
-        return this.implicitLen;
+        return UNDEFINED;
     }
 
 }

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/entity/StrictContentLengthStrategy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/entity/StrictContentLengthStrategy.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/entity/StrictContentLengthStrategy.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/entity/StrictContentLengthStrategy.java Wed Nov 26 20:30:08 2014
@@ -32,7 +32,6 @@ import org.apache.http.HeaderElements;
 import org.apache.http.HttpException;
 import org.apache.http.HttpHeaders;
 import org.apache.http.HttpMessage;
-import org.apache.http.HttpVersion;
 import org.apache.http.ProtocolException;
 import org.apache.http.annotation.Immutable;
 import org.apache.http.entity.ContentLengthStrategy;
@@ -44,7 +43,7 @@ import org.apache.http.util.Args;
  * transfer encoding or a malformed {@code Content-Length} header
  * value.
  * <p>
- * This class recognizes "chunked" and "identitiy" transfer-coding only.
+ * This class recognizes "chunked" transfer-coding only.
  *
  * @since 4.0
  */
@@ -53,27 +52,11 @@ public class StrictContentLengthStrategy
 
     public static final StrictContentLengthStrategy INSTANCE = new StrictContentLengthStrategy();
 
-    private final int implicitLen;
-
-    /**
-     * Creates {@code StrictContentLengthStrategy} instance with the given length used per default
-     * when content length is not explicitly specified in the message.
-     *
-     * @param implicitLen implicit content length.
-     *
-     * @since 4.2
-     */
-    public StrictContentLengthStrategy(final int implicitLen) {
-        super();
-        this.implicitLen = implicitLen;
-    }
-
     /**
-     * Creates {@code StrictContentLengthStrategy} instance. {@link ContentLengthStrategy#IDENTITY}
+     * Creates {@code StrictContentLengthStrategy} instance. {@link ContentLengthStrategy#UNDEFINED}
      * is used per default when content length is not explicitly specified in the message.
      */
     public StrictContentLengthStrategy() {
-        this(IDENTITY);
     }
 
     @Override
@@ -86,17 +69,11 @@ public class StrictContentLengthStrategy
         if (transferEncodingHeader != null) {
             final String s = transferEncodingHeader.getValue();
             if (HeaderElements.CHUNKED_ENCODING.equalsIgnoreCase(s)) {
-                if (message.getProtocolVersion().lessEquals(HttpVersion.HTTP_1_0)) {
-                    throw new ProtocolException(
-                            "Chunked transfer encoding not allowed for " +
-                            message.getProtocolVersion());
-                }
                 return CHUNKED;
             } else if (HeaderElements.IDENTITY_ENCODING.equalsIgnoreCase(s)) {
                 return IDENTITY;
             } else {
-                throw new ProtocolException(
-                        "Unsupported transfer encoding: " + s);
+                throw new ProtocolException("Unsupported transfer encoding: " + s);
             }
         }
         final Header contentLengthHeader = message.getFirstHeader(HttpHeaders.CONTENT_LENGTH);
@@ -112,7 +89,7 @@ public class StrictContentLengthStrategy
                 throw new ProtocolException("Invalid content length: " + s);
             }
         }
-        return this.implicitLen;
+        return UNDEFINED;
     }
 
 }

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/AbstractHttpMessage.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/AbstractHttpMessage.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/AbstractHttpMessage.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/AbstractHttpMessage.java Wed Nov 26 20:30:08 2014
@@ -27,6 +27,7 @@
 
 package org.apache.http.message;
 
+import org.apache.http.HttpEntity;
 import org.apache.http.HttpMessage;
 import org.apache.http.annotation.NotThreadSafe;
 import org.apache.http.util.Args;
@@ -37,7 +38,9 @@ import org.apache.http.util.Args;
  * @since 4.0
  */
 @NotThreadSafe
-public abstract class AbstractHttpMessage extends HeaderGroup implements HttpMessage {
+public abstract class AbstractHttpMessage extends HeaderGroup implements HttpMessage<HttpEntity> {
+
+    private HttpEntity entity;
 
     @Override
     public void addHeader(final String name, final String value) {
@@ -51,4 +54,14 @@ public abstract class AbstractHttpMessag
         setHeader(new BasicHeader(name, value));
     }
 
+    @Override
+    public HttpEntity getEntity() {
+        return this.entity;
+    }
+
+    @Override
+    public void setEntity(final HttpEntity entity) {
+        this.entity = entity;
+    }
+
 }

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHttpResponse.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHttpResponse.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHttpResponse.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHttpResponse.java Wed Nov 26 20:30:08 2014
@@ -29,7 +29,6 @@ package org.apache.http.message;
 
 import java.util.Locale;
 
-import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpVersion;
 import org.apache.http.ProtocolVersion;
@@ -52,7 +51,6 @@ public class BasicHttpResponse extends A
     private ProtocolVersion     ver;
     private int                 code;
     private String              reasonPhrase;
-    private HttpEntity          entity;
     private final ReasonPhraseCatalog reasonCatalog;
     private Locale              locale;
 
@@ -138,12 +136,6 @@ public class BasicHttpResponse extends A
         return this.statusline;
     }
 
-    // non-javadoc, see interface HttpResponse
-    @Override
-    public HttpEntity getEntity() {
-        return this.entity;
-    }
-
     @Override
     public Locale getLocale() {
         return this.locale;
@@ -195,12 +187,6 @@ public class BasicHttpResponse extends A
         this.reasonPhrase = reason;
     }
 
-    // non-javadoc, see interface HttpResponse
-    @Override
-    public void setEntity(final HttpEntity entity) {
-        this.entity = entity;
-    }
-
     @Override
     public void setLocale(final Locale locale) {
         this.locale = Args.notNull(locale, "Locale");

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/HttpRequestExecutor.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/HttpRequestExecutor.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/HttpRequestExecutor.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/HttpRequestExecutor.java Wed Nov 26 20:30:08 2014
@@ -29,15 +29,15 @@ package org.apache.http.protocol;
 
 import java.io.IOException;
 
+import org.apache.http.Header;
 import org.apache.http.HttpClientConnection;
-import org.apache.http.HttpEntityEnclosingRequest;
+import org.apache.http.HttpEntity;
 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;
-import org.apache.http.HttpVersion;
 import org.apache.http.ProtocolException;
-import org.apache.http.ProtocolVersion;
 import org.apache.http.annotation.Immutable;
 import org.apache.http.util.Args;
 
@@ -202,15 +202,15 @@ public class HttpRequestExecutor {
         context.setAttribute(HttpCoreContext.HTTP_REQ_SENT, Boolean.FALSE);
 
         conn.sendRequestHeader(request);
-        if (request instanceof HttpEntityEnclosingRequest) {
+        final HttpEntity entity = request.getEntity();
+        if (entity != null) {
             // Check for expect-continue handshake. We have to flush the
             // headers and wait for an 100-continue response to handle it.
             // If we get a different response, we must not send the entity.
             boolean sendentity = true;
-            final ProtocolVersion ver =
-                request.getRequestLine().getProtocolVersion();
-            if (((HttpEntityEnclosingRequest) request).expectContinue() &&
-                !ver.lessEquals(HttpVersion.HTTP_1_0)) {
+            final Header expect = request.getFirstHeader(HttpHeaders.EXPECT);
+            final boolean expectContinue = expect != null && "100-continue".equalsIgnoreCase(expect.getValue());
+            if (expectContinue) {
 
                 conn.flush();
                 // As suggested by RFC 2616 section 8.2.3, we don't wait for a
@@ -234,7 +234,7 @@ public class HttpRequestExecutor {
                 }
             }
             if (sendentity) {
-                conn.sendRequestEntity((HttpEntityEnclosingRequest) request);
+                conn.sendRequestEntity(request);
             }
         }
         conn.flush();

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/HttpService.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/HttpService.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/HttpService.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/HttpService.java Wed Nov 26 20:30:08 2014
@@ -30,9 +30,10 @@ package org.apache.http.protocol;
 import java.io.IOException;
 
 import org.apache.http.ConnectionReuseStrategy;
+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;
@@ -161,31 +162,30 @@ public class HttpService {
         try {
 
             final HttpRequest request = conn.receiveRequestHeader();
-            if (request instanceof HttpEntityEnclosingRequest) {
-
-                if (((HttpEntityEnclosingRequest) request).expectContinue()) {
-                    response = this.responseFactory.newHttpResponse(HttpVersion.HTTP_1_1,
-                            HttpStatus.SC_CONTINUE, context);
-                    if (this.expectationVerifier != null) {
-                        try {
-                            this.expectationVerifier.verify(request, response, context);
-                        } catch (final HttpException ex) {
-                            response = this.responseFactory.newHttpResponse(HttpVersion.HTTP_1_0,
-                                    HttpStatus.SC_INTERNAL_SERVER_ERROR, context);
-                            handleException(ex, response);
-                        }
-                    }
-                    if (response.getStatusLine().getStatusCode() < 200) {
-                        // Send 1xx response indicating the server expections
-                        // have been met
-                        conn.sendResponseHeader(response);
-                        conn.flush();
-                        response = null;
-                        conn.receiveRequestEntity((HttpEntityEnclosingRequest) request);
+            final Header expect = request.getFirstHeader(HttpHeaders.EXPECT);
+            final boolean expectContinue = expect != null && "100-continue".equalsIgnoreCase(expect.getValue());
+            if (expectContinue) {
+                response = this.responseFactory.newHttpResponse(HttpVersion.HTTP_1_1,
+                        HttpStatus.SC_CONTINUE, context);
+                if (this.expectationVerifier != null) {
+                    try {
+                        this.expectationVerifier.verify(request, response, context);
+                    } catch (final HttpException ex) {
+                        response = this.responseFactory.newHttpResponse(HttpVersion.HTTP_1_0,
+                                HttpStatus.SC_INTERNAL_SERVER_ERROR, context);
+                        handleException(ex, response);
                     }
-                } else {
-                    conn.receiveRequestEntity((HttpEntityEnclosingRequest) request);
                 }
+                if (response.getStatusLine().getStatusCode() < 200) {
+                    // Send 1xx response indicating the server expections
+                    // have been met
+                    conn.sendResponseHeader(response);
+                    conn.flush();
+                    response = null;
+                    conn.receiveRequestEntity(request);
+                }
+            } else {
+                conn.receiveRequestEntity(request);
             }
 
             context.setAttribute(HttpCoreContext.HTTP_REQUEST, request);
@@ -198,10 +198,8 @@ public class HttpService {
             }
 
             // Make sure the request content is fully consumed
-            if (request instanceof HttpEntityEnclosingRequest) {
-                final HttpEntity entity = ((HttpEntityEnclosingRequest)request).getEntity();
-                EntityUtils.consume(entity);
-            }
+            final HttpEntity entity = request.getEntity();
+            EntityUtils.consume(entity);
 
         } catch (final HttpException ex) {
             response = this.responseFactory.newHttpResponse

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/RequestContent.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/RequestContent.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/RequestContent.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/RequestContent.java Wed Nov 26 20:30:08 2014
@@ -31,7 +31,6 @@ import java.io.IOException;
 
 import org.apache.http.HeaderElements;
 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;
@@ -86,24 +85,20 @@ public class RequestContent implements H
     public void process(final HttpRequest request, final HttpContext context)
             throws HttpException, IOException {
         Args.notNull(request, "HTTP request");
-        if (request instanceof HttpEntityEnclosingRequest) {
-            if (this.overwrite) {
-                request.removeHeaders(HttpHeaders.TRANSFER_ENCODING);
-                request.removeHeaders(HttpHeaders.CONTENT_LENGTH);
-            } else {
-                if (request.containsHeader(HttpHeaders.TRANSFER_ENCODING)) {
-                    throw new ProtocolException("Transfer-encoding header already present");
-                }
-                if (request.containsHeader(HttpHeaders.CONTENT_LENGTH)) {
-                    throw new ProtocolException("Content-Length header already present");
-                }
+        if (this.overwrite) {
+            request.removeHeaders(HttpHeaders.TRANSFER_ENCODING);
+            request.removeHeaders(HttpHeaders.CONTENT_LENGTH);
+        } else {
+            if (request.containsHeader(HttpHeaders.TRANSFER_ENCODING)) {
+                throw new ProtocolException("Transfer-encoding header already present");
             }
-            final ProtocolVersion ver = request.getRequestLine().getProtocolVersion();
-            final HttpEntity entity = ((HttpEntityEnclosingRequest)request).getEntity();
-            if (entity == null) {
-                request.addHeader(HttpHeaders.CONTENT_LENGTH, "0");
-                return;
+            if (request.containsHeader(HttpHeaders.CONTENT_LENGTH)) {
+                throw new ProtocolException("Content-Length header already present");
             }
+        }
+        final HttpEntity entity = request.getEntity();
+        if (entity != null) {
+            final ProtocolVersion ver = request.getRequestLine().getProtocolVersion();
             // Must specify a transfer encoding or a content length
             if (entity.isChunked() || entity.getContentLength() < 0) {
                 if (ver.lessEquals(HttpVersion.HTTP_1_0)) {

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/RequestDate.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/RequestDate.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/RequestDate.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/RequestDate.java Wed Nov 26 20:30:08 2014
@@ -29,7 +29,7 @@ package org.apache.http.protocol;
 
 import java.io.IOException;
 
-import org.apache.http.HttpEntityEnclosingRequest;
+import org.apache.http.HttpEntity;
 import org.apache.http.HttpException;
 import org.apache.http.HttpHeaders;
 import org.apache.http.HttpRequest;
@@ -57,8 +57,8 @@ public class RequestDate implements Http
     public void process(final HttpRequest request, final HttpContext context)
             throws HttpException, IOException {
         Args.notNull(request, "HTTP request");
-        if ((request instanceof HttpEntityEnclosingRequest) &&
-            !request.containsHeader(HttpHeaders.DATE)) {
+        final HttpEntity entity = request.getEntity();
+        if (entity != null && !request.containsHeader(HttpHeaders.DATE)) {
             final String httpdate = DATE_GENERATOR.getCurrentDate();
             request.setHeader(HttpHeaders.DATE, httpdate);
         }

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/RequestExpectContinue.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/RequestExpectContinue.java?rev=1641930&r1=1641929&r2=1641930&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/RequestExpectContinue.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/RequestExpectContinue.java Wed Nov 26 20:30:08 2014
@@ -31,7 +31,6 @@ import java.io.IOException;
 
 import org.apache.http.HeaderElements;
 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;
@@ -61,12 +60,11 @@ public class RequestExpectContinue imple
         Args.notNull(request, "HTTP request");
 
         if (!request.containsHeader(HttpHeaders.EXPECT)) {
-            if (request instanceof HttpEntityEnclosingRequest) {
+            final HttpEntity entity = request.getEntity();
+            if (entity != null) {
                 final ProtocolVersion ver = request.getRequestLine().getProtocolVersion();
-                final HttpEntity entity = ((HttpEntityEnclosingRequest)request).getEntity();
                 // Do not send the expect header if request body is known to be empty
-                if (entity != null
-                        && entity.getContentLength() != 0 && !ver.lessEquals(HttpVersion.HTTP_1_0)) {
+                if (entity.getContentLength() != 0 && !ver.lessEquals(HttpVersion.HTTP_1_0)) {
                     request.addHeader(HttpHeaders.EXPECT, HeaderElements.CONTINUE);
                 }
             }