From: Senthil Kumaran Date: Wed, 1 Apr 2009 20:20:43 +0000 (+0000) Subject: Fix for issue5040. Adding support for unicode message passing and tests for unicode... X-Git-Tag: v3.1a2~95 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b3af08f84c36106f8873d0fa7e8775aa0ef6ab75;p=python Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length. --- diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index 1f5f5aa4f3..624793da95 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -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(" ['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)