mirror of
https://git.asonix.dog/asonix/http-signature-normalization.git
synced 2024-06-10 17:29:26 +00:00
41 lines
1.3 KiB
Rust
41 lines
1.3 KiB
Rust
use http::{header::HeaderMap, Method};
|
|
pub use http_signature_normalization_http::{Config, verify::Unverified};
|
|
use std::{future::Future, pin::Pin};
|
|
use warp::{path::FullPath, Filter, Rejection};
|
|
|
|
pub fn verify<T>(
|
|
config: Config,
|
|
verifier: impl Fn(Unverified) -> Pin<Box<dyn Future<Output = Result<T, ()>> + Send>> + Clone + Send + Sync,
|
|
) -> impl Filter<Extract = (T,), Error = Rejection> + Clone
|
|
where
|
|
T: Send,
|
|
{
|
|
warp::any()
|
|
.map(move || config.clone())
|
|
.and(warp::header::headers_cloned())
|
|
.and(warp::method())
|
|
.and(warp::path::full())
|
|
.and(warp::query::raw())
|
|
.and_then(move |config, headers, method, path, query| {
|
|
do_verify(config, headers, method, path, query, verifier.clone())
|
|
})
|
|
}
|
|
|
|
async fn do_verify<T>(
|
|
config: Config,
|
|
headers: HeaderMap,
|
|
method: Method,
|
|
path: FullPath,
|
|
query: String,
|
|
verifier: impl Fn(Unverified) -> Pin<Box<dyn Future<Output = Result<T, ()>> + Send>>,
|
|
) -> Result<T, warp::Rejection> {
|
|
let path_and_query = format!("{}?{}", path.as_str(), query).parse().unwrap();
|
|
|
|
match config.begin_verify(&method, Some(&path_and_query), headers) {
|
|
Ok(v) => verifier(v)
|
|
.await
|
|
.map_err(|_| warp::reject::not_found()),
|
|
Err(_) => Err(warp::reject::not_found()),
|
|
}
|
|
}
|