mirror of
https://git.asonix.dog/asonix/http-signature-normalization.git
synced 2024-11-21 17:00:59 +00:00
Make use of body inspection rather than body mapping
This commit is contained in:
parent
ebeee051bf
commit
8acbcaea62
1 changed files with 18 additions and 19 deletions
|
@ -1,4 +1,4 @@
|
|||
use bytes::Buf;
|
||||
use bytes::BytesMut;
|
||||
use std::str::FromStr;
|
||||
use warp::{header, Filter, Rejection};
|
||||
|
||||
|
@ -36,31 +36,30 @@ pub enum ParseDigestError {
|
|||
#[error("Could not parse request body")]
|
||||
pub struct ParseBodyError;
|
||||
|
||||
pub fn verify<F>(
|
||||
pub fn verify(
|
||||
verifier: impl DigestVerify + Clone + Send + Sync + 'static,
|
||||
filter: F,
|
||||
) -> impl Filter<Extract = F::Extract, Error = Rejection> + Clone
|
||||
where
|
||||
F: Filter + Clone + Send + Sync + 'static,
|
||||
F::Extract: warp::Reply,
|
||||
F::Error: Into<Rejection>,
|
||||
{
|
||||
filter.with(
|
||||
warp::body::map_request_body(parse_digest_header(), move |body: hyper::body::Body, parts: (Vec<DigestPart>,)| {
|
||||
) -> impl Filter<Extract = ((),), Error = Rejection> + Clone {
|
||||
parse_digest_header()
|
||||
.and(warp::body::inspect_request_body(
|
||||
BytesMut::new(),
|
||||
move |mut acc, bytes| {
|
||||
let bytes = bytes.clone();
|
||||
async move {
|
||||
acc.extend_from_slice(&bytes);
|
||||
acc
|
||||
}
|
||||
},
|
||||
))
|
||||
.and_then(move |parts: Vec<DigestPart>, bytes_mut: BytesMut| {
|
||||
let mut verifier = verifier.clone();
|
||||
async move {
|
||||
let parts = parts.clone();
|
||||
let buf = hyper::body::aggregate(body).await.ok()?;
|
||||
let bytes: Vec<u8> = buf.bytes().to_owned();
|
||||
|
||||
if verifier.verify(&parts.0, &bytes) {
|
||||
Some(bytes.into())
|
||||
if verifier.verify(&parts, &bytes_mut.freeze()) {
|
||||
Ok(())
|
||||
} else {
|
||||
None
|
||||
Err(warp::reject::custom(VerifyError))
|
||||
}
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
fn parse_digest_header() -> impl Filter<Extract = (Vec<DigestPart>,), Error = Rejection> + Clone {
|
||||
|
|
Loading…
Reference in a new issue