2012-12-01 11 views
6

Wygląda na to, że urllib2 wysyła domyślnie żądanie HTTP/1.1?Jak wysłać żądanie HTTP/1.0 przez urllib2?

+0

Czy istnieje jakiś szczególny powód, aby używać protokołu HTTP 1.0 przez HTTP 1.1? –

+0

Jestem również ciekawy, dlaczego potrzeba HTTP 1.0 –

+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

Odpowiedz

4

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

W końcu wymyśliłem, definiując mój własny handler, ale twoje rozwiązanie jest znacznie prostsze, dzięki :) – houqp

+0

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. –

4

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])