use actix_web::{ client::ClientRequest, error::BlockingError, http::header::{InvalidHeaderValue, ToStrError}, }; use std::fmt::Display; use crate::{ digest::{DigestClient, DigestCreate, SignExt}, Config, Sign, }; #[async_trait::async_trait(?Send)] impl SignExt for ClientRequest { async fn authorization_signature_with_digest( self, config: &Config, key_id: K, digest: &mut D, v: V, f: F, ) -> Result, E> where F: FnOnce(&str) -> Result + Send + 'static, E: From> + From + From + std::fmt::Debug + Send + 'static, K: Display, D: DigestCreate, V: AsRef<[u8]>, Self: Sized, { let digest = digest.compute(v.as_ref()); self.set_header("Digest", format!("{}={}", D::NAME, digest)) .authorization_signature(config, key_id, f) .await .map(|c| DigestClient::new(c, v)) } async fn signature_with_digest( self, config: &Config, key_id: K, digest: &mut D, v: V, f: F, ) -> Result, E> where F: FnOnce(&str) -> Result + Send + 'static, E: From> + From + From + std::fmt::Debug + Send + 'static, K: Display, D: DigestCreate, V: AsRef<[u8]>, Self: Sized, { let digest = digest.compute(v.as_ref()); self.set_header("Digest", format!("{}={}", D::NAME, digest)) .signature(config, key_id, f) .await .map(|c| DigestClient::new(c, v)) } }