diff options
Diffstat (limited to 'jsonrpclib/SimpleJSONRPCServer.py')
-rw-r--r-- | jsonrpclib/SimpleJSONRPCServer.py | 77 |
1 files changed, 42 insertions, 35 deletions
diff --git a/jsonrpclib/SimpleJSONRPCServer.py b/jsonrpclib/SimpleJSONRPCServer.py index a22ae7c..e6a46f3 100644 --- a/jsonrpclib/SimpleJSONRPCServer.py +++ b/jsonrpclib/SimpleJSONRPCServer.py @@ -1,20 +1,21 @@ -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 +import socket +import socketserver import sys +import traceback +import xmlrpc.server + try: import fcntl except ImportError: # For Windows fcntl = None +import jsonrpclib +from jsonrpclib import Fault +from jsonrpclib.jsonrpc import USE_UNIX_SOCKETS + def get_version(request): # must be a dict @@ -39,9 +40,8 @@ def validate_request(request): 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: + if not method or not isinstance(method, str) or \ + not isinstance(params, (list, dict, tuple)): fault = Fault( -32600, 'Invalid request parameters or method.', rpcid=rpcid ) @@ -49,17 +49,17 @@ def validate_request(request): return True -class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher): +class SimpleJSONRPCDispatcher(xmlrpc.server.SimpleXMLRPCDispatcher): def __init__(self, encoding=None): - SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__( + xmlrpc.server.SimpleXMLRPCDispatcher.__init__( self, allow_none=True, encoding=encoding) def _marshaled_dispatch(self, data, dispatch_method=None): response = None try: request = jsonrpclib.loads(data) - except Exception, e: + except Exception as e: fault = Fault(-32700, 'Request %s invalid. (%s)' % (data, e)) response = fault.response() return response @@ -97,7 +97,7 @@ class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher): params = request.get('params') try: response = self._dispatch(method, params) - except: + except Exception: exc_type, exc_value, exc_tb = sys.exc_info() fault = Fault(-32603, '%s:%s' % (exc_type, exc_value)) return fault.response() @@ -111,7 +111,7 @@ class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher): rpcid=request['id'] ) return response - except: + except Exception: exc_type, exc_value, exc_tb = sys.exc_info() fault = Fault(-32603, '%s:%s' % (exc_type, exc_value)) return fault.response() @@ -126,7 +126,7 @@ class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher): return self.instance._dispatch(method, params) else: try: - func = SimpleXMLRPCServer.resolve_dotted_attribute( + func = xmlrpc.server.resolve_dotted_attribute( self.instance, method, True @@ -135,14 +135,14 @@ class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher): pass if func is not None: try: - if isinstance(params, types.ListType): + if isinstance(params, list): response = func(*params) else: response = func(**params) return response # except TypeError: # return Fault(-32602, 'Invalid parameters.') - except: + except Exception: err_lines = traceback.format_exc().splitlines() trace_string = '%s | %s' % (err_lines[-3], err_lines[-1]) fault = jsonrpclib.Fault(-32603, 'Server error: %s' % @@ -153,7 +153,7 @@ class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher): class SimpleJSONRPCRequestHandler( - SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): + xmlrpc.server.SimpleXMLRPCRequestHandler): def do_POST(self): if not self.is_rpc_path_valid(): @@ -165,7 +165,8 @@ class SimpleJSONRPCRequestHandler( L = [] while size_remaining: chunk_size = min(size_remaining, max_chunk_size) - L.append(self.rfile.read(chunk_size)) + chunk = self.rfile.read(chunk_size).decode() + L.append(chunk) size_remaining -= len(L[-1]) data = ''.join(L) response = self.server._marshaled_dispatch(data) @@ -181,12 +182,20 @@ class SimpleJSONRPCRequestHandler( self.send_header("Content-type", "application/json-rpc") self.send_header("Content-length", str(len(response))) self.end_headers() - self.wfile.write(response) + if isinstance(response, bytes): + self.wfile.write(response) + else: + self.wfile.write(response.encode()) self.wfile.flush() self.connection.shutdown(1) -class SimpleJSONRPCServer(SocketServer.TCPServer, SimpleJSONRPCDispatcher): +class SimpleJSONRPCUnixRequestHandler(SimpleJSONRPCRequestHandler): + + disable_nagle_algorithm = False + + +class SimpleJSONRPCServer(socketserver.TCPServer, SimpleJSONRPCDispatcher): allow_reuse_address = True @@ -195,10 +204,8 @@ class SimpleJSONRPCServer(SocketServer.TCPServer, SimpleJSONRPCDispatcher): 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 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 @@ -208,12 +215,12 @@ class SimpleJSONRPCServer(SocketServer.TCPServer, SimpleJSONRPCDispatcher): 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) - else: - SocketServer.TCPServer.__init__( - self, addr, requestHandler, bind_and_activate) + + if requestHandler == SimpleJSONRPCRequestHandler: + requestHandler = SimpleJSONRPCUnixRequestHandler + + 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 @@ -227,9 +234,9 @@ class CGIJSONRPCRequestHandler(SimpleJSONRPCDispatcher): def handle_jsonrpc(self, request_text): response = self._marshaled_dispatch(request_text) - print 'Content-Type: application/json-rpc' - print 'Content-Length: %d' % len(response) - print + print('Content-Type: application/json-rpc') + print('Content-Length: %d' % len(response)) + print() sys.stdout.write(response) handle_xmlrpc = handle_jsonrpc |