Newer
Older
async fn execute_call<M: Middleware>(c: Call<'_, M>) -> MethodResponse {
let Call { name, id, params, call } = c;
let CallData { resources, methods, middleware, max_response_body_size, max_log_length, conn_id, request_start } =
call;
let response = match methods.method_with_name(name) {
None => {
middleware.on_call(name, params.clone(), middleware::MethodKind::Unknown);
MethodResponse::error(id, ErrorObject::from(ErrorCode::MethodNotFound))
}
Some((name, method)) => match &method.inner() {
MethodKind::Sync(callback) => {
middleware.on_call(name, params.clone(), middleware::MethodKind::MethodCall);
match method.claim(name, resources) {
Ok(guard) => {
let r = (callback)(id, params, max_response_body_size as usize);
drop(guard);
r
}
Err(err) => {
tracing::error!("[Methods::execute_with_resources] failed to lock resources: {:?}", err);
MethodResponse::error(id, ErrorObject::from(ErrorCode::ServerIsBusy))
}
}
MethodKind::Async(callback) => {
middleware.on_call(name, params.clone(), middleware::MethodKind::MethodCall);
match method.claim(name, resources) {
Ok(guard) => {
let id = id.into_owned();
let params = params.into_owned();
(callback)(id, params, conn_id, max_response_body_size as usize, Some(guard)).await
}
Err(err) => {
tracing::error!("[Methods::execute_with_resources] failed to lock resources: {:?}", err);
MethodResponse::error(id, ErrorObject::from(ErrorCode::ServerIsBusy))
}
MethodKind::Subscription(_) | MethodKind::Unsubscription(_) => {
middleware.on_call(name, params.clone(), middleware::MethodKind::Unknown);
tracing::error!("Subscriptions not supported on HTTP");
MethodResponse::error(id, ErrorObject::from(ErrorCode::InternalError))
tx_log_from_str(&response.result, max_log_length);
middleware.on_result(name, response.success, request_start);
response