2012-12-01 56 views
6

似乎urllib2默認發送HTTP/1.1請求?如何通過urllib2發送HTTP/1.0請求?

+0

是否有什麼特別的理由在HTTP 1.1上使用HTTP 1.0? –

+0

我也很好奇爲什麼需要HTTP 1.0 –

+0

我正在爲我的一個愚蠢的作業寫一個測試腳本,它只使用HTTP 1.0。 (測試腳本不是作業的一部分) – houqp

回答

4

urllib2在引擎蓋下使用httplib進行連接。您可以將其更改爲http 1.0,如下所示。我包括我的Apache服務器的訪問日誌,顯示HTTP連接怎麼也改爲1.0

代碼

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

我終於想通過定義我自己的處理程序,但你的解決方案更簡單,謝謝:) – houqp

+0

爲Python 3用戶,httplib被替換爲http.client,其餘的是仍然和Marwan的精彩解決方案一樣。 –

4

爲了避免猴子補丁httplib(全局變更),您可以繼承HTTPConnection並定義您自己的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])