summaryrefslogtreecommitdiff
path: root/jsonrpclib
diff options
context:
space:
mode:
authorJosh Marshall <catchjosh@gmail.com>2011-02-12 12:24:43 -0600
committerJosh Marshall <catchjosh@gmail.com>2011-02-12 12:24:43 -0600
commit6a66d6ccebd5ea147edb731137b1a22e1ee61d38 (patch)
tree15848528bb3e7e314dcdc2958a06fa041af06080 /jsonrpclib
parent1a566f9e69b6e8b42333124d7552b02cb000ff8e (diff)
parent84a762b19a301ec66c05d69d765d3db24bb7930b (diff)
downloadjsonrpclib-6a66d6ccebd5ea147edb731137b1a22e1ee61d38.tar.gz
Merge branch 'quentinmit-master'
Diffstat (limited to 'jsonrpclib')
-rw-r--r--jsonrpclib/SimpleJSONRPCServer.py14
-rw-r--r--jsonrpclib/jsonrpc.py37
2 files changed, 43 insertions, 8 deletions
diff --git a/jsonrpclib/SimpleJSONRPCServer.py b/jsonrpclib/SimpleJSONRPCServer.py
index 370ae40..854697b 100644
--- a/jsonrpclib/SimpleJSONRPCServer.py
+++ b/jsonrpclib/SimpleJSONRPCServer.py
@@ -2,6 +2,8 @@ import jsonrpclib
from jsonrpclib import Fault
import SimpleXMLRPCServer
import SocketServer
+import socket
+import os
import types
import traceback
import sys
@@ -182,12 +184,22 @@ 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)
diff --git a/jsonrpclib/jsonrpc.py b/jsonrpclib/jsonrpc.py
index a5c37f2..ae5c75f 100644
--- a/jsonrpclib/jsonrpc.py
+++ b/jsonrpclib/jsonrpc.py
@@ -147,6 +147,23 @@ class Transport(TransportMixIn, XMLTransport):
class SafeTransport(TransportMixIn, XMLSafeTransport):
pass
+
+from httplib import HTTP, HTTPConnection
+from socket import socket, AF_UNIX, SOCK_STREAM
+class UnixHTTPConnection(HTTPConnection):
+ def connect(self):
+ self.sock = socket(AF_UNIX, SOCK_STREAM)
+ self.sock.connect(self.host)
+
+class UnixHTTP(HTTP):
+ _connection_class = UnixHTTPConnection
+
+class UnixTransport(TransportMixIn, XMLTransport):
+ def make_connection(self, host):
+ import httplib
+ host, extra_headers, x509 = self.get_host_info(host)
+ return UnixHTTP(host)
+
class ServerProxy(XMLServerProxy):
"""
@@ -161,15 +178,21 @@ class ServerProxy(XMLServerProxy):
version = config.version
self.__version = version
schema, uri = urllib.splittype(uri)
- if schema not in ('http', 'https'):
+ if schema not in ('http', 'https', 'unix'):
raise IOError('Unsupported JSON-RPC protocol.')
- self.__host, self.__handler = urllib.splithost(uri)
- if not self.__handler:
- # Not sure if this is in the JSON spec?
- #self.__handler = '/'
- self.__handler == '/'
+ if schema == 'unix':
+ self.__host = uri
+ self.__handler = '/'
+ else:
+ self.__host, self.__handler = urllib.splithost(uri)
+ if not self.__handler:
+ # Not sure if this is in the JSON spec?
+ #self.__handler = '/'
+ self.__handler == '/'
if transport is None:
- if schema == 'https':
+ if schema == 'unix':
+ transport = UnixTransport()
+ elif schema == 'https':
transport = SafeTransport()
else:
transport = Transport()