'How to get HTTP status message in (py)curl?

spending some time studying pycurl and libcurl documentation, i still can't find a (simple) way, how to get HTTP status message (reason-phrase) in pycurl.

status code is easy:

import pycurl
import cStringIO

curl = pycurl.Curl()
buff = cStringIO.StringIO()
curl.setopt(pycurl.URL, 'http://example.org')
curl.setopt(pycurl.WRITEFUNCTION, buff.write)
curl.perform()

print "status code: %s" % curl.getinfo(pycurl.HTTP_CODE)
# -> 200

# print "status message: %s" % ???
# -> "OK"


Solution 1:[1]

i've found a solution myself, which does what i need, but could be more robust (works for HTTP).

it's based on a fact that captured headers obtained by pycurl.HEADERFUNCTION include the status line.

import pycurl
import cStringIO
import re

curl = pycurl.Curl()

buff = cStringIO.StringIO()
hdr = cStringIO.StringIO()

curl.setopt(pycurl.URL, 'http://example.org')
curl.setopt(pycurl.WRITEFUNCTION, buff.write)
curl.setopt(pycurl.HEADERFUNCTION, hdr.write)
curl.perform()

print "status code: %s" % curl.getinfo(pycurl.HTTP_CODE)
# -> 200

status_line = hdr.getvalue().splitlines()[0]
m = re.match(r'HTTP\/\S*\s*\d+\s*(.*?)\s*$', status_line)
if m:
    status_message = m.groups(1)
else:
    status_message = ''

print "status message: %s" % status_message
# -> "OK"

Solution 2:[2]

This is an old thread but I got here looking for similar information. If it is just the status code you're looking for, such as 200, 404, 500 etc. then just do:

your_curl_handle.getinfo(pycurl.RESPONSE_CODE)

which should return a numerical status code :)

Solution 3:[3]

I think that you can use human_curl library to create you code simple.

>>> import human_curl as hurl
>>> r = hurl.get('http://example.org')
>>> print r.status_code
200

Full documentation on human_curl you can get on https://github.com/Lispython/human_curl

Solution 4:[4]

If you only want the code, you can do, and assuming your pycurl.Curl() instance is called curl (ie. curl = pycurl.Curl()), you can do

curl.getinfo(pycurl.RESPONSE_CODE)
curl.getinfo(pycurl.HTTP_CODE)

But the nice way in my opinion is to parse the header yourself instead of letting libraries spoon-feed you everything.

Solution 5:[5]

Try BaseHTTPServer.BaseHTTPRequestHandler.responses, it should contain an errorcode dictionnary as explained in this page.

hope this helps.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 mykhal
Solution 2 Kalabaaz
Solution 3 Alexandr
Solution 4 étale-cohomology
Solution 5 Aif