Passed
Push — master ( 0d356b...652bd4 )
by Michael
11:41 queued 05:19
created

ws_client_for_server_response()   A

Complexity

Conditions 1

Size

Total Lines 6
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 6
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 1
nop 2
1
import logging
2
import typing
3
4
from . import errors, protocol, client
5
6
7
__all__ = (
8
    'exception_middleware',
9
    'extra_args_middleware',
10
    'logging_middleware',
11
    'ws_client_for_server_response',
12
    'DEFAULT_MIDDLEWARES',
13
)
14
15
logger = logging.getLogger(__name__)
16
17
18
async def extra_args_middleware(request: protocol.JsonRpcRequest, handler: typing.Callable) -> protocol.JsonRpcResponse:
19
    request.extra_args['rpc_request'] = request
20
    return await handler(request)
21
22
23
async def exception_middleware(request: protocol.JsonRpcRequest, handler: typing.Callable) -> protocol.JsonRpcResponse:
24
    try:
25
        response = await handler(request)
26
    except errors.JsonRpcError as e:
27
        logger.warning('Unprocessed errors.JsonRpcError', exc_info=True)
28
        response = protocol.JsonRpcResponse(
29
            id=request.id,
30
            jsonrpc=request.jsonrpc,
31
            error=e,
32
        )
33
    except Exception as e:
34
        logger.exception(e)
35
        response = protocol.JsonRpcResponse(
36
            id=request.id,
37
            jsonrpc=request.jsonrpc,
38
            error=errors.InternalError().with_traceback(),
39
        )
40
41
    return response
42
43
44
async def logging_middleware(request: protocol.JsonRpcRequest, handler: typing.Callable) -> protocol.JsonRpcResponse:
45
    raw_request = request.to_dict()
46
47
    logger.info(
48
        'RpcRequest id="%s" method="%s" params="%s"',
49
        raw_request.get('id', ''),
50
        raw_request['method'],
51
        raw_request.get('params', ''),
52
        extra={'request': raw_request},
53
    )
54
55
    response = await handler(request)
56
57
    raw_response = request.to_dict()
58
59
    logger.info(
60
        'RpcResponse id="%s" method="%s" params="%s" result="%s" error="%s"',
61
        raw_request.get('id', ''),
62
        raw_request['method'],
63
        raw_request.get('params', ''),
64
        raw_response.get('result', ''),
65
        raw_response.get('error', ''),
66
        extra={'request': raw_response, 'response': raw_response},
67
    )
68
69
    return response
70
71
72
async def ws_client_for_server_response(request: protocol.JsonRpcRequest,
73
                                        handler: typing.Callable) -> protocol.JsonRpcResponse:
74
    ws_connect = request.context['ws_connect']
75
    request.context['ws_client'] = client.WsJsonRpcClient(ws_connect=ws_connect)
76
    request.extra_args['rpc_ws_client'] = request.context['ws_client']
77
    return await handler(request)
78
79
80
DEFAULT_MIDDLEWARES = (
81
    exception_middleware,
82
    extra_args_middleware,
83
)
84