Wygląda na to, że urllib2 wysyła domyślnie żądanie HTTP/1.1?Jak wysłać żądanie HTTP/1.0 przez urllib2?
Odpowiedz
urllib2 używa httplib pod maską, aby nawiązać połączenie. Możesz zmienić go na http 1.0, jak pokazano poniżej. Podaję mój dziennik serwerów Apache dostępu do pokazania, w jaki sposób połączenie http mieć zmiany do 1,0
kodu
import urllib2, httplib
httplib.HTTPConnection._http_vsn = 10
httplib.HTTPConnection._http_vsn_str = 'HTTP/1.0'
print urllib2.urlopen('http://localhost/').read()
access.log
127.0.0.1 - - [01/Dec/2012:09:10:27 +0300] "GET/HTTP/1.1" 200 454 "-" "Python-urllib/2.7"
127.0.0.1 - - [01/Dec/2012:09:16:32 +0300] "GET/HTTP/1.0" 200 454 "-" "Python-urllib/2.7"
W końcu wymyśliłem, definiując mój własny handler, ale twoje rozwiązanie jest znacznie prostsze, dzięki :) – houqp
dla użytkowników python 3, httplib jest zastąpione przez http.client i cała reszta jest wciąż tak samo, jak wspaniałe rozwiązanie Marwana. –
Aby uniknąć małpa-łatanie httplib
(zmiana globalna), można podklasę HTTPConnection
zdefiniować własny program obsługi http:
#!/usr/bin/env python
try:
from httplib import HTTPConnection
from urllib2 import HTTPHandler, build_opener
except ImportError: # Python 3
from http.client import HTTPConnection
from urllib.request import HTTPHandler, build_opener
class HTTP10Connection(HTTPConnection):
_http_vsn = 10
_http_vsn_str = "HTTP/1.0"
class HTTP10Handler(HTTPHandler):
def http_open(self, req):
return self.do_open(HTTP10Connection, req)
opener = build_opener(HTTP10Handler)
print(opener.open('http://stackoverflow.com/q/13656757').read()[:100])
Czy istnieje jakiś szczególny powód, aby używać protokołu HTTP 1.0 przez HTTP 1.1? –
Jestem również ciekawy, dlaczego potrzeba HTTP 1.0 –
Piszę skrypt testowy dla jednego z moich głupich zadań domowych, który używa tylko HTTP 1.0. (skrypt testowy nie jest częścią pracy domowej) – houqp