http-signature-normalization/http-signature-normalization-actix/src/digest/sign.rs

73 lines
1.8 KiB
Rust
Raw Normal View History

2019-09-13 01:12:35 +00:00
use actix_web::{
client::ClientRequest,
error::BlockingError,
2019-09-13 01:12:35 +00:00
http::header::{InvalidHeaderValue, ToStrError},
};
use std::fmt::Display;
use crate::{
digest::{DigestClient, DigestCreate, SignExt},
Config, Sign,
};
#[async_trait::async_trait(?Send)]
2019-09-13 01:12:35 +00:00
impl SignExt for ClientRequest {
async fn authorization_signature_with_digest<F, E, K, D, V>(
2019-09-13 01:12:35 +00:00
self,
config: &Config,
key_id: K,
digest: &mut D,
v: V,
f: F,
) -> Result<DigestClient<V>, E>
where
F: FnOnce(&str) -> Result<String, E> + Send + 'static,
E: From<BlockingError<E>>
+ From<ToStrError>
+ From<InvalidHeaderValue>
+ std::fmt::Debug
+ Send
+ 'static,
2019-09-13 01:12:35 +00:00
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
2019-09-13 01:12:35 +00:00
.map(|c| DigestClient::new(c, v))
}
async fn signature_with_digest<F, E, K, D, V>(
2019-09-13 01:12:35 +00:00
self,
config: &Config,
key_id: K,
digest: &mut D,
v: V,
f: F,
) -> Result<DigestClient<V>, E>
where
F: FnOnce(&str) -> Result<String, E> + Send + 'static,
E: From<BlockingError<E>>
+ From<ToStrError>
+ From<InvalidHeaderValue>
+ std::fmt::Debug
+ Send
+ 'static,
2019-09-13 01:12:35 +00:00
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
2019-09-13 01:12:35 +00:00
.map(|c| DigestClient::new(c, v))
}
}