mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
SF bug 874842 and patch 997626: httplib bugs
Hack httplib to work with broken Akamai proxies. Make sure that httplib doesn't add extract Accept-Encoding or Content-Length headers if the client has already set them.
This commit is contained in:
parent
dc54f2be3f
commit
2c178253bd
2 changed files with 64 additions and 11 deletions
|
@ -344,6 +344,7 @@ class HTTPResponse:
|
|||
self.will_close = 1
|
||||
|
||||
def _check_close(self):
|
||||
conn = self.msg.getheader('connection')
|
||||
if self.version == 11:
|
||||
# An HTTP/1.1 proxy is assumed to stay open unless
|
||||
# explicitly closed.
|
||||
|
@ -352,13 +353,18 @@ class HTTPResponse:
|
|||
return True
|
||||
return False
|
||||
|
||||
# An HTTP/1.0 response with a Connection header is probably
|
||||
# the result of a confused proxy. Ignore it.
|
||||
# Some HTTP/1.0 implementations have support for persistent
|
||||
# connections, using rules different than HTTP/1.1.
|
||||
|
||||
# For older HTTP, Keep-Alive indiciates persistent connection.
|
||||
if self.msg.getheader('keep-alive'):
|
||||
return False
|
||||
|
||||
# At least Akamai returns a "Connection: Keep-Alive" header,
|
||||
# which was supposed to be sent by the client.
|
||||
if conn and "keep-alive" in conn.lower():
|
||||
return False
|
||||
|
||||
# Proxy-Connection is a netscape hack.
|
||||
pconn = self.msg.getheader('proxy-connection')
|
||||
if pconn and "keep-alive" in pconn.lower():
|
||||
|
@ -381,6 +387,8 @@ class HTTPResponse:
|
|||
# called, meaning self.isclosed() is meaningful.
|
||||
return self.fp is None
|
||||
|
||||
# XXX It would be nice to have readline and __iter__ for this, too.
|
||||
|
||||
def read(self, amt=None):
|
||||
if self.fp is None:
|
||||
return ''
|
||||
|
@ -728,15 +736,17 @@ class HTTPConnection:
|
|||
self._send_request(method, url, body, headers)
|
||||
|
||||
def _send_request(self, method, url, body, headers):
|
||||
# If headers already contains a host header, then define the
|
||||
# optional skip_host argument to putrequest(). The check is
|
||||
# harder because field names are case insensitive.
|
||||
if 'host' in [k.lower() for k in headers]:
|
||||
self.putrequest(method, url, skip_host=1)
|
||||
else:
|
||||
self.putrequest(method, url)
|
||||
# honour explicitly requested Host: and Accept-Encoding headers
|
||||
header_names = dict.fromkeys([k.lower() for k in headers])
|
||||
skips = {}
|
||||
if 'host' in header_names:
|
||||
skips['skip_host'] = 1
|
||||
if 'accept-encoding' in header_names:
|
||||
skips['skip_accept_encoding'] = 1
|
||||
|
||||
if body:
|
||||
self.putrequest(method, url, **skips)
|
||||
|
||||
if body and ('content-length' not in header_names):
|
||||
self.putheader('Content-Length', str(len(body)))
|
||||
for hdr, value in headers.iteritems():
|
||||
self.putheader(hdr, value)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue