use rocket::Request;
use crate::{
error::VerificationError,
prelude::*,
verify::{SignedHeader, VerifyKey},
};
impl<'r> VerifyHeader for Request<'r> {
fn verify_signature_header(&self, key: VerifyKey) -> Result<(), VerificationError> {
verify_header(self, "Signature", key)
}
fn verify_authorization_header(&self, key: VerifyKey) -> Result<(), VerificationError> {
verify_header(self, "Authorization", key)
}
}
fn verify_header<'r>(
req: &Request<'r>,
header: &str,
key: VerifyKey,
) -> Result<(), VerificationError> {
let auth_header = req
.headers()
.get_one(header)
.ok_or(VerificationError::HeaderNotPresent)?;
let auth_header = SignedHeader::new(auth_header)?;
let headers: Vec<(String, String)> = req
.headers()
.iter()
.map(|header| (header.name().into(), header.value().into()))
.collect();
let headers_borrowed: Vec<(&str, &str)> = headers
.iter()
.map(|&(ref key, ref val)| (key.as_ref(), val.as_ref()))
.collect();
auth_header.verify(
headers_borrowed.as_ref(),
req.method().as_str(),
req.uri().path(),
req.uri().query(),
key,
)
}