Как получить сообщение о статусе HTTP в (py)curl?

Потратив некоторое время на изучение документации pycurl и libcurl, я до сих пор не могу найти (простой) способ, как получить сообщение о статусе HTTP (фразу-причину) в pycurl.

Код статуса прост:

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"

5 ответов

Решение

Я сам нашел решение, которое делает то, что мне нужно, но может быть более надежным (работает для HTTP).

он основан на том факте, что захваченные заголовки, полученные pycurl.HEADERFUNCTION включить строку состояния.

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"

Это старая ветка, но я попал сюда в поисках подобной информации. Если это просто код состояния, который вы ищете, например, 200, 404, 500 и т. Д., Тогда просто сделайте:

your_curl_handle.getinfo(pycurl.RESPONSE_CODE)

который должен вернуть числовой код состояния:)

Я думаю, что вы можете использовать библиотеку human_curl для создания простого кода.

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

Полную документацию по human_curl вы можете получить на https://github.com/Lispython/human_curl

Если вам нужен только код, вы можете это сделать, и если ваш pycurl.Curl()экземпляр называется curl(т.е. curl = pycurl.Curl()), ты можешь сделать

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

Но, на мой взгляд, хороший способ — разобрать заголовок самостоятельно, а не позволять библиотекам кормить вас всем с ложечки.

Попробуйте BaseHTTPServer.BaseHTTPRequestHandler.responses, он должен содержать словарь с кодом ошибки, как описано на этой странице.

надеюсь это поможет.

Другие вопросы по тегам