diff --git a/Lib/httplib.py b/Lib/httplib.py --- a/Lib/httplib.py +++ b/Lib/httplib.py @@ -857,6 +857,8 @@ class HTTPConnection: if not url: url = '/' hdr = '%s %s %s' % (method, url, self._http_vsn_str) + if isinstance(hdr, unicode): + hdr = hdr.encode('ISO-8859-1') self._output(hdr) @@ -932,7 +934,14 @@ class HTTPConnection: if self.__state != _CS_REQ_STARTED: raise CannotSendHeader() - hdr = '%s: %s' % (header, '\r\n\t'.join([str(v) for v in values])) + def encode_value(value): + if isinstance(value, unicode): + return value.encode('ISO-8859-1') + else: + return str(value) + + values = '\r\n\t'.join(map(encode_value, values)) + hdr = '%s: %s' % (header, values) self._output(hdr) def endheaders(self, message_body=None): diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -1318,6 +1318,16 @@ class RequestTests(unittest.TestCase): req = Request(url) self.assertEqual(req.get_full_url(), url) + def test_unicode_uri(self): + # Issue #12398 + h = urllib2.AbstractHTTPHandler() + o = h.parent = MockOpener() + http = MockHTTPClass() + non_ascii = b'\xFF' + request = urllib2.Request(u'http://www.host\xe9.org/\xe0', data=non_ascii) + r = h.do_open(http, request) + + def test_main(verbose=None): from test import test_urllib2 test_support.run_doctest(test_urllib2, verbose)