]> granicus.if.org Git - python/commitdiff
To match the behaviour of HTTP server, the HTTP client library now also encodes
authorArmin Ronacher <armin.ronacher@active-4.com>
Sat, 22 Jan 2011 13:44:22 +0000 (13:44 +0000)
committerArmin Ronacher <armin.ronacher@active-4.com>
Sat, 22 Jan 2011 13:44:22 +0000 (13:44 +0000)
headers with iso-8859-1 (latin1) encoding.  It was already doing that for
incoming headers which makes this behaviour now consistent in both incoming and
outgoing direction.

Lib/http/client.py
Lib/test/test_httpservers.py
Misc/NEWS

index bb9fa9b0e7010d07bd20fc626e64d6bcfb9d4461..347aa61c9c5ab827f9ed2723127f7c65d1160530 100644 (file)
@@ -696,7 +696,7 @@ class HTTPConnection:
         self.send(connect_bytes)
         for header, value in self._tunnel_headers.iteritems():
             header_str = "%s: %s\r\n" % (header, value)
-            header_bytes = header_str.encode("ascii")
+            header_bytes = header_str.encode("latin1")
             self.send(header_bytes)
 
         response = self.response_class(self.sock, method = self._method)
@@ -935,7 +935,7 @@ class HTTPConnection:
         values = list(values)
         for i, one_value in enumerate(values):
             if hasattr(one_value, 'encode'):
-                values[i] = one_value.encode('ascii')
+                values[i] = one_value.encode('latin1')
             elif isinstance(one_value, int):
                 values[i] = str(one_value).encode('ascii')
         value = b'\r\n\t'.join(values)
index 2cc94a9acbbb331f01270cf474651bb93af8cd74..95b9c19d12a8aecd5615f36db03406bea1c569d0 100644 (file)
@@ -100,7 +100,10 @@ class BaseHTTPServerTestCase(BaseTestCase):
         def do_LATINONEHEADER(self):
             self.send_response(999)
             self.send_header('X-Special', 'Dängerous Mind')
+            self.send_header('Connection', 'close')
             self.end_headers()
+            body = self.headers['x-special-incoming'].encode('utf-8')
+            self.wfile.write(body)
 
     def setUp(self):
         BaseTestCase.setUp(self)
@@ -200,9 +203,12 @@ class BaseHTTPServerTestCase(BaseTestCase):
         self.assertEqual(res.status, 999)
 
     def test_latin1_header(self):
-        self.con.request('LATINONEHEADER', '/')
+        self.con.request('LATINONEHEADER', '/', headers={
+            'X-Special-Incoming':       'Ärger mit Unicode'
+        })
         res = self.con.getresponse()
         self.assertEqual(res.getheader('X-Special'), 'Dängerous Mind')
+        self.assertEqual(res.read(), 'Ärger mit Unicode'.encode('utf-8'))
 
 
 class SimpleHTTPServerTestCase(BaseTestCase):
index 3b55447d81f905426b8656b5d4646138dc1a6ae4..22bc4287898047e851c5ceb331f509aa62ed748c 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -33,6 +33,11 @@ Library
   encoding.  This is the preferred encoding of PEP 3333 and the base encoding
   of HTTP 1.1.
 
+- To match the behaviour of HTTP server, the HTTP client library now also
+  encodes headers with iso-8859-1 (latin1) encoding.  It was already doing
+  that for incoming headers which makes this behaviour now consistent in
+  both incoming and outgoing direction.
+
 
 What's New in Python 3.2 Release Candidate 1
 ============================================