Allow the specification of address_family for JSONRPC servers, and
[invirt/packages/python-jsonrpclib.git] / jsonrpclib / SimpleJSONRPCServer.py
index 75193b2..854697b 100644 (file)
@@ -2,10 +2,16 @@ import jsonrpclib
 from jsonrpclib import Fault
 import SimpleXMLRPCServer
 import SocketServer
+import socket
+import os
 import types
 import traceback
-import fcntl
 import sys
+try:
+    import fcntl
+except ImportError:
+    # For Windows
+    fcntl = None
 
 def get_version(request):
     # must be a dict
@@ -173,18 +179,27 @@ class SimpleJSONRPCRequestHandler(
         self.wfile.flush()
         self.connection.shutdown(1)
 
-class SimpleJSONRPCServer(SocketServer.TCPServer,
-                         SimpleJSONRPCDispatcher):
+class SimpleJSONRPCServer(SocketServer.TCPServer, SimpleJSONRPCDispatcher):
 
     allow_reuse_address = True
 
     def __init__(self, addr, requestHandler=SimpleJSONRPCRequestHandler,
-                 logRequests=True, encoding=None, bind_and_activate=True):
+                 logRequests=True, encoding=None, bind_and_activate=True,
+                 address_family=socket.AF_INET):
         self.logRequests = logRequests
         SimpleJSONRPCDispatcher.__init__(self, encoding)
         # TCPServer.__init__ has an extra parameter on 2.6+, so
         # check Python version and decide on how to call it
         vi = sys.version_info
+        self.address_family = address_family
+        if address_family == socket.AF_UNIX:
+            # Unix sockets can't be bound if they already exist in the
+            # filesystem. The convention of e.g. X11 is to unlink
+            # before binding again.
+            try:
+                os.unlink(addr)
+            except OSError:
+                pass
         # if python 2.5 and lower
         if vi[0] < 3 and vi[1] < 6:
             SocketServer.TCPServer.__init__(self, addr, requestHandler)
@@ -209,10 +224,3 @@ class CGIJSONRPCRequestHandler(SimpleJSONRPCDispatcher):
         sys.stdout.write(response)
 
     handle_xmlrpc = handle_jsonrpc
-
-if __name__ == '__main__':
-    print 'Running JSON-RPC server on port 8000'
-    server = SimpleJSONRPCServer(("localhost", 8000))
-    server.register_function(pow)
-    server.register_function(lambda x,y: x+y, 'add')
-    server.serve_forever()