diff options
author | Josh Marshall <catchjosh@gmail.com> | 2011-02-12 12:24:43 -0600 |
---|---|---|
committer | Josh Marshall <catchjosh@gmail.com> | 2011-02-12 12:24:43 -0600 |
commit | 6a66d6ccebd5ea147edb731137b1a22e1ee61d38 (patch) | |
tree | 15848528bb3e7e314dcdc2958a06fa041af06080 /jsonrpclib | |
parent | 1a566f9e69b6e8b42333124d7552b02cb000ff8e (diff) | |
parent | 84a762b19a301ec66c05d69d765d3db24bb7930b (diff) | |
download | jsonrpclib-6a66d6ccebd5ea147edb731137b1a22e1ee61d38.tar.gz |
Merge branch 'quentinmit-master'
Diffstat (limited to 'jsonrpclib')
-rw-r--r-- | jsonrpclib/SimpleJSONRPCServer.py | 14 | ||||
-rw-r--r-- | jsonrpclib/jsonrpc.py | 37 |
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() |