]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fixes by John Reese and Jacques Frechet that make test_xmlrpc pass.
authorGuido van Rossum <guido@python.org>
Wed, 22 Aug 2007 23:45:42 +0000 (23:45 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 22 Aug 2007 23:45:42 +0000 (23:45 +0000)
(Note that test_xmlrpc isn't touched by the fixes!)  There were two
separate issues; (a) BaseHTTPServer was using a TextIOWrapper which
was swallowing some of the POST body; (b) the getheaders() API was
changed but (due to integration of 2.6 code) the code wasn't modified.

Lib/BaseHTTPServer.py
Lib/xmlrpclib.py

index 1ba0ac78e3ee140519624921348d9c214532e3ae..56e2169ea478cc671b938eaa44f5057c088e941e 100644 (file)
@@ -278,14 +278,21 @@ class BaseHTTPRequestHandler(SocketServer.StreamRequestHandler):
             return False
         self.command, self.path, self.request_version = command, path, version
 
-        # Examine the headers and look for a Connection directive
-        # MessageClass == rfc822 expects ascii, so use a text wrapper.
-        text = io.TextIOWrapper(self.rfile)
-        self.headers = self.MessageClass(text, 0)
-        # The text wrapper does buffering (as does self.rfile).  We
-        # don't want to leave any data in the buffer of the text
-        # wrapper.
-        assert not text.buffer.peek()
+        # Examine the headers and look for a Connection directive.
+
+        # MessageClass (rfc822) wants to see strings rather than bytes.
+        # But a TextIOWrapper around self.rfile would buffer too many bytes
+        # from the stream, bytes which we later need to read as bytes.
+        # So we read the correct bytes here, as bytes, then use StringIO
+        # to make them look like strings for MessageClass to parse.
+        headers = []
+        while True:
+            line = self.rfile.readline()
+            headers.append(line)
+            if line in (b'\r\n', b'\n', b''):
+                break
+        hfile = io.StringIO(b''.join(headers).decode('iso-8859-1'))
+        self.headers = self.MessageClass(hfile)
 
         conntype = self.headers.get('Connection', "")
         if conntype.lower() == 'close':
index 2da17c41f85d81808787962fe2373e6c3699c65e..abd1a07846b5ca3e13684d648198a590c20b5c75 100644 (file)
@@ -1118,7 +1118,7 @@ class Transport:
             raise ProtocolError(
                 host + handler,
                 resp.status, resp.reason,
-                resp.getheaders()
+                dict(resp.getheaders())
                 )
 
         self.verbose = verbose