title: Python httplib and POST
body: <p>I am currently working with a piece of code that has been written by somebody else. It uses <code>httplib</code> to make requests to server. It has all the data supplied in a correct format - for example message body, header values, etc.</p>
  
  <p>The problem is that each time it attempts to send a POST requests, the data is there - I can see it on the client side, however nothing arrives to the server. I've read through the library specification and the usage seems to be correct.</p>
  
  <p>The extracted library calls go as follows:</p>
  
  <pre><code>import httplib
  
  conn = httplib.HTTPConnection('monkeylabs.pl', 80)
  conn.connect()
  request = conn.putrequest('POST', '/api/snippet/')
  headers = {}
  headers['Content-Type'] = 'application/json'
  headers['User-Agent'] = 'Envjs/1.618 (SpyderMonkey; U; Linux x86_64 2.6.38-10-generic;  pl_PL.utf8; rv:2.7.1) Resig/20070309 PilotFish/1.3.pre03'
  headers['Accept'] = '*/*'
  for k in headers:
      conn.putheader(k, headers[k])
  conn.endheaders()
  
  conn.send('[{"id":"route"}]')
  
  resp = conn.getresponse()
  print resp.status
  print resp.reason
  print resp.read()
  
  conn.close()
  </code></pre>
  
  <p>Is this some known issue, or what? I'm using Python 2.7. Not sure how to check the version of httplib.</p>
  
  <p>Please don't suggest to exchange httplib for something else unless it's something really similar (httplib2 perhaps). As I said, the code isn't mine and it comes in much greater amounts than what I've just posted above. Refactoring it would cause a major problem. I'm interested in any reliable workarounds.</p>
  
  <p><strong>EDIT</strong></p>
  
  <p>The debug output:</p>
  
  <pre><code>send: 'POST /api/snippet/ HTTP/1.1\r\nHost: monkeylabs.pl\r\nAccept-Encoding: identity\r\nContent-Type: application/json\r\nAccept: */*\r\nUser-Agent: Envjs/1.618 (SpyderMonkey; U; Linux x86_64 2.6.38-10-generic; pl_PL.utf8; rv:2.7.1) Resig/20070309 PilotFish/1.3.pre03\r\n\r\n[{"id":"route"}]'
  reply: 'HTTP/1.0 201 CREATED\r\n'
  header: Date: Fri, 10 Jun 2011 23:54:00 GMT
  header: Server: WSGIServer/0.1 Python/2.7.1+
  header: Vary: Cookie
  header: Content-Type: application/json
  header: Content-Length: 0
  201
  CREATED
  </code></pre>
  
  <p>Note that the information after reply actually talks about the server reply, not the request itself, which in this case is empty. The primary cause is that the request body itself is empty which I can observe by getting a log:</p>
  
  <pre><code>[11/Jun/2011 01:54:00] "POST /api/snippet/ HTTP/1.1" 201 0
  </code></pre>
  
  <p>And those three lines:</p>
  
  <pre><code>``
  &lt;QueryDict: {}&gt;
  &lt;QueryDict: {}&gt;
  </code></pre>
  
  <p>out of:</p>
  
  <pre><code>print '`%s`' % request.raw_post_data
  print request.GET
  print request.POST
  </code></pre>
  
  <p>on the Django server. So it seems it attempts to send the body but doesn't send it in the end.</p>
  
  <p><strong>EDIT(2)</strong></p>
  
  <p>Ok, I took a dump and it indeed told me that in the message sent from the browser there is an additional parameter called 'Content-Length' which has been omitted in the regular usage of the library. Silly me.</p>