]> granicus.if.org Git - python/commitdiff
Fix for issue5040. Adding support for unicode message passing and tests for unicode...
authorSenthil Kumaran <orsenthil@gmail.com>
Wed, 1 Apr 2009 20:20:43 +0000 (20:20 +0000)
committerSenthil Kumaran <orsenthil@gmail.com>
Wed, 1 Apr 2009 20:20:43 +0000 (20:20 +0000)
Lib/test/test_xmlrpc.py
Lib/xmlrpc/client.py
Lib/xmlrpc/server.py

index 1f5f5aa4f3cfe011b7f5dd462ddb8f56f4df12f8..624793da95332eb706c84587fa57ecc948f5a19c 100644 (file)
@@ -9,6 +9,7 @@ import threading
 import http.client
 import socket
 import os
+import re
 from test import support
 
 alist = [{'astring': 'foo@bar.baz.spam',
@@ -352,6 +353,19 @@ class SimpleServerTestCase(unittest.TestCase):
                 # protocol error; provide additional information in test output
                 self.fail("%s\n%s" % (e, getattr(e, "headers", "")))
 
+    def test_nonascii(self):
+        start_string = 'P\N{LATIN SMALL LETTER Y WITH CIRCUMFLEX}t'
+        end_string = 'h\N{LATIN SMALL LETTER O WITH HORN}n'
+        try:
+            p = xmlrpclib.ServerProxy(URL)
+            self.assertEqual(p.add(start_string, end_string),
+                             start_string + end_string)
+        except (xmlrpclib.ProtocolError, socket.error) as e:
+            # ignore failures due to non-blocking socket 'unavailable' errors
+            if not is_unavailable_exception(e):
+                # protocol error; provide additional information in test output
+                self.fail("%s\n%s" % (e, getattr(e, "headers", "")))
+
     # [ch] The test 404 is causing lots of false alarms.
     def XXXtest_404(self):
         # send POST with http.client, it should return 404 header and
@@ -616,9 +630,21 @@ class CGIHandlerTestCase(unittest.TestCase):
         # need only xml
         self.assertRaises(xmlrpclib.Fault, xmlrpclib.loads, handle[44:])
 
+        # Also test the content-length returned  by handle_request
+        # Using the same test method inorder to avoid all the datapassing
+        # boilerplate code.
+        # Test for bug: http://bugs.python.org/issue5040
+
+        content = handle[handle.find("<?xml"):]
+
+        self.assertEquals(
+            int(re.search('Content-Length: (\d+)', handle).group(1)),
+            len(content))
+
         os.remove("xmldata.txt")
         os.remove(support.TESTFN)
 
+
 def test_main():
     xmlrpc_tests = [XMLRPCTestCase, HelperTestCase, DateTimeTestCase,
          BinaryTestCase, FaultTestCase]
index 86988deefaf857d261fcc93bf5d84552393fadfe..cc717e0753e12b70e85789eafd92e504e0faf30b 100644 (file)
@@ -1316,7 +1316,7 @@ class ServerProxy:
                 transport = Transport(use_datetime=use_datetime)
         self.__transport = transport
 
-        self.__encoding = encoding
+        self.__encoding = encoding or 'utf-8'
         self.__verbose = verbose
         self.__allow_none = allow_none
 
@@ -1324,7 +1324,7 @@ class ServerProxy:
         # call a method on the remote server
 
         request = dumps(params, methodname, encoding=self.__encoding,
-                        allow_none=self.__allow_none)
+                        allow_none=self.__allow_none).encode(self.__encoding)
 
         response = self.__transport.request(
             self.__host,
index ea828a52e98a9982b4dac61d2232477402093e81..f84176fc42d348d476413b984f7cabc395793606 100644 (file)
@@ -163,7 +163,7 @@ class SimpleXMLRPCDispatcher:
         self.funcs = {}
         self.instance = None
         self.allow_none = allow_none
-        self.encoding = encoding
+        self.encoding = encoding or 'utf-8'
 
     def register_instance(self, instance, allow_dotted_names=False):
         """Registers an instance to respond to XML-RPC requests.
@@ -266,7 +266,7 @@ class SimpleXMLRPCDispatcher:
                 encoding=self.encoding, allow_none=self.allow_none,
                 )
 
-        return response
+        return response.encode(self.encoding)
 
     def system_listMethods(self):
         """system.listMethods() => ['add', 'subtract', 'multiple']
@@ -473,8 +473,6 @@ class SimpleXMLRPCRequestHandler(BaseHTTPRequestHandler):
 
             self.end_headers()
         else:
-            # Got a valid XML RPC response; convert to bytes first
-            response = response.encode("utf-8")
             self.send_response(200)
             self.send_header("Content-type", "text/xml")
             self.send_header("Content-length", str(len(response)))
@@ -551,7 +549,9 @@ class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher):
         print('Content-Type: text/xml')
         print('Content-Length: %d' % len(response))
         print()
-        sys.stdout.write(response)
+        sys.stdout.flush()
+        sys.stdout.buffer.write(response)
+        sys.stdout.buffer.flush()
 
     def handle_get(self):
         """Handle a single HTTP GET request.
@@ -569,11 +569,14 @@ class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher):
              'message' : message,
              'explain' : explain
             }
+        response = response.encode('utf-8')
         print('Status: %d %s' % (code, message))
-        print('Content-Type: text/html')
+        print('Content-Type: %s' % http.server.DEFAULT_ERROR_CONTENT_TYPE)
         print('Content-Length: %d' % len(response))
         print()
-        sys.stdout.write(response)
+        sys.stdout.flush()
+        sys.stdout.buffer.write(response)
+        sys.stdout.buffer.flush()
 
     def handle_request(self, request_text = None):
         """Handle a single XML-RPC request passed through a CGI post method.
@@ -814,12 +817,12 @@ class DocXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
             self.report_404()
             return
 
-        response = self.server.generate_html_documentation()
+        response = self.server.generate_html_documentation().encode('utf-8')
         self.send_response(200)
         self.send_header("Content-type", "text/html")
         self.send_header("Content-length", str(len(response)))
         self.end_headers()
-        self.wfile.write(response.encode())
+        self.wfile.write(response)
 
         # shut down the connection
         self.wfile.flush()
@@ -852,12 +855,14 @@ class DocCGIXMLRPCRequestHandler(   CGIXMLRPCRequestHandler,
         documentation.
         """
 
-        response = self.generate_html_documentation()
+        response = self.generate_html_documentation().encode('utf-8')
 
         print('Content-Type: text/html')
         print('Content-Length: %d' % len(response))
         print()
-        sys.stdout.write(response)
+        sys.stdout.flush()
+        sys.stdout.buffer.write(response)
+        sys.stdout.buffer.flush()
 
     def __init__(self):
         CGIXMLRPCRequestHandler.__init__(self)