views:

49

answers:

2

I have a simple program that sends an HTTP POST.

It works only if the line httpost.addheader("Content-Length","18") is not present. Otherwise it fails. In the code, it's the line with "--->"
Commenting this line out makes the POST succeed.

Android does not send the POST if that line is in the code and returns with a Protocol Exception error. I used Wireshark to verify that nothing is sent.

Any ideas why setting the Content-Length generates an exception?

The code: HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://test.com/a_post.php");

try {
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    // DATA
    nameValuePairs.add(new BasicNameValuePair("mydata", "abcde"));
    nameValuePairs.add(new BasicNameValuePair("id","29"));

    StringEntity se = new UrlEncodedFormEntity(nameValuePairs);
    httppost.setEntity(se);

    int seLength = (int) se.getContentLength();
    String seLengthStr = Integer.toString(seLength);

    httppost.addHeader("Content-Type","application/x-www-form-urlencoded");
    ----> httppost.addHeader("Content-Length", "18");

    ResponseHandler<String> responseHandler = new BasicResponseHandler();
    String httpResponse=httpclient.execute(httppost, responseHandler);

    responseV.setText(responseV.getText()+ " " + httpResponse);
} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
+1  A: 

Are you sure the content-length is exactly 18? My guess is that the request is not done if the code realizes that the set content-length is incorrect, as sending a request with an invalid content-length will (at least should) cause an error on the server.

Most likely if you omit the content-length, it is automatically added when required.

TuomasR
Tori
Wireshark reports also the length as 18. Doing an httppost.getallheaders shows that there's 1 header when the content-length is not added and 2 headers when the content-length is added.
Tori
Yes, Apache HTTP Client adds the header for you, so there's no need to add it. Why it should otherwise cause a non-helpful exception though, I don't know.
Christopher
Thanks, I will try it without adding the header and make sure that the web service does not complain of a lack of content-length header.
Tori
A: 

There are a number of conditions where HTTP clients and servers must not send the Content-Length header. It is often not required, including if the other side of the connection is HTTP/1.1-aware. It may be best simply to leave that header out, and let your HTTP client/server library handle the logic of whether to add the header.

Justice
The web service I am accessing requires content-length, it wants the POST, CONTENT-TYPE, CONTENT-LENGTH and the SOAP packet. Then one has to rely on the Android HTTP implementation, to send the content-length. I will test this with the web service and report back.
Tori