diff --git a/apub-reqwest/Cargo.toml b/apub-reqwest/Cargo.toml index 2f31c72..71b566a 100644 --- a/apub-reqwest/Cargo.toml +++ b/apub-reqwest/Cargo.toml @@ -13,9 +13,10 @@ edition = "2021" [dependencies] apub-core = { version = "0.2.0", path = "../apub-core/" } async-trait = "0.1.51" -http-signature-normalization-reqwest = { version = "0.2.1", default-features = false, features = ["digest"] } +http-signature-normalization-reqwest = { version = "0.3.0", default-features = false, features = ["digest", "middleware"] } httpdate = "1.0.2" reqwest = { version = "0.11.6", default-features = false, features = ["json"] } +reqwest-middleware = "0.1.2" serde = "1" serde_json = "1" thiserror = "1" diff --git a/apub-reqwest/src/lib.rs b/apub-reqwest/src/lib.rs index 3f1d336..9f6a7ce 100644 --- a/apub-reqwest/src/lib.rs +++ b/apub-reqwest/src/lib.rs @@ -12,10 +12,8 @@ use http_signature_normalization_reqwest::{ digest::{DigestCreate, SignExt}, prelude::{Sign as _, SignError}, }; -use reqwest::{ - header::{ACCEPT, CONTENT_TYPE, DATE}, - Client, -}; +use reqwest::header::{ACCEPT, CONTENT_TYPE, DATE}; +use reqwest_middleware::ClientWithMiddleware; use std::time::SystemTime; use url::Url; @@ -29,6 +27,7 @@ pub use http_signature_normalization_reqwest::Config as SignatureConfig; /// ```rust /// use apub_reqwest::{ReqwestClient, SignatureConfig}; /// use apub_rustcrypto::Rustcrypto; +/// use reqwest_middleware::ClientBuilder; /// use rsa::RsaPrivateKey; /// /// fn main() -> Result<(), Box> { @@ -37,13 +36,14 @@ pub use http_signature_normalization_reqwest::Config as SignatureConfig; /// let signature_config = SignatureConfig::default(); /// /// let client = reqwest::Client::new(); +/// let client = ClientBuilder::new(client).build(); /// /// let reqwest_client = ReqwestClient::new(client, signature_config, &crypto); /// Ok(()) /// } /// ``` pub struct ReqwestClient { - client: Client, + client: ClientWithMiddleware, config: SignatureConfig, crypto: Crypto, } @@ -75,6 +75,10 @@ pub enum ReqwestError { #[error(transparent)] Reqwest(#[from] reqwest::Error), + /// Middleware errors + #[error(transparent)] + Middleware(#[from] reqwest_middleware::Error), + /// Failed to serialize the json request body #[error(transparent)] Json(#[from] serde_json::Error), @@ -109,7 +113,7 @@ where SignTraitError: std::error::Error, { /// Create a new Client & Repo implementation backed by the reqwest client - pub fn new(client: Client, config: SignatureConfig, crypto: Crypto) -> Self { + pub fn new(client: ClientWithMiddleware, config: SignatureConfig, crypto: Crypto) -> Self { Self { client, config, @@ -124,7 +128,7 @@ where where Id: Dereference, { - let response = self + let request = self .client .get(url.as_str()) .header(ACCEPT, "application/activity+json") @@ -133,9 +137,9 @@ where let sign = self.crypto.signer(); move |signing_string| sign.sign(signing_string).map_err(SignatureError::Signer) - })? - .send() - .await?; + })?; + + let response = self.client.execute(request).await?; Ok(Some(response.json().await?)) } @@ -177,7 +181,7 @@ where async move { let activity_string = serde_json::to_string(activity)?; - let response = self + let request = self .client .post(inbox.as_str()) .header(CONTENT_TYPE, "application/activity+json") @@ -197,6 +201,8 @@ where ) .await?; + let response = self.client.execute(request).await?; + if !response.status().is_success() { return Err(ReqwestError::Status(response.status().as_u16())); } diff --git a/examples/reqwest-example/Cargo.toml b/examples/reqwest-example/Cargo.toml index 7c69a8b..411855e 100644 --- a/examples/reqwest-example/Cargo.toml +++ b/examples/reqwest-example/Cargo.toml @@ -10,4 +10,5 @@ apub = { version = "0.2.0", path = "../../", features = ["with-reqwest", "with-o example-types = { version = "0.1.0", path = "../example-types/" } openssl = "0.10.13" reqwest = "0.11.6" +reqwest-middleware = "0.1.2" tokio = { version = "1.14.0", features = ["full"] } diff --git a/examples/reqwest-example/src/main.rs b/examples/reqwest-example/src/main.rs index 3133057..5ab28f9 100644 --- a/examples/reqwest-example/src/main.rs +++ b/examples/reqwest-example/src/main.rs @@ -6,6 +6,7 @@ use apub::{ }; use example_types::{object_id, NoteType, ObjectId}; use openssl::{pkey::PKey, rsa::Rsa}; +use reqwest_middleware::ClientBuilder; use std::time::Duration; #[tokio::main] @@ -17,7 +18,7 @@ async fn main() -> Result<(), Box> { let mut breakers = BreakerSession::limit(10, Duration::from_secs(60 * 60)); let mut session = (RequestCountSession::max(30), &mut breakers); - let client = reqwest::Client::new(); + let client = ClientBuilder::new(reqwest::Client::new()).build(); let reqwest_client = ReqwestClient::new(client, config, &crypto);