def _call_or_empty_with_error(call, req, msg, code=500, subcode=0): call = call or APICall("", remote_addr=req.remote_addr, headers=dict(req.headers), files=req.files) call.set_error_result(msg=msg, code=code, subcode=subcode) return call
def create_api_call(req): call = None try: # Parse the request path endpoint_version, endpoint_name = ServiceRepo.parse_endpoint_path(req.path) # Resolve authorization: if cookies contain an authorization token, use it as a starting point. # in any case, request headers always take precedence. auth_cookie = req.cookies.get( config.get("apiserver.auth.session_auth_cookie_name") ) headers = ( {} if not auth_cookie else {"Authorization": f"{AuthType.bearer_token} {auth_cookie}"} ) headers.update( list(req.headers.items()) ) # add (possibly override with) the headers # Construct call instance call = APICall( endpoint_name=endpoint_name, remote_addr=req.remote_addr, endpoint_version=endpoint_version, headers=headers, files=req.files, ) # Update call data from request with TimingContext("preprocess", "update_call_data"): update_call_data(call, req) except PathParsingError as ex: call = _call_or_empty_with_error(call, req, ex.args[0], 400) call.log_api = False except BadRequest as ex: call = _call_or_empty_with_error(call, req, ex.description, 400) except BaseError as ex: call = _call_or_empty_with_error(call, req, ex.msg, ex.code, ex.subcode) except Exception as ex: log.exception("Error creating call") call = _call_or_empty_with_error( call, req, ex.args[0] if ex.args else type(ex).__name__, 500 ) return call