Changeset View
Changeset View
Standalone View
Standalone View
swh/core/api/asynchronous.py
import json | import json | ||||
import logging | import logging | ||||
import pickle | import pickle | ||||
import sys | import sys | ||||
import traceback | import traceback | ||||
from collections import OrderedDict | from collections import OrderedDict | ||||
import multidict | import multidict | ||||
import aiohttp.web | import aiohttp.web | ||||
from deprecated import deprecated | from deprecated import deprecated | ||||
from .serializers import msgpack_dumps, msgpack_loads | from .serializers import msgpack_dumps, msgpack_loads | ||||
from .serializers import SWHJSONDecoder, SWHJSONEncoder | from .serializers import SWHJSONDecoder, SWHJSONEncoder | ||||
try: | |||||
from aiohttp_utils import negotiation, Response | from aiohttp_utils import negotiation, Response | ||||
except ImportError: | |||||
from aiohttp import Response | |||||
negotiation = None | |||||
def encode_msgpack(data, **kwargs): | def encode_msgpack(data, **kwargs): | ||||
return aiohttp.web.Response( | return aiohttp.web.Response( | ||||
body=msgpack_dumps(data), | body=msgpack_dumps(data), | ||||
headers=multidict.MultiDict( | headers=multidict.MultiDict( | ||||
{'Content-Type': 'application/x-msgpack'}), | {'Content-Type': 'application/x-msgpack'}), | ||||
**kwargs | **kwargs | ||||
) | ) | ||||
if negotiation is None: | |||||
encode_data_server = encode_msgpack | |||||
else: | |||||
encode_data_server = Response | encode_data_server = Response | ||||
def render_msgpack(request, data): | def render_msgpack(request, data): | ||||
return msgpack_dumps(data) | return msgpack_dumps(data) | ||||
def render_json(request, data): | def render_json(request, data): | ||||
return json.dumps(data, cls=SWHJSONEncoder) | return json.dumps(data, cls=SWHJSONEncoder) | ||||
Show All 27 Lines | async def middleware_handler(request): | ||||
'exception_pickled': pickle.dumps(e)} | 'exception_pickled': pickle.dumps(e)} | ||||
return encode_data_server(res, status=500) | return encode_data_server(res, status=500) | ||||
return middleware_handler | return middleware_handler | ||||
class RPCServerApp(aiohttp.web.Application): | class RPCServerApp(aiohttp.web.Application): | ||||
def __init__(self, *args, middlewares=(), **kwargs): | def __init__(self, *args, middlewares=(), **kwargs): | ||||
middlewares = (error_middleware,) + middlewares | middlewares = (error_middleware,) + middlewares | ||||
if negotiation: | |||||
# renderers are sorted in order of increasing desirability (!) | # renderers are sorted in order of increasing desirability (!) | ||||
# see mimeparse.best_match() docstring. | # see mimeparse.best_match() docstring. | ||||
renderers = OrderedDict([ | renderers = OrderedDict([ | ||||
('application/json', render_json), | ('application/json', render_json), | ||||
('application/x-msgpack', render_msgpack), | ('application/x-msgpack', render_msgpack), | ||||
]) | ]) | ||||
nego_middleware = negotiation.negotiation_middleware( | nego_middleware = negotiation.negotiation_middleware( | ||||
renderers=renderers, | renderers=renderers, | ||||
force_rendering=True) | force_rendering=True) | ||||
middlewares = (nego_middleware,) + middlewares | middlewares = (nego_middleware,) + middlewares | ||||
super().__init__(*args, middlewares=middlewares, **kwargs) | super().__init__(*args, middlewares=middlewares, **kwargs) | ||||
@deprecated(version='0.0.64', | @deprecated(version='0.0.64', | ||||
reason='Use the RPCServerApp instead') | reason='Use the RPCServerApp instead') | ||||
class SWHRemoteAPI(RPCServerApp): | class SWHRemoteAPI(RPCServerApp): | ||||
pass | pass |