diff -r 9332a545ad85 Lib/test/test_urllib2.py --- a/Lib/test/test_urllib2.py Thu Mar 12 22:01:30 2015 +0200 +++ b/Lib/test/test_urllib2.py Fri Mar 13 15:24:10 2015 -0700 @@ -12,10 +12,11 @@ # The proxy bypass method imported below has logic specific to the OSX # proxy config data structure but is testable on all platforms. from urllib.request import Request, OpenerDirector, _parse_proxy, _proxy_bypass_macosx_sysconf -from urllib.parse import urlparse +from urllib.parse import urlparse, urlsplit import urllib.error import http.client + # XXX # Request # CacheFTPHandler (hard to write) @@ -290,7 +291,7 @@ class MockHTTPClass: - def __init__(self): + def __init__(self, host, timeout=None): self.level = 0 self.req_headers = [] self.data = None @@ -442,7 +443,7 @@ def __init__(self): urllib.request.AbstractHTTPHandler.__init__(self) - self.httpconn = MockHTTPClass() + self.httpconn = MockHTTPClass('example.com') def https_open(self, req): return self.do_open(self.httpconn, req) @@ -773,6 +774,25 @@ self.assertEqual(req.type, "ftp") self.assertEqual(req.type == "ftp", ftp) + def test_idna(self): + request_headers = {} + class MockHTTPConnection(MockHTTPClass): + def request(self, method, url, body, headers): + nonlocal request_headers + request_headers = headers + + host = 'http://\u03b4\u03c0\u03b8.gr' + expected_host = urlsplit(host).netloc.encode('idna').decode('ascii') + + handler = urllib.request.HTTPHandler() + handler.parent = MockOpener() + request = handler.http_request(Request(host)) + request.timeout = None + handler.do_open(MockHTTPConnection, request) + + self.assertIn('Host', request_headers) + self.assertEqual(request_headers['Host'], expected_host) + def test_http(self): h = urllib.request.AbstractHTTPHandler() @@ -783,7 +803,7 @@ req = Request(url, data, {"Foo": "bar"}) req.timeout = None req.add_unredirected_header("Spam", "eggs") - http = MockHTTPClass() + http = MockHTTPClass('example.com') r = h.do_open(http, req) # result attributes diff -r 9332a545ad85 Lib/urllib/request.py --- a/Lib/urllib/request.py Thu Mar 12 22:01:30 2015 +0200 +++ b/Lib/urllib/request.py Fri Mar 13 15:24:10 2015 -0700 @@ -1192,6 +1192,9 @@ del headers[proxy_auth_hdr] h.set_tunnel(req._tunnel_host, headers=tunnel_headers) + if 'Host' in headers: + headers['Host'] = headers['Host'].encode('idna').decode('ascii') + try: try: h.request(req.get_method(), req.selector, req.data, headers) @@ -1791,6 +1794,8 @@ headers["Connection"] = "close" for header, value in self.addheaders: + if header.lower() == 'host': + value = value.encode('idna').decode('ascii') headers[header] = value if data is not None: