Source code for crossbar.bridge.rest.caller
#####################################################################################
#
# Copyright (c) typedef int GmbH
# SPDX-License-Identifier: EUPL-1.2
#
#####################################################################################
from autobahn.wamp.types import CallResult
from twisted.internet.defer import maybeDeferred
from crossbar._util import dump_json
from crossbar.bridge.rest.common import _CommonResource
__all__ = ("CallerResource",)
[docs]
class CallerResource(_CommonResource):
"""
A HTTP/POST to WAMP-Caller bridge.
"""
[docs]
def _process(self, request, event):
if "procedure" not in event:
return self._deny_request(request, 400, key="procedure", log_category="AR455")
procedure = event.pop("procedure")
args = event["args"] if "args" in event and event["args"] else []
kwargs = event["kwargs"] if "kwargs" in event and event["kwargs"] else {}
def _call(*args, **kwargs):
return self._session.call(*args, **kwargs)
d = maybeDeferred(_call, procedure, *args, **kwargs)
def on_call_ok(value):
# a WAMP procedure call result may have a single return value, but also
# multiple, positional return values as well as keyword-based return values
#
if isinstance(value, CallResult):
res = {}
if value.results:
res["args"] = value.results
if value.kwresults:
res["kwargs"] = value.kwresults
else:
res = {"args": [value]}
body = dump_json(res, True).encode("utf8")
return self._complete_request(request, 200, body, log_category="AR202")
def on_call_error(err):
# a WAMP procedure call returning with error should be forwarded
# to the HTTP-requestor still successfully
#
return self._fail_request(request, failure=err, log_category="AR458")
return d.addCallbacks(on_call_ok, on_call_error)