Как получить сообщение о статусе HTTP в (py) curl? - PullRequest
20 голосов
/ 27 апреля 2010

потратив некоторое время на изучение документации 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"

Ответы [ 4 ]

26 голосов
/ 29 апреля 2010

Я сам нашел решение, которое делает то, что мне нужно, но может быть более надежным (работает для 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"
3 голосов
/ 20 августа 2016

Это старая ветка, но я попал сюда в поисках подобной информации. Если вам нужен только код состояния, например, 200, 404, 500 и т. Д., Просто выполните:

your_curl_handle.getinfo(pycurl.RESPONSE_CODE)

, который должен возвращать числовой код состояния:)

2 голосов
/ 14 апреля 2012

Я думаю, что вы можете использовать библиотеку 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

0 голосов
/ 28 апреля 2010

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

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

...