2

Problem

When I switched Macbooks, all of the sudden I am getting an HTTP 411: Length Required (I wasn't getting this using a different Mac) trying to use a POST request with httplib. I cannot seem to find a work around for this.

Code Portion 1: from a supporting class; retrieves data and other things,

class Data(object):
    def __init__(self, value):
        self.company_id = None
        self.host = settings.CONSUMER_URL
        self.body = None
        self.headers = {"clienttype": "Cloud-web", "Content-Type": "application/json", "ErrorLogging": value}

    def login(self):
        '''Login and store auth token'''
        path = "/Security/Login"
        body = self.get_login_info()
        status_code, resp = self.submit_request("POST", path, json.dumps(body))
        self.info = json.loads(resp)
        company_id = self.get_company_id(self.info)
        self.set_token(self.info["token"])
        return company_id

    def submit_request(self, method, path, body=None, header=None):
        '''Submit requests for API tests'''
        conn = httplib.HTTPSConnection(self.host)
        conn.set_debuglevel(1)
        conn.request(method, path, body, self.headers)
        resp = conn.getresponse()
        return resp.status, resp.read()

Code Portion 2: my unittests,

# logging in
cls.api = data.Data(False) # initializing the data class from Code Portion 1
cls.company_id = cls.api.login()

...

    # POST Client/Register
    def test_client_null_body(self):
        '''Null body object - 501'''
        status, resp = self.api.submit_request('POST', '/Client/register')
        if status != 500:
        log.log_warning('POST /Client/register: %s, %s' % (str(status), str(resp)))
        self.assertEqual(status, 500)

Code Portion 3: example of the data I send from a settings file,

API_ACCOUNT = {
    "userName": "account@account.com",
    "password": "password",
    "companyId": 107
}

From Logging

WARNING:root: POST /Client/register: 411, <!DOCTYPE HTML PUBLIC "-//W3C//DTD 

HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Length Required</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Length Required</h2>
<hr><p>HTTP Error 411. The request must be chunked or have a content length.</p>
</BODY></HTML>

Additional Info: I was using a 2008 Macbook Pro without issue. Switched to a 2013 Macbook Pro and this keeps occurring.

I took a look at this post: Python httplib and POST and it seems that at the time httplib did not automatically generate the content length.

Now https://docs.python.org/2/library/httplib.html:

If one is not provided in headers, a Content-Length header is added automatically for all methods if the length of the body can be determined, either from the length of the str representation, or from the reported size of the file on disk.

when using conn.set_debuglevel(1) we see that httplib is sending a header

reply: 'HTTP/1.1 411 Length Required\r\n'
header: Content-Type: text/html; charset=us-ascii
header: Server: Microsoft-HTTPAPI/2.0
header: Date: Thu, 26 May 2016 17:08:46 GMT
header: Connection: close
header: Content-Length: 344

Edit

Unittest Failure:

======================================================================
FAIL: test_client_null_body (__main__.NegApi)
Null body object - 501
----------------------------------------------------------------------
Traceback (most recent call last):
  File "API_neg.py", line 52, in test_client_null_body
    self.assertEqual(status, 500)
AssertionError: 411 != 500

.send: 'POST /Client/register HTTP/1.1\r\nHost: my.host\r\nAccept-Encoding: identity\r\nAuthorizationToken: uhkGGpJ4aQxm8BKOCH5dt3bMcwsHGCHs1p+OJvtf9mHKa/8pTEnKyYeJr+boBr8oUuvWvZLr1Fd+Og2xJP3xVw==\r\nErrorLogging: False\r\nContent-Type: application/json\r\nclienttype: Cloud-web\r\n\r\n'
reply: 'HTTP/1.1 411 Length Required\r\n'
header: Content-Type: text/html; charset=us-ascii
header: Server: Microsoft-HTTPAPI/2.0
header: Date: Thu, 26 May 2016 17:08:27 GMT
header: Connection: close
header: Content-Length: 344

Any ideas as to why this was working on a previous Mac and is currently not working here? It's the same code, same operating systems. Let me know if I can provide any more information.

Edit 2 The issue seemed to be with OSX 10.10.4, after upgrading to 10.10.5 all is well. I still would like to get some insight on why I was having this issue.

The only change from 10.10.4 to 10.10.5, that seems close, would have been the python update from 2.7.6 to 2.7.10 which includes this bug fix: http://bugs.python.org/issue22417

Community
  • 1
  • 1
MITjanitor
  • 375
  • 1
  • 3
  • 16
  • Can you try capturing the HTTP requests (not responses) on both old and new machines? And see what differs? The HTTP you have attached towards the end of the post is the *HTTP response coming from the Microsoft Server (your HTTP endpoint)*.. – UltraInstinct May 26 '16 at 17:56
  • @Thrustmaster, I could have... only the other machine is being shipping right now. – MITjanitor May 26 '16 at 17:59

0 Answers0