aiohttp_rpc.middlewares   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 83
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 6
eloc 58
dl 0
loc 83
rs 10
c 0
b 0
f 0

4 Functions

Rating   Name   Duplication   Size   Complexity  
A ws_client_for_server_response() 0 6 1
A extra_args_middleware() 0 3 1
A exception_middleware() 0 19 3
A logging_middleware() 0 26 1
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.dump()
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.dump()
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