1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
use actix_web::{ client::ClientRequest, error::BlockingError, http::header::InvalidHeaderValue, web, }; use std::{fmt::Display, future::Future, pin::Pin}; use crate::{ digest::{DigestClient, DigestCreate, SignExt}, Config, PrepareSignError, Sign, }; impl SignExt for ClientRequest { fn authorization_signature_with_digest<F, E, K, D, V>( self, config: Config, key_id: K, mut digest: D, v: V, f: F, ) -> Pin<Box<dyn Future<Output = Result<DigestClient<V>, E>>>> where F: FnOnce(&str) -> Result<String, E> + Send + 'static, E: From<BlockingError<E>> + From<PrepareSignError> + From<InvalidHeaderValue> + std::fmt::Debug + Send + 'static, K: Display + 'static, D: DigestCreate + Send + 'static, V: AsRef<[u8]> + Send + 'static, Self: Sized, { Box::pin(async move { let (d, v) = web::block(move || { let d = digest.compute(v.as_ref()); Ok((d, v)) as Result<(String, V), E> }) .await?; let c = self .set_header("Digest", format!("{}={}", D::NAME, d)) .authorization_signature(config, key_id, f) .await?; Ok(DigestClient::new(c, v)) }) } fn signature_with_digest<F, E, K, D, V>( self, config: Config, key_id: K, mut digest: D, v: V, f: F, ) -> Pin<Box<dyn Future<Output = Result<DigestClient<V>, E>>>> where F: FnOnce(&str) -> Result<String, E> + Send + 'static, E: From<BlockingError<E>> + From<PrepareSignError> + From<InvalidHeaderValue> + std::fmt::Debug + Send + 'static, K: Display + 'static, D: DigestCreate + Send + 'static, V: AsRef<[u8]> + Send + 'static, Self: Sized, { Box::pin(async move { let (d, v) = web::block(move || { let d = digest.compute(v.as_ref()); Ok((d, v)) as Result<(String, V), E> }) .await?; let c = self .set_header("Digest", format!("{}={}", D::NAME, d)) .signature(config, key_id, f) .await?; Ok(DigestClient::new(c, v)) }) } }