2012-12-01 13 views
6

Sembra che urllib2 invii la richiesta HTTP/1.1 per impostazione predefinita?Come inviare una richiesta HTTP/1.0 tramite urllib2?

+0

C'è qualche ragione particolare per utilizzare HTTP 1.0 su HTTP 1.1? –

+0

Sono anche curioso del perché della necessità di HTTP 1.0 –

+0

Sto scrivendo uno script di test per uno dei miei stupidi compiti, che utilizza solo HTTP 1.0. (lo script di test non fa parte dei compiti) – houqp

risposta

4

urllib2 utilizza httplib sotto il cofano per effettuare la connessione. Puoi cambiarlo in http 1.0 come mostrato di seguito. Ho incluso il mio log di accesso server Apache per mostrare come la connessione HTTP deve passare alla 1.0

codice

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

Ho finalmente capito definendo il mio gestore, ma la tua soluzione è molto più semplice, grazie :) – houqp

+0

per utenti python 3, httplib è sostituito da http.client e tutto il resto è è lo stesso della meravigliosa soluzione di Marwan. –

4

Per evitare scimmia-patching httplib (modifica globale), è possibile creare sottoclasse HTTPConnection e definire il proprio gestore 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]) 
Problemi correlati