diff options
author | Senthil Kumaran <senthil@uthcode.com> | 2014-01-13 00:06:58 (GMT) |
---|---|---|
committer | Senthil Kumaran <senthil@uthcode.com> | 2014-01-13 00:06:58 (GMT) |
commit | 939e2db48dc3bcb159486b599901b694d2d57f89 (patch) | |
tree | d45199046a3929f37eedc9ea370d0dd136fe0fdc | |
parent | 0abbe8c090707130fd492307b79cf5c608dedce0 (diff) | |
download | cpython-939e2db48dc3bcb159486b599901b694d2d57f89.zip cpython-939e2db48dc3bcb159486b599901b694d2d57f89.tar.gz cpython-939e2db48dc3bcb159486b599901b694d2d57f89.tar.bz2 |
Issue #19082: Working xmlrpc.server and xmlrpc.client examples. Both in modules and in documentation.
-rw-r--r-- | Doc/library/xmlrpc.server.rst | 64 | ||||
-rw-r--r-- | Lib/xmlrpc/client.py | 10 | ||||
-rw-r--r-- | Lib/xmlrpc/server.py | 14 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
4 files changed, 86 insertions, 5 deletions
diff --git a/Doc/library/xmlrpc.server.rst b/Doc/library/xmlrpc.server.rst index 18fee2f..aca4f36 100644 --- a/Doc/library/xmlrpc.server.rst +++ b/Doc/library/xmlrpc.server.rst @@ -184,6 +184,70 @@ server:: # Print list of available methods print(s.system.listMethods()) +The following example included in `Lib/xmlrpc/server.py` module shows a server +allowing dotted names and registering a multicall function. + +.. warning:: + + Enabling the *allow_dotted_names* option allows intruders to access your + module's global variables and may allow intruders to execute arbitrary code on + your machine. Only use this example only within a secure, closed network. + +:: + + import datetime + + class ExampleService: + def getData(self): + return '42' + + class currentTime: + @staticmethod + def getCurrentTime(): + return datetime.datetime.now() + + server = SimpleXMLRPCServer(("localhost", 8000)) + server.register_function(pow) + server.register_function(lambda x,y: x+y, 'add') + server.register_instance(ExampleService(), allow_dotted_names=True) + server.register_multicall_functions() + print('Serving XML-RPC on localhost port 8000') + try: + server.serve_forever() + except KeyboardInterrupt: + print("\nKeyboard interrupt received, exiting.") + server.server_close() + sys.exit(0) + +This ExampleService demo can be invoked from the command line:: + + python -m xmlrpc.server + + +The client that interacts with the above server is included in +`Lib/xmlrpc/client.py`:: + + server = ServerProxy("http://localhost:8000") + + try: + print(server.currentTime.getCurrentTime()) + except Error as v: + print("ERROR", v) + + multi = MultiCall(server) + multi.getData() + multi.pow(2,9) + multi.add(1,2) + try: + for response in multi(): + print(response) + except Error as v: + print("ERROR", v) + +This client which interacts with the demo XMLRPC server can be invoked as:: + + python -m xmlrpc.client + CGIXMLRPCRequestHandler ----------------------- diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py index 0f9522a..461c300 100644 --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -1460,18 +1460,18 @@ if __name__ == "__main__": # simple test program (from the XML-RPC specification) - # server = ServerProxy("http://localhost:8000") # local server - server = ServerProxy("http://time.xmlrpc.com/RPC2") + # local server, available from Lib/xmlrpc/server.py + server = ServerProxy("http://localhost:8000") try: print(server.currentTime.getCurrentTime()) except Error as v: print("ERROR", v) - # The server at xmlrpc.com doesn't seem to support multicall anymore. multi = MultiCall(server) - multi.currentTime.getCurrentTime() - multi.currentTime.getCurrentTime() + multi.getData() + multi.pow(2,9) + multi.add(1,2) try: for response in multi(): print(response) diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py index 78ca4e0..d27bf5a 100644 --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -967,10 +967,24 @@ class DocCGIXMLRPCRequestHandler( CGIXMLRPCRequestHandler, if __name__ == '__main__': + import datetime + + class ExampleService: + def getData(self): + return '42' + + class currentTime: + @staticmethod + def getCurrentTime(): + return datetime.datetime.now() + server = SimpleXMLRPCServer(("localhost", 8000)) server.register_function(pow) server.register_function(lambda x,y: x+y, 'add') + server.register_instance(ExampleService(), allow_dotted_names=True) + server.register_multicall_functions() print('Serving XML-RPC on localhost port 8000') + print('It is advisable to run this example server within a secure, closed network.') try: server.serve_forever() except KeyboardInterrupt: @@ -43,6 +43,9 @@ Core and Builtins Library ------- +- Issue #19082: Working xmlrpc.server and xmlrpc.client examples. Both in + modules and in documentation. Initial patch contributed by Vajrasky Kok. + - Issue #20138: The wsgiref.application_uri() and wsgiref.request_uri() functions now conform to PEP 3333 when handle non-ASCII URLs. |