【问题标题】:How to send HTTP/1.0 request via urllib2?如何通过 urllib2 发送 HTTP/1.0 请求?
【发布时间】:2012-12-01 05:38:25
【问题描述】:

好像urllib2默认发送HTTP/1.1请求?

【问题讨论】:

  • 使用 HTTP 1.0 而不是 HTTP 1.1 有什么特别的原因吗?
  • 我也很好奇为什么需要 HTTP 1.0
  • 我正在为我的一项愚蠢的作业编写一个测试脚本,它只使用 HTTP 1.0。 (测试脚本不是作业的一部分)

标签: python urllib2


【解决方案1】:

为避免猴子修补 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])

【讨论】:

    【解决方案2】:

    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"
    

    【讨论】:

    • 我终于通过定义自己的处理程序想通了,但是您的解决方案要简单得多,谢谢:)
    • 对于python 3用户,httplib替换为http.client,其余的仍然和Marwan的精彩解决方案一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多