diff --git a/src/actix_web/inbox.rs b/src/actix_web/inbox.rs index b9c6379..ceca590 100644 --- a/src/actix_web/inbox.rs +++ b/src/actix_web/inbox.rs @@ -7,7 +7,8 @@ use crate::{ parse_received_activity, traits::{ActivityHandler, Actor, Object}, }; -use actix_web::{web::Bytes, HttpRequest, HttpResponse}; +use actix_web::{http::header::HeaderMap, web::Bytes, HttpRequest, HttpResponse}; +use http::{Method, Uri}; use serde::de::DeserializeOwned; use tracing::debug; @@ -27,16 +28,35 @@ where ::Error: From, Datatype: Clone, { - verify_body_hash(request.headers().get("Digest"), &body)?; + receive_activity_parts::( + (request.headers(), request.method(), request.uri()), + body, + data, + ) + .await +} + +/// Same as [receive_activity] but only takes the essential parts of [HttpResponse]. Necessary +/// in some cases because [HttpResponse] is not Sync. +pub async fn receive_activity_parts( + request_parts: (&HeaderMap, &Method, &Uri), + body: Bytes, + data: &Data, +) -> Result::Error> +where + Activity: ActivityHandler + DeserializeOwned + Send + 'static, + ActorT: Object + Actor + Send + 'static, + for<'de2> ::Kind: serde::Deserialize<'de2>, + ::Error: From + From<::Error>, + ::Error: From, + Datatype: Clone, +{ + let (headers, method, uri) = request_parts; + verify_body_hash(headers.get("Digest"), &body)?; let (activity, actor) = parse_received_activity::(&body, data).await?; - verify_signature( - request.headers(), - request.method(), - request.uri(), - actor.public_key_pem(), - )?; + verify_signature(headers, method, uri, actor.public_key_pem())?; debug!("Receiving activity {}", activity.id().to_string()); activity.verify(data).await?;