2012-12-01 27 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])