Kaydet (Commit) 0619a329 authored tarafından Georg Brandl's avatar Georg Brandl

Bug #1459963: properly capitalize HTTP header names.

üst cf0c1729
...@@ -676,11 +676,11 @@ class HandlerTests(unittest.TestCase): ...@@ -676,11 +676,11 @@ class HandlerTests(unittest.TestCase):
r = MockResponse(200, "OK", {}, "") r = MockResponse(200, "OK", {}, "")
newreq = h.do_request_(req) newreq = h.do_request_(req)
if data is None: # GET if data is None: # GET
self.assert_("Content-length" not in req.unredirected_hdrs) self.assert_("Content-Length" not in req.unredirected_hdrs)
self.assert_("Content-type" not in req.unredirected_hdrs) self.assert_("Content-Type" not in req.unredirected_hdrs)
else: # POST else: # POST
self.assertEqual(req.unredirected_hdrs["Content-length"], "0") self.assertEqual(req.unredirected_hdrs["Content-Length"], "0")
self.assertEqual(req.unredirected_hdrs["Content-type"], self.assertEqual(req.unredirected_hdrs["Content-Type"],
"application/x-www-form-urlencoded") "application/x-www-form-urlencoded")
# XXX the details of Host could be better tested # XXX the details of Host could be better tested
self.assertEqual(req.unredirected_hdrs["Host"], "example.com") self.assertEqual(req.unredirected_hdrs["Host"], "example.com")
...@@ -692,8 +692,8 @@ class HandlerTests(unittest.TestCase): ...@@ -692,8 +692,8 @@ class HandlerTests(unittest.TestCase):
req.add_unredirected_header("Host", "baz") req.add_unredirected_header("Host", "baz")
req.add_unredirected_header("Spam", "foo") req.add_unredirected_header("Spam", "foo")
newreq = h.do_request_(req) newreq = h.do_request_(req)
self.assertEqual(req.unredirected_hdrs["Content-length"], "foo") self.assertEqual(req.unredirected_hdrs["Content-Length"], "foo")
self.assertEqual(req.unredirected_hdrs["Content-type"], "bar") self.assertEqual(req.unredirected_hdrs["Content-Type"], "bar")
self.assertEqual(req.unredirected_hdrs["Host"], "baz") self.assertEqual(req.unredirected_hdrs["Host"], "baz")
self.assertEqual(req.unredirected_hdrs["Spam"], "foo") self.assertEqual(req.unredirected_hdrs["Spam"], "foo")
...@@ -847,7 +847,7 @@ class HandlerTests(unittest.TestCase): ...@@ -847,7 +847,7 @@ class HandlerTests(unittest.TestCase):
407, 'Proxy-Authenticate: Basic realm="%s"\r\n\r\n' % realm) 407, 'Proxy-Authenticate: Basic realm="%s"\r\n\r\n' % realm)
opener.add_handler(auth_handler) opener.add_handler(auth_handler)
opener.add_handler(http_handler) opener.add_handler(http_handler)
self._test_basic_auth(opener, auth_handler, "Proxy-authorization", self._test_basic_auth(opener, auth_handler, "Proxy-Authorization",
realm, http_handler, password_manager, realm, http_handler, password_manager,
"http://acme.example.com:3128/protected", "http://acme.example.com:3128/protected",
"proxy.example.com:3128", "proxy.example.com:3128",
......
...@@ -118,7 +118,7 @@ class URLopener: ...@@ -118,7 +118,7 @@ class URLopener:
self.proxies = proxies self.proxies = proxies
self.key_file = x509.get('key_file') self.key_file = x509.get('key_file')
self.cert_file = x509.get('cert_file') self.cert_file = x509.get('cert_file')
self.addheaders = [('User-agent', self.version)] self.addheaders = [('User-Agent', self.version)]
self.__tempfiles = [] self.__tempfiles = []
self.__unlink = os.unlink # See cleanup() self.__unlink = os.unlink # See cleanup()
self.tempcache = None self.tempcache = None
...@@ -314,8 +314,8 @@ class URLopener: ...@@ -314,8 +314,8 @@ class URLopener:
h = httplib.HTTP(host) h = httplib.HTTP(host)
if data is not None: if data is not None:
h.putrequest('POST', selector) h.putrequest('POST', selector)
h.putheader('Content-type', 'application/x-www-form-urlencoded') h.putheader('Content-Type', 'application/x-www-form-urlencoded')
h.putheader('Content-length', '%d' % len(data)) h.putheader('Content-Length', '%d' % len(data))
else: else:
h.putrequest('GET', selector) h.putrequest('GET', selector)
if proxy_auth: h.putheader('Proxy-Authorization', 'Basic %s' % proxy_auth) if proxy_auth: h.putheader('Proxy-Authorization', 'Basic %s' % proxy_auth)
...@@ -400,9 +400,9 @@ class URLopener: ...@@ -400,9 +400,9 @@ class URLopener:
cert_file=self.cert_file) cert_file=self.cert_file)
if data is not None: if data is not None:
h.putrequest('POST', selector) h.putrequest('POST', selector)
h.putheader('Content-type', h.putheader('Content-Type',
'application/x-www-form-urlencoded') 'application/x-www-form-urlencoded')
h.putheader('Content-length', '%d' % len(data)) h.putheader('Content-Length', '%d' % len(data))
else: else:
h.putrequest('GET', selector) h.putrequest('GET', selector)
if proxy_auth: h.putheader('Proxy-Authorization: Basic %s' % proxy_auth) if proxy_auth: h.putheader('Proxy-Authorization: Basic %s' % proxy_auth)
...@@ -584,7 +584,7 @@ class URLopener: ...@@ -584,7 +584,7 @@ class URLopener:
data = base64.decodestring(data) data = base64.decodestring(data)
else: else:
data = unquote(data) data = unquote(data)
msg.append('Content-length: %d' % len(data)) msg.append('Content-Length: %d' % len(data))
msg.append('') msg.append('')
msg.append(data) msg.append(data)
msg = '\n'.join(msg) msg = '\n'.join(msg)
......
...@@ -263,11 +263,11 @@ class Request: ...@@ -263,11 +263,11 @@ class Request:
def add_header(self, key, val): def add_header(self, key, val):
# useful for something like authentication # useful for something like authentication
self.headers[key.capitalize()] = val self.headers[key.title()] = val
def add_unredirected_header(self, key, val): def add_unredirected_header(self, key, val):
# will not be added to a redirected request # will not be added to a redirected request
self.unredirected_hdrs[key.capitalize()] = val self.unredirected_hdrs[key.title()] = val
def has_header(self, header_name): def has_header(self, header_name):
return (header_name in self.headers or return (header_name in self.headers or
...@@ -286,7 +286,7 @@ class Request: ...@@ -286,7 +286,7 @@ class Request:
class OpenerDirector: class OpenerDirector:
def __init__(self): def __init__(self):
client_version = "Python-urllib/%s" % __version__ client_version = "Python-urllib/%s" % __version__
self.addheaders = [('User-agent', client_version)] self.addheaders = [('User-Agent', client_version)]
# manage the individual handlers # manage the individual handlers
self.handlers = [] self.handlers = []
self.handle_open = {} self.handle_open = {}
...@@ -675,7 +675,7 @@ class ProxyHandler(BaseHandler): ...@@ -675,7 +675,7 @@ class ProxyHandler(BaseHandler):
if user and password: if user and password:
user_pass = '%s:%s' % (unquote(user), unquote(password)) user_pass = '%s:%s' % (unquote(user), unquote(password))
creds = base64.encodestring(user_pass).strip() creds = base64.encodestring(user_pass).strip()
req.add_header('Proxy-authorization', 'Basic ' + creds) req.add_header('Proxy-Authorization', 'Basic ' + creds)
hostport = unquote(hostport) hostport = unquote(hostport)
req.set_proxy(hostport, proxy_type) req.set_proxy(hostport, proxy_type)
if orig_type == proxy_type: if orig_type == proxy_type:
...@@ -819,7 +819,7 @@ class HTTPBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler): ...@@ -819,7 +819,7 @@ class HTTPBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler):
class ProxyBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler): class ProxyBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler):
auth_header = 'Proxy-authorization' auth_header = 'Proxy-Authorization'
def http_error_407(self, req, fp, code, msg, headers): def http_error_407(self, req, fp, code, msg, headers):
# http_error_auth_reqed requires that there is no userinfo component in # http_error_auth_reqed requires that there is no userinfo component in
...@@ -1022,20 +1022,20 @@ class AbstractHTTPHandler(BaseHandler): ...@@ -1022,20 +1022,20 @@ class AbstractHTTPHandler(BaseHandler):
if request.has_data(): # POST if request.has_data(): # POST
data = request.get_data() data = request.get_data()
if not request.has_header('Content-type'): if not request.has_header('Content-Type'):
request.add_unredirected_header( request.add_unredirected_header(
'Content-type', 'Content-Type',
'application/x-www-form-urlencoded') 'application/x-www-form-urlencoded')
if not request.has_header('Content-length'): if not request.has_header('Content-Length'):
request.add_unredirected_header( request.add_unredirected_header(
'Content-length', '%d' % len(data)) 'Content-Length', '%d' % len(data))
scheme, sel = splittype(request.get_selector()) scheme, sel = splittype(request.get_selector())
sel_host, sel_path = splithost(sel) sel_host, sel_path = splithost(sel)
if not request.has_header('Host'): if not request.has_header('Host'):
request.add_unredirected_header('Host', sel_host or host) request.add_unredirected_header('Host', sel_host or host)
for name, value in self.parent.addheaders: for name, value in self.parent.addheaders:
name = name.capitalize() name = name.title()
if not request.has_header(name): if not request.has_header(name):
request.add_unredirected_header(name, value) request.add_unredirected_header(name, value)
...@@ -1217,7 +1217,7 @@ class FileHandler(BaseHandler): ...@@ -1217,7 +1217,7 @@ class FileHandler(BaseHandler):
modified = email.Utils.formatdate(stats.st_mtime, usegmt=True) modified = email.Utils.formatdate(stats.st_mtime, usegmt=True)
mtype = mimetypes.guess_type(file)[0] mtype = mimetypes.guess_type(file)[0]
headers = mimetools.Message(StringIO( headers = mimetools.Message(StringIO(
'Content-type: %s\nContent-length: %d\nLast-modified: %s\n' % 'Content-Type: %s\nContent-Length: %d\nLast-Modified: %s\n' %
(mtype or 'text/plain', size, modified))) (mtype or 'text/plain', size, modified)))
if host: if host:
host, port = splitport(host) host, port = splitport(host)
...@@ -1272,9 +1272,9 @@ class FTPHandler(BaseHandler): ...@@ -1272,9 +1272,9 @@ class FTPHandler(BaseHandler):
headers = "" headers = ""
mtype = mimetypes.guess_type(req.get_full_url())[0] mtype = mimetypes.guess_type(req.get_full_url())[0]
if mtype: if mtype:
headers += "Content-type: %s\n" % mtype headers += "Content-Type: %s\n" % mtype
if retrlen is not None and retrlen >= 0: if retrlen is not None and retrlen >= 0:
headers += "Content-length: %d\n" % retrlen headers += "Content-Length: %d\n" % retrlen
sf = StringIO(headers) sf = StringIO(headers)
headers = mimetools.Message(sf) headers = mimetools.Message(sf)
return addinfourl(fp, headers, req.get_full_url()) return addinfourl(fp, headers, req.get_full_url())
......
...@@ -42,6 +42,9 @@ Core and builtins ...@@ -42,6 +42,9 @@ Core and builtins
Library Library
------- -------
- Bug #1459963: urllib and urllib2 now normalize HTTP header names correctly
with title().
- Patch #1525766: In pkgutil.walk_packages, correctly pass the onerror callback - Patch #1525766: In pkgutil.walk_packages, correctly pass the onerror callback
to recursive calls and call it with the failing package name. to recursive calls and call it with the failing package name.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment