diff --git a/plume-common/src/activity_pub/mod.rs b/plume-common/src/activity_pub/mod.rs index 93c8b09a..b77d6ebf 100644 --- a/plume-common/src/activity_pub/mod.rs +++ b/plume-common/src/activity_pub/mod.rs @@ -2,9 +2,10 @@ use activitypub::{Activity, Actor, Object, Link}; use array_tool::vec::Uniq; use reqwest::Client; use rocket::{ + Outcome, http::Status, response::{Response, Responder}, - request::Request + request::{FromRequest, Request} }; use serde_json; @@ -59,6 +60,25 @@ impl<'r, O: Object> Responder<'r> for ActivityStream { } } +pub struct ApRequest; +impl<'a, 'r> FromRequest<'a, 'r> for ApRequest { + type Error = (); + + fn from_request(request: &'a Request<'r>) -> Outcome { + request.headers().get_one("Content-Type").map(|header| header.split(",").map(|ct| match ct { + "application/ld+json; profile=\"w3.org/ns/activitystreams\"" | + "application/ld+json;profile=\"w3.org/ns/activitystreams\"" | + "application/activity+json" | + "application/ld+json" => Outcome::Success(ApRequest), + _ => Outcome::Forward(()) + }).fold(Outcome::Forward(()), |out, ct| if out.is_success() { + out + } else { + ct + })).unwrap_or(Outcome::Forward(())) + } +} + pub fn broadcast(sender: &S, act: A, to: Vec) { let boxes = to.into_iter() .map(|u| u.get_shared_inbox_url().unwrap_or(u.get_inbox_url()))