summaryrefslogtreecommitdiff
path: root/jsonrpclib/SimpleJSONRPCServer.py
diff options
context:
space:
mode:
Diffstat (limited to 'jsonrpclib/SimpleJSONRPCServer.py')
-rw-r--r--jsonrpclib/SimpleJSONRPCServer.py47
1 files changed, 26 insertions, 21 deletions
diff --git a/jsonrpclib/SimpleJSONRPCServer.py b/jsonrpclib/SimpleJSONRPCServer.py
index d76da73..3a0a3bb 100644
--- a/jsonrpclib/SimpleJSONRPCServer.py
+++ b/jsonrpclib/SimpleJSONRPCServer.py
@@ -15,6 +15,7 @@ except ImportError:
# For Windows
fcntl = None
+
def get_version(request):
# must be a dict
if 'jsonrpc' in request.keys():
@@ -22,9 +23,10 @@ def get_version(request):
if 'id' in request.keys():
return 1.0
return None
-
+
+
def validate_request(request):
- if type(request) is not types.DictType:
+ if not isinstance(request, dict):
fault = Fault(
-32600, 'Request must be {}, not %s.' % type(request)
)
@@ -33,27 +35,27 @@ def validate_request(request):
version = get_version(request)
if not version:
fault = Fault(-32600, 'Request %s invalid.' % request, rpcid=rpcid)
- return fault
+ return fault
request.setdefault('params', [])
method = request.get('method', None)
params = request.get('params')
param_types = (types.ListType, types.DictType, types.TupleType)
if not method or type(method) not in types.StringTypes or \
- type(params) not in param_types:
+ type(params) not in param_types:
fault = Fault(
-32600, 'Invalid request parameters or method.', rpcid=rpcid
)
return fault
return True
+
class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher):
def __init__(self, encoding=None):
- SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__(self,
- allow_none=True,
- encoding=encoding)
+ SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__(
+ self, allow_none=True, encoding=encoding)
- def _marshaled_dispatch(self, data, dispatch_method = None):
+ def _marshaled_dispatch(self, data, dispatch_method=None):
response = None
try:
request = jsonrpclib.loads(data)
@@ -64,7 +66,7 @@ class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher):
if not request:
fault = Fault(-32600, 'Request invalid -- no request data.')
return fault.response()
- if type(request) is types.ListType:
+ if isinstance(request, list):
# This SHOULD be a batch, by spec
responses = []
for req_entry in request:
@@ -79,7 +81,7 @@ class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher):
response = '[%s]' % ','.join(responses)
else:
response = ''
- else:
+ else:
result = validate_request(request)
if type(result) is Fault:
return result.response()
@@ -99,7 +101,7 @@ class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher):
exc_type, exc_value, exc_tb = sys.exc_info()
fault = Fault(-32603, '%s:%s' % (exc_type, exc_value))
return fault.response()
- if 'id' not in request.keys() or request['id'] == None:
+ if 'id' not in request.keys() or request['id'] is None:
# It's a notification
return None
try:
@@ -132,25 +134,26 @@ class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher):
pass
if func is not None:
try:
- if type(params) is types.ListType:
+ if isinstance(params, types.ListType):
response = func(*params)
else:
response = func(**params)
return response
- except TypeError:
- return Fault(-32602, 'Invalid parameters.')
+ # except TypeError:
+ # return Fault(-32602, 'Invalid parameters.')
except:
err_lines = traceback.format_exc().splitlines()
trace_string = '%s | %s' % (err_lines[-3], err_lines[-1])
- fault = jsonrpclib.Fault(-32603, 'Server error: %s' %
+ fault = jsonrpclib.Fault(-32603, 'Server error: %s' %
trace_string)
return fault
else:
return Fault(-32601, 'Method %s not supported.' % method)
+
class SimpleJSONRPCRequestHandler(
SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
-
+
def do_POST(self):
if not self.is_rpc_path_valid():
self.report_404()
@@ -166,13 +169,13 @@ class SimpleJSONRPCRequestHandler(
data = ''.join(L)
response = self.server._marshaled_dispatch(data)
self.send_response(200)
- except Exception, e:
+ except Exception:
self.send_response(500)
err_lines = traceback.format_exc().splitlines()
trace_string = '%s | %s' % (err_lines[-3], err_lines[-1])
fault = jsonrpclib.Fault(-32603, 'Server error: %s' % trace_string)
response = fault.response()
- if response == None:
+ if response is None:
response = ''
self.send_header("Content-type", "application/json-rpc")
self.send_header("Content-length", str(len(response)))
@@ -181,6 +184,7 @@ class SimpleJSONRPCRequestHandler(
self.wfile.flush()
self.connection.shutdown(1)
+
class SimpleJSONRPCServer(SocketServer.TCPServer, SimpleJSONRPCDispatcher):
allow_reuse_address = True
@@ -198,7 +202,7 @@ class SimpleJSONRPCServer(SocketServer.TCPServer, SimpleJSONRPCDispatcher):
# 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.
- if os.path.exists(addr):
+ if os.path.exists(addr):
try:
os.unlink(addr)
except OSError:
@@ -207,13 +211,14 @@ class SimpleJSONRPCServer(SocketServer.TCPServer, SimpleJSONRPCDispatcher):
if vi[0] < 3 and vi[1] < 6:
SocketServer.TCPServer.__init__(self, addr, requestHandler)
else:
- SocketServer.TCPServer.__init__(self, addr, requestHandler,
- bind_and_activate)
+ SocketServer.TCPServer.__init__(
+ self, addr, requestHandler, bind_and_activate)
if fcntl is not None and hasattr(fcntl, 'FD_CLOEXEC'):
flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD)
flags |= fcntl.FD_CLOEXEC
fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags)
+
class CGIJSONRPCRequestHandler(SimpleJSONRPCDispatcher):
def __init__(self, encoding=None):