[Python-checkins] cpython (3.3): Issue #19082: Working xmlrpc.server and xmlrpc.client examples. Both in modules

senthil.kumaran python-checkins at python.org
Mon Jan 13 01:08:15 CET 2014


http://hg.python.org/cpython/rev/72560f9bb2a2
changeset:   88432:72560f9bb2a2
branch:      3.3
parent:      88423:29732b43ccf2
user:        Senthil Kumaran <senthil at uthcode.com>
date:        Sun Jan 12 16:06:58 2014 -0800
summary:
  Issue #19082: Working xmlrpc.server and xmlrpc.client examples. Both in modules and in documentation.

files:
  Doc/library/xmlrpc.server.rst |  64 +++++++++++++++++++++++
  Lib/xmlrpc/client.py          |  10 +-
  Lib/xmlrpc/server.py          |  14 +++++
  Misc/NEWS                     |   3 +
  4 files changed, 86 insertions(+), 5 deletions(-)


diff --git a/Doc/library/xmlrpc.server.rst b/Doc/library/xmlrpc.server.rst
--- a/Doc/library/xmlrpc.server.rst
+++ b/Doc/library/xmlrpc.server.rst
@@ -184,6 +184,70 @@
    # 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
--- a/Lib/xmlrpc/client.py
+++ b/Lib/xmlrpc/client.py
@@ -1460,18 +1460,18 @@
 
     # 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
--- a/Lib/xmlrpc/server.py
+++ b/Lib/xmlrpc/server.py
@@ -967,10 +967,24 @@
 
 
 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:
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -43,6 +43,9 @@
 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.
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list