use hyper::{header::AUTHORIZATION, Request};
use crate::{
error::VerificationError,
prelude::*,
verify::{SignedHeader, VerifyKey},
};
impl<B> VerifyHeader for Request<B> {
fn verify_signature_header(&self, key: VerifyKey) -> Result<(), VerificationError> {
let auth_header = self
.headers()
.get("Signature")
.ok_or(VerificationError::HeaderNotPresent)?
.to_str()
.map_err(|_| VerificationError::HeaderNotPresent)?;
verify_header(self, auth_header, key)
}
fn verify_authorization_header(&self, key: VerifyKey) -> Result<(), VerificationError> {
let ref auth_header = self
.headers()
.get(AUTHORIZATION)
.ok_or(VerificationError::HeaderNotPresent)?
.to_str()
.map_err(|_| VerificationError::HeaderNotPresent)?;
verify_header(self, auth_header, key)
}
}
fn verify_header<B>(
req: &Request<B>,
header: &str,
key: VerifyKey,
) -> Result<(), VerificationError> {
let auth_header = SignedHeader::new(header)?;
let headers: Vec<(&str, &str)> = req
.headers()
.iter()
.filter_map(|(header_name, header_value)| {
header_value
.to_str()
.ok()
.map(|header_value| (header_name.as_str(), header_value))
})
.collect();
auth_header.verify(
headers.as_ref(),
&req.method().as_ref().to_lowercase(),
req.uri().path(),
req.uri().query(),
key,
)
}