use std::io::Read;
use std::collections::HashMap;
use error::Error;
use super::{SignatureAlgorithm, REQUEST_TARGET};
use create::{AsHttpSignature, WithHttpSignature, HttpSignature};
use reqwest::Request as ReqwestRequest;
impl<T> AsHttpSignature<T> for ReqwestRequest
where
T: Read,
{
fn as_http_signature(
&self,
key_id: String,
key: T,
algorithm: SignatureAlgorithm,
) -> Result<HttpSignature<T>, Error> {
let mut headers = HashMap::new();
headers.insert(
REQUEST_TARGET.into(),
vec![
if let Some(ref query) = self.url().query() {
format!(
"{} {}?{}",
self.method().as_ref().to_lowercase(),
self.url().path(),
query
)
} else {
format!(
"{} {}",
self.method().as_ref().to_lowercase(),
self.url().path()
)
},
],
);
let headers = self.headers().iter().fold(headers, |mut acc, header_view| {
acc.entry(header_view.name().into())
.or_insert(Vec::new())
.push(header_view.value_string());
acc
});
HttpSignature::new(key_id, key, algorithm, headers).map_err(Error::from)
}
}
impl<T> WithHttpSignature<T> for ReqwestRequest
where
T: Read,
{
fn with_authorization_header(
&mut self,
key_id: String,
key: T,
algorithm: SignatureAlgorithm,
) -> Result<&mut Self, Error> {
use reqwest::header::Authorization;
let auth_header = self.authorization_header(key_id, key, algorithm)?;
self.headers_mut().set(Authorization(auth_header));
Ok(self)
}
fn with_signature_header(
&mut self,
key_id: String,
key: T,
algorithm: SignatureAlgorithm,
) -> Result<&mut Self, Error> {
let sig_header = self.signature_header(key_id, key, algorithm)?;
self.headers_mut().set_raw("Signature", sig_header);
Ok(self)
}
}