Index: Lib/test/test_xmlrpc.py =================================================================== --- Lib/test/test_xmlrpc.py (revision 63728) +++ Lib/test/test_xmlrpc.py (working copy) @@ -639,9 +639,36 @@ os.remove("xmldata.txt") os.remove(test_support.TESTFN) +class UseDatetimeTestCase(unittest.TestCase): + def test_use_datetime(self): + # SimpleXMLRPCDispatcher.__init__ accepts use_datetime, which makes + # all dispatch of datetime argument as datetime.datetime instances. + self.log = [] + def foobar(mydate): + self.log.append(mydate) + handler = SimpleXMLRPCServer.SimpleXMLRPCDispatcher( + allow_none=True, encoding=None, use_datetime=True) + handler.register_function(foobar) + expected_date = datetime.datetime(2008, 5, 26, 18, 25, 12) + marshaled = xmlrpclib.dumps((expected_date, ), 'foobar') + handler._marshaled_dispatch(marshaled) + self.assertEqual(len(self.log), 1) + mydate = self.log[0] + self.assertEqual(mydate, expected_date) + self.assertTrue(isinstance(mydate, datetime.datetime)) + + def test_cgihandler_has_use_datetime_flag(self): + handler = SimpleXMLRPCServer.CGIXMLRPCRequestHandler(use_datetime=True) + self.assertTrue(handler.use_datetime) + + def test_xmlrpcserver_has_use_datetime_flag(self): + server = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 0), + use_datetime=True) + self.assertTrue(server.use_datetime) + def test_main(): xmlrpc_tests = [XMLRPCTestCase, HelperTestCase, DateTimeTestCase, - BinaryTestCase, FaultTestCase] + BinaryTestCase, FaultTestCase, UseDatetimeTestCase] # The test cases against a SimpleXMLRPCServer raise a socket error # 10035 (WSAEWOULDBLOCK) in the server thread handle_request call when Index: Lib/SimpleXMLRPCServer.py =================================================================== --- Lib/SimpleXMLRPCServer.py (revision 63728) +++ Lib/SimpleXMLRPCServer.py (working copy) @@ -164,11 +164,12 @@ reason to instantiate this class directly. """ - def __init__(self, allow_none, encoding): + def __init__(self, allow_none, encoding, use_datetime): self.funcs = {} self.instance = None self.allow_none = allow_none self.encoding = encoding + self.use_datetime = use_datetime def register_instance(self, instance, allow_dotted_names=False): """Registers an instance to respond to XML-RPC requests. @@ -249,7 +250,7 @@ """ try: - params, method = xmlrpclib.loads(data) + params, method = xmlrpclib.loads(data, self.use_datetime) # generate response if dispatch_method is not None: @@ -532,10 +533,11 @@ _send_traceback_header = False def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler, - logRequests=True, allow_none=False, encoding=None, bind_and_activate=True): + logRequests=True, allow_none=False, encoding=None, + bind_and_activate=True, use_datetime=False): self.logRequests = logRequests - SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding) + SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding, use_datetime) SocketServer.TCPServer.__init__(self, addr, requestHandler, bind_and_activate) # [Bug #1222790] If possible, set close-on-exec flag; if a @@ -549,8 +551,8 @@ class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher): """Simple handler for XML-RPC data passed through CGI.""" - def __init__(self, allow_none=False, encoding=None): - SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding) + def __init__(self, allow_none=False, encoding=None, use_datetime=False): + SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding, use_datetime) def handle_xmlrpc(self, request_text): """Handle a single XML-RPC request"""