This commit is contained in:
@@ -18,7 +18,7 @@ class Response:
|
|||||||
|
|
||||||
def __json__(self):
|
def __json__(self):
|
||||||
response = {
|
response = {
|
||||||
"jsonrpc": "2.0",
|
"jsonrpc": "3.0",
|
||||||
"result": self.result,
|
"result": self.result,
|
||||||
"id": self.id,
|
"id": self.id,
|
||||||
}
|
}
|
||||||
@@ -26,7 +26,7 @@ class Response:
|
|||||||
|
|
||||||
|
|
||||||
class Method:
|
class Method:
|
||||||
def __init__(self, function, middlewares=[], debug: bool = False):
|
def __init__(self, function, middlewares=None, debug: bool = False):
|
||||||
self.function = function
|
self.function = function
|
||||||
self.middlewares = middlewares
|
self.middlewares = middlewares
|
||||||
self.debug = debug
|
self.debug = debug
|
||||||
@@ -126,51 +126,48 @@ class JSONRPC:
|
|||||||
method = self.methods[name]
|
method = self.methods[name]
|
||||||
sig = signature(method.function)
|
sig = signature(method.function)
|
||||||
|
|
||||||
|
result = {
|
||||||
|
"jsonrpc": "3.0",
|
||||||
|
"method": name,
|
||||||
|
"id": '00000000-0000-0000-0000-000000000000'
|
||||||
|
}
|
||||||
if len(sig.parameters) == 0:
|
if len(sig.parameters) == 0:
|
||||||
result = {
|
|
||||||
"jsonrpc": "2.0",
|
|
||||||
"method": name,
|
|
||||||
"id": 1
|
|
||||||
}
|
|
||||||
else:
|
|
||||||
params = {}
|
params = {}
|
||||||
for key in sig.parameters:
|
for key in sig.parameters:
|
||||||
params[key] = ''
|
params[key] = ''
|
||||||
result = {
|
result["params"] = params
|
||||||
"jsonrpc": "2.0",
|
|
||||||
"method": name,
|
|
||||||
"params": params,
|
|
||||||
"id": 1
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def validate(self, query):
|
def validate(self, query):
|
||||||
"""Валидация запроса
|
"""Валидация запроса
|
||||||
"""
|
"""
|
||||||
if 'method' not in query:
|
required = [
|
||||||
|
'id', 'method', 'jsonrpc'
|
||||||
|
]
|
||||||
|
for field in required:
|
||||||
|
if field not in query:
|
||||||
|
result = InvalidRequestError(
|
||||||
|
message=f'Некорректный запрос: {query}'
|
||||||
|
)
|
||||||
|
return result
|
||||||
|
if query['jsonrpc'] not in ['2.0', '3.0']:
|
||||||
result = InvalidRequestError(
|
result = InvalidRequestError(
|
||||||
message=f'Некорректный запрос: {query}'
|
message=f'Некорректный запрос: {query}'
|
||||||
)
|
)
|
||||||
if 'id' in query:
|
|
||||||
result.id = query['id']
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def process(self, query):
|
def process(self, query):
|
||||||
"""Выполнение метода
|
"""Выполнение метода
|
||||||
"""
|
"""
|
||||||
result = self.validate(query)
|
result = self.validate(query)
|
||||||
if isinstance(result, JSONRPCError):
|
if result:
|
||||||
return result
|
return result
|
||||||
name = query['method']
|
name = query['method']
|
||||||
if name not in self.methods:
|
if name not in self.methods:
|
||||||
if 'id' in query:
|
|
||||||
__id = query['id']
|
|
||||||
else:
|
|
||||||
__id = None
|
|
||||||
result = MethodNotFoundError(
|
result = MethodNotFoundError(
|
||||||
message=f'Метод не найден: {name}',
|
message=f'Метод не найден: {name}',
|
||||||
id=__id
|
id=query['id']
|
||||||
)
|
)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@@ -195,13 +192,10 @@ class JSONRPC:
|
|||||||
# message=traceback.format_exc()
|
# message=traceback.format_exc()
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
if 'id' in query:
|
response = Response(
|
||||||
response = Response(
|
id=query['id'],
|
||||||
id=query['id'],
|
result=response
|
||||||
result=response
|
)
|
||||||
)
|
|
||||||
else:
|
|
||||||
return
|
|
||||||
result = response
|
result = response
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|||||||
@@ -31,13 +31,14 @@ class Client:
|
|||||||
data=payload,
|
data=payload,
|
||||||
headers=self.headers
|
headers=self.headers
|
||||||
)
|
)
|
||||||
print('content', response.content)
|
if self.debug:
|
||||||
|
log.debug('content', response.content)
|
||||||
result = response.json()
|
result = response.json()
|
||||||
|
|
||||||
assert 'jsonrpc' in result
|
assert 'jsonrpc' in result
|
||||||
assert 'id' in result
|
assert 'id' in result
|
||||||
assert result["jsonrpc"] in ['2.0', '3.0']
|
assert result["jsonrpc"] in ['2.0', '3.0']
|
||||||
if '3.0' in result["jsonrpc"]:
|
# if '3.0' in result["jsonrpc"]:
|
||||||
assert 'meta' in result
|
# assert 'meta' in result
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -1,54 +1,60 @@
|
|||||||
__author__ = 'RemiZOffAlex'
|
__author__ = 'RemiZOffAlex'
|
||||||
__email__ = 'remizoffalex@mail.ru'
|
__email__ = 'remizoffalex@mail.ru'
|
||||||
|
|
||||||
|
ID = '00000000-0000-0000-0000-000000000000'
|
||||||
|
|
||||||
|
|
||||||
class JSONRPCError(Exception):
|
class JSONRPCError(Exception):
|
||||||
def __init__(self, id: int, message):
|
def __init__(self, message: str = "jsonrpc.error", id: str = ID):
|
||||||
pass
|
# pass
|
||||||
|
self.id = id
|
||||||
|
self.message = message
|
||||||
|
self.code = self.CODE
|
||||||
|
|
||||||
def __json__(self):
|
def __json__(self):
|
||||||
result = {
|
result = {
|
||||||
"jsonrpc": "2.0",
|
"jsonrpc": "3.0",
|
||||||
"id": self.id,
|
|
||||||
"error": {
|
"error": {
|
||||||
"code": self.CODE,
|
"code": self.CODE,
|
||||||
"message": self.message
|
"message": self.message
|
||||||
}
|
},
|
||||||
|
"id": self.id
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
class InvalidRequestError(JSONRPCError):
|
class InvalidRequestError(JSONRPCError):
|
||||||
CODE = -32600
|
CODE = "request.invalid"
|
||||||
|
|
||||||
def __init__(self, id: int, message: str = 'Invalid Request'):
|
def __init__(self, message: str = 'Invalid Request', id: str = ID):
|
||||||
self.id = id
|
|
||||||
self.message = message
|
|
||||||
self.code = CODE
|
|
||||||
|
|
||||||
|
|
||||||
class ParseError(JSONRPCError):
|
|
||||||
CODE = -32700
|
|
||||||
|
|
||||||
def __init__(self, id: int, message: str = 'Parse error'):
|
|
||||||
self.id = id
|
|
||||||
self.message = message
|
|
||||||
self.code = CODE
|
|
||||||
|
|
||||||
|
|
||||||
class MethodNotFoundError(JSONRPCError):
|
|
||||||
CODE = -32601
|
|
||||||
|
|
||||||
def __init__(self, id: int, message: str = 'Method not found'):
|
|
||||||
self.id = id
|
self.id = id
|
||||||
self.message = message
|
self.message = message
|
||||||
self.code = self.CODE
|
self.code = self.CODE
|
||||||
|
|
||||||
|
|
||||||
class InvalidParamsError(JSONRPCError):
|
class ParseError(JSONRPCError):
|
||||||
CODE = -32602
|
CODE = "parse.error"
|
||||||
|
|
||||||
def __init__(self, id: int, message: str = 'Invalid params'):
|
def __init__(self, message: str = 'Parse error', id = ID):
|
||||||
|
self.id = id
|
||||||
|
self.message = message
|
||||||
|
self.code = self.CODE
|
||||||
|
|
||||||
|
|
||||||
|
class MethodNotFoundError(JSONRPCError):
|
||||||
|
CODE = "method.notfound"
|
||||||
|
|
||||||
|
def __init__(self, message: str = 'Method not found', id = ID):
|
||||||
|
self.id = id
|
||||||
|
self.message = message
|
||||||
|
self.code = self.CODE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidParamsError(JSONRPCError):
|
||||||
|
CODE = "params.invalid"
|
||||||
|
|
||||||
|
def __init__(self, message: str = 'Invalid params', id = ID):
|
||||||
self.id = id
|
self.id = id
|
||||||
self.message = message
|
self.message = message
|
||||||
self.code = self.CODE
|
self.code = self.CODE
|
||||||
@@ -57,9 +63,9 @@ class InvalidParamsError(JSONRPCError):
|
|||||||
class InternalError(JSONRPCError):
|
class InternalError(JSONRPCError):
|
||||||
"""Internal JSON-RPC error
|
"""Internal JSON-RPC error
|
||||||
"""
|
"""
|
||||||
CODE = -32603
|
CODE = "internal.error"
|
||||||
|
|
||||||
def __init__(self, id: int, message: str = 'Internal error'):
|
def __init__(self, message: str = 'Internal error', id = ID):
|
||||||
self.id = id
|
self.id = id
|
||||||
self.message = message
|
self.message = message
|
||||||
self.code = self.CODE
|
self.code = self.CODE
|
||||||
@@ -67,12 +73,10 @@ class InternalError(JSONRPCError):
|
|||||||
|
|
||||||
class ServerError(JSONRPCError):
|
class ServerError(JSONRPCError):
|
||||||
"""Reserved for implementation-defined server-errors.
|
"""Reserved for implementation-defined server-errors.
|
||||||
|
|
||||||
code: -32000 to -32099 Server error.
|
|
||||||
"""
|
"""
|
||||||
CODE = -32000
|
CODE = "server.error"
|
||||||
|
|
||||||
def __init__(self, id: int, message: str = 'Server error'):
|
def __init__(self, message: str = 'Server error', id = ID):
|
||||||
self.id = id
|
self.id = id
|
||||||
self.message = message
|
self.message = message
|
||||||
self.code = self.CODE
|
self.code = self.CODE
|
||||||
|
|||||||
Reference in New Issue
Block a user