summaryrefslogtreecommitdiff
path: root/jsonrpclib/SimpleJSONRPCServer.py
diff options
context:
space:
mode:
Diffstat (limited to 'jsonrpclib/SimpleJSONRPCServer.py')
-rw-r--r--jsonrpclib/SimpleJSONRPCServer.py39
1 files changed, 24 insertions, 15 deletions
diff --git a/jsonrpclib/SimpleJSONRPCServer.py b/jsonrpclib/SimpleJSONRPCServer.py
index 3a0a3bb..708c5d2 100644
--- a/jsonrpclib/SimpleJSONRPCServer.py
+++ b/jsonrpclib/SimpleJSONRPCServer.py
@@ -1,12 +1,15 @@
import jsonrpclib
from jsonrpclib import Fault
from jsonrpclib.jsonrpc import USE_UNIX_SOCKETS
-import SimpleXMLRPCServer
-import SocketServer
+try:
+ import xmlrpc.server as SimpleXMLRPCServer # Python 3.x
+ import socketserver as SocketServer
+except ImportError:
+ import SimpleXMLRPCServer # Python 2.7
+ import SocketServer
import socket
import logging
import os
-import types
import traceback
import sys
try:
@@ -15,6 +18,10 @@ except ImportError:
# For Windows
fcntl = None
+try:
+ basestring # Python 2.7
+except NameError:
+ basestring = str # Python 3.x
def get_version(request):
# must be a dict
@@ -39,9 +46,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, basestring) or \
+ not isinstance(params, (list, dict, tuple)):
fault = Fault(
-32600, 'Invalid request parameters or method.', rpcid=rpcid
)
@@ -59,7 +65,7 @@ class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher):
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
@@ -134,7 +140,7 @@ 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)
@@ -164,12 +170,13 @@ 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)
self.send_response(200)
- except Exception:
+ except Exception as ex:
self.send_response(500)
err_lines = traceback.format_exc().splitlines()
trace_string = '%s | %s' % (err_lines[-3], err_lines[-1])
@@ -180,7 +187,10 @@ 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)
@@ -218,7 +228,6 @@ class SimpleJSONRPCServer(SocketServer.TCPServer, SimpleJSONRPCDispatcher):
flags |= fcntl.FD_CLOEXEC
fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags)
-
class CGIJSONRPCRequestHandler(SimpleJSONRPCDispatcher):
def __init__(self, encoding=None):
@@ -226,9 +235,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