Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to send HTTP/1.0 request via urllib2?

Tags:

python

urllib2

Seems that urllib2 sends HTTP/1.1 request by default?

like image 453
houqp Avatar asked Dec 01 '12 05:12

houqp


2 Answers

To avoid monkey-patching httplib (global change), you could subclass HTTPConnection and define your own http handler:

#!/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])
like image 123
jfs Avatar answered Oct 26 '22 12:10

jfs


urllib2 uses httplib under the hood to make the connection. You can change it to http 1.0 as shown below. I've included my apache servers access log to show how the http connection have change to 1.0

code

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"
like image 21
Marwan Alsabbagh Avatar answered Oct 26 '22 12:10

Marwan Alsabbagh