2010-04-27 11 views
18

spędzając trochę czasu na studiowaniu dokumentacji pycurl i libcurl, nadal nie mogę znaleźć (prostego) sposobu, jak uzyskać komunikat statusu HTTP (powód-fraza) w pycurl.Jak uzyskać komunikat stanu HTTP w formacie (py) curl?

kod stanu jest proste:

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" 

Odpowiedz

23

Sam znalazłem rozwiązanie, które robi to, czego potrzebuję, ale może być bardziej niezawodne (działa na HTTP).

jest to oparte na fakcie, że przechwycone nagłówki uzyskane przez pycurl.HEADERFUNCTION zawierają linię statusu.

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" 
0

Spróbuj BaseHTTPServer.BaseHTTPRequestHandler.responses, powinna ona zawierać dictionnary ERRORCODE jak wyjaśniono w this page.

mam nadzieję, że to pomoże.

+0

że jest to możliwe rozwiązanie ... Powinienem był zauważyć, że chcę mieć komunikat o statusie z serwera, który może być inny, niż standardowy " – mykhal

2

Myślę, że możesz użyć biblioteki human_curl, aby stworzyć prosty kod.

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

Pełna dokumentacja na human_curl można uzyskać na https://github.com/Lispython/human_curl

+0

" powód-fraza "to termin używany przez dokumentację protokołu HTTP w odniesieniu do człowieka czytelny ciąg, który pojawia się po status_code. Ten przykład po prostu zwraca numeryczny kod stanu. –

1

Jest to stary wątek, ale mam tu w poszukiwaniu podobnych informacji. Jeżeli jest to tylko kod stanu szukasz, takie jak 200, 404, 500 itd. A potem po prostu zrobić:

your_curl_handle.getinfo(pycurl.RESPONSE_CODE)

który powinien zwrócić liczbowy kod stanu :)