Index: java/org/apache/commons/httpclient/HttpMethodBase.java =================================================================== RCS file: /home/cvspublic/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java,v retrieving revision 1.145 diff -u -r1.145 HttpMethodBase.java --- java/org/apache/commons/httpclient/HttpMethodBase.java 8 May 2003 17:33:51 -0000 1.145 +++ java/org/apache/commons/httpclient/HttpMethodBase.java 9 May 2003 08:04:55 -0000 @@ -1,5 +1,5 @@ /* - * $Header: /home/cvspublic/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java,v 1.145 2003/05/08 17:33:51 olegk Exp $ + * $Header: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java,v 1.145 2003/05/08 17:33:51 olegk Exp $ * $Revision: 1.145 $ * $Date: 2003/05/08 17:33:51 $ * @@ -1383,9 +1383,10 @@ } /** - * Adds a Content-Length or Transfer-Encoding: Chunked - * request header, as long as no Content-Length request header - * already exists. + * Adds Content-Length request header. This method should be + * overridden by entity enclosing HTTP methods, if they want to implement + * an alternative content encoding scheme, for instance + * Transfer-Encoding: chunked. * * @param state current state of http requests * @param conn the connection to use for I/O @@ -1400,13 +1401,10 @@ LOG.trace("enter HttpMethodBase.addContentLengthRequestHeader(" + "HttpState, HttpConnection)"); - // add content length or chunking - int len = getRequestContentLength(); - if (getRequestHeader("content-length") == null) { - if (0 < len) { - setRequestHeader("Content-Length", String.valueOf(len)); - } else if (http11 && (len < 0)) { - setRequestHeader("Transfer-Encoding", "chunked"); + if (getRequestHeader("Content-Length") == null) { + int len = getRequestContentLength(); + if (len >= 0) { + addRequestHeader("Content-Length", String.valueOf(len)); } } } Index: java/org/apache/commons/httpclient/methods/EntityEnclosingMethod.java =================================================================== RCS file: /home/cvspublic/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/methods/EntityEnclosingMethod.java,v retrieving revision 1.16 diff -u -r1.16 EntityEnclosingMethod.java --- java/org/apache/commons/httpclient/methods/EntityEnclosingMethod.java 19 Apr 2003 22:29:32 -0000 1.16 +++ java/org/apache/commons/httpclient/methods/EntityEnclosingMethod.java 9 May 2003 08:05:00 -0000 @@ -305,6 +305,9 @@ protected int getRequestContentLength() { LOG.trace("enter EntityEnclosingMethod.getRequestContentLength()"); + if (!hasRequestContent()) { + return 0; + } if (this.requestContentLength != CONTENT_LENGTH_AUTO) { return this.requestContentLength; } @@ -312,6 +315,35 @@ this.contentCache = generateRequestBody(); } return (this.contentCache == null) ? 0 : this.contentCache.length; + } + + /** + * Adds a Content-Length or Transfer-Encoding: Chunked + * request header, as long as no Content-Length request header + * already exists. + * + * @param state current state of http requests + * @param conn the connection to use for I/O + * + * @throws IOException when errors occur reading or writing to/from the + * connection + * @throws HttpException when a recoverable error occurs + */ + protected void addContentLengthRequestHeader(HttpState state, + HttpConnection conn) + throws IOException, HttpException { + LOG.trace("enter HttpMethodBase.addContentLengthRequestHeader(" + + "HttpState, HttpConnection)"); + + if ((getRequestHeader("content-length") == null) && + (getRequestHeader("Transfer-Encoding") == null)) { + int len = getRequestContentLength(); + if (len >= 0) { + addRequestHeader("Content-Length", String.valueOf(len)); + } else if ((len == CONTENT_LENGTH_CHUNKED) && (isHttp11())) { + addRequestHeader("Transfer-Encoding", "chunked"); + } + } } /** Index: java/org/apache/commons/httpclient/methods/MultipartPostMethod.java =================================================================== RCS file: /home/cvspublic/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/methods/MultipartPostMethod.java,v retrieving revision 1.17 diff -u -r1.17 MultipartPostMethod.java --- java/org/apache/commons/httpclient/methods/MultipartPostMethod.java 7 Apr 2003 19:23:36 -0000 1.17 +++ java/org/apache/commons/httpclient/methods/MultipartPostMethod.java 9 May 2003 08:05:02 -0000 @@ -287,7 +287,6 @@ } } - /** * Clear my request body. */ Index: test/org/apache/commons/httpclient/TestWebappMethods.java =================================================================== RCS file: /home/cvspublic/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestWebappMethods.java,v retrieving revision 1.14 diff -u -r1.14 TestWebappMethods.java --- test/org/apache/commons/httpclient/TestWebappMethods.java 5 Mar 2003 04:02:57 -0000 1.14 +++ test/org/apache/commons/httpclient/TestWebappMethods.java 9 May 2003 08:05:06 -0000 @@ -63,6 +63,8 @@ package org.apache.commons.httpclient; import java.io.ByteArrayInputStream; +import java.io.InputStream; + import junit.framework.*; import org.apache.commons.httpclient.methods.*; @@ -422,4 +424,89 @@ assertEquals(200,method.getStatusLine().getStatusCode()); response = method.getResponseBodyAsString(); } + + public void testEmptyPostMethod() throws Exception { + HttpClient client = createHttpClient(); + PostMethod method = new PostMethod("/" + getWebappContext() + "/body"); + + method.setRequestHeader("Content-Type", "text/plain"); + client.executeMethod(method); + assertEquals(200,method.getStatusLine().getStatusCode()); + String response = method.getResponseBodyAsString(); + assertTrue(response.indexOf("No body submitted") >= 0); + + method.recycle(); + + method.setPath("/" + getWebappContext() + "/body"); + method.setRequestHeader("Content-Type", "text/plain"); + method.setRequestBody((String)null); + client.executeMethod(method); + assertEquals(200,method.getStatusLine().getStatusCode()); + response = method.getResponseBodyAsString(); + assertTrue(response.indexOf("No body submitted") >= 0); + + method.recycle(); + + method.setPath("/" + getWebappContext() + "/body"); + method.setRequestHeader("Content-Type", "text/plain"); + method.setRequestBody((InputStream)null); + client.executeMethod(method); + assertEquals(200,method.getStatusLine().getStatusCode()); + response = method.getResponseBodyAsString(); + assertTrue(response.indexOf("No body submitted") >= 0); + + method.recycle(); + + method.setPath("/" + getWebappContext() + "/body"); + method.setRequestHeader("Content-Type", "text/plain"); + method.setRequestBody(""); + client.executeMethod(method); + assertEquals(200,method.getStatusLine().getStatusCode()); + response = method.getResponseBodyAsString(); + assertTrue(response.indexOf("No body submitted") >= 0); + + method.recycle(); + + method.setPath("/" + getWebappContext() + "/body"); + method.setRequestHeader("Content-Type", "text/plain"); + method.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED); + client.executeMethod(method); + assertEquals(200,method.getStatusLine().getStatusCode()); + response = method.getResponseBodyAsString(); + assertTrue(response.indexOf("No body submitted") >= 0); + + method.recycle(); + + method.setPath("/" + getWebappContext() + "/body"); + method.setRequestHeader("Content-Type", "text/plain"); + method.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED); + method.setRequestBody((String)null); + client.executeMethod(method); + assertEquals(200,method.getStatusLine().getStatusCode()); + response = method.getResponseBodyAsString(); + assertTrue(response.indexOf("No body submitted") >= 0); + + method.recycle(); + + method.setPath("/" + getWebappContext() + "/body"); + method.setRequestHeader("Content-Type", "text/plain"); + method.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED); + method.setRequestBody((InputStream)null); + client.executeMethod(method); + assertEquals(200,method.getStatusLine().getStatusCode()); + response = method.getResponseBodyAsString(); + assertTrue(response.indexOf("No body submitted") >= 0); + + method.recycle(); + + method.setPath("/" + getWebappContext() + "/body"); + method.setRequestHeader("Content-Type", "text/plain"); + method.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED); + method.setRequestBody(""); + client.executeMethod(method); + assertEquals(200,method.getStatusLine().getStatusCode()); + response = method.getResponseBodyAsString(); + + } + }