diff options
author | Josh Marshall <catchjosh@gmail.com> | 2011-02-26 14:01:40 -0600 |
---|---|---|
committer | Josh Marshall <catchjosh@gmail.com> | 2011-02-26 14:01:40 -0600 |
commit | 86551ed6358b39aff532462f1cbd6b89e61817d2 (patch) | |
tree | 610c0fe30589233640ea35c42382d159558d8a6d /jsonrpclib | |
parent | bcd9a5ca2ae751a057d967fc39c1841483cabbb8 (diff) | |
download | jsonrpclib-86551ed6358b39aff532462f1cbd6b89e61817d2.tar.gz |
Added minimal discovery for whether unix sockets are supported, and prevented access if they are missing.
Diffstat (limited to 'jsonrpclib')
-rw-r--r-- | jsonrpclib/SimpleJSONRPCServer.py | 13 | ||||
-rw-r--r-- | jsonrpclib/jsonrpc.py | 45 |
2 files changed, 40 insertions, 18 deletions
diff --git a/jsonrpclib/SimpleJSONRPCServer.py b/jsonrpclib/SimpleJSONRPCServer.py index 854697b..d76da73 100644 --- a/jsonrpclib/SimpleJSONRPCServer.py +++ b/jsonrpclib/SimpleJSONRPCServer.py @@ -1,8 +1,10 @@ import jsonrpclib from jsonrpclib import Fault +from jsonrpclib.jsonrpc import USE_UNIX_SOCKETS import SimpleXMLRPCServer import SocketServer import socket +import logging import os import types import traceback @@ -192,14 +194,15 @@ class SimpleJSONRPCServer(SocketServer.TCPServer, SimpleJSONRPCDispatcher): # 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: + if USE_UNIX_SOCKETS and 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 os.path.exists(addr): + try: + os.unlink(addr) + except OSError: + logging.warning("Could not unlink socket %s", addr) # 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 ae5c75f..0655e38 100644 --- a/jsonrpclib/jsonrpc.py +++ b/jsonrpclib/jsonrpc.py @@ -81,6 +81,12 @@ except ImportError: IDCHARS = string.ascii_lowercase+string.digits +class UnixSocketMissing(Exception): + """ + Just a properly named Exception if Unix Sockets usage is + attempted on a platform that doesn't support them (Windows) + """ + pass #JSON Abstractions @@ -147,22 +153,32 @@ 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) +from socket import socket + +USE_UNIX_SOCKETS = False + +try: + from socket import AF_UNIX, SOCK_STREAM + USE_UNIX_SOCKETS = True +except ImportError: + pass + +if (USE_UNIX_SOCKETS): + + 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 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 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): @@ -181,6 +197,9 @@ class ServerProxy(XMLServerProxy): if schema not in ('http', 'https', 'unix'): raise IOError('Unsupported JSON-RPC protocol.') if schema == 'unix': + if not USE_UNIX_SOCKETS: + # Don't like the "generic" Exception... + raise UnixSocketMissing("Unix sockets not available.") self.__host = uri self.__handler = '/' else: |