summaryrefslogtreecommitdiff
path: root/jsonrpclib
diff options
context:
space:
mode:
authorJosh Marshall <catchjosh@gmail.com>2011-02-26 14:01:40 -0600
committerJosh Marshall <catchjosh@gmail.com>2011-02-26 14:01:40 -0600
commit86551ed6358b39aff532462f1cbd6b89e61817d2 (patch)
tree610c0fe30589233640ea35c42382d159558d8a6d /jsonrpclib
parentbcd9a5ca2ae751a057d967fc39c1841483cabbb8 (diff)
downloadjsonrpclib-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.py13
-rw-r--r--jsonrpclib/jsonrpc.py45
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: