use qubit_function::{ArcMutatingFunction, MutatingFunction};
use url::Url;
use super::http_request::HttpRequest;
use crate::HttpResult;
pub type HttpRequestInterceptor = ArcMutatingFunction<HttpRequest, HttpResult<()>>;
#[derive(Debug, Clone, Default)]
pub struct HttpRequestInterceptors {
interceptors: Vec<HttpRequestInterceptor>,
}
impl HttpRequestInterceptors {
pub fn new() -> Self {
Self::default()
}
pub fn push(&mut self, interceptor: HttpRequestInterceptor) {
self.interceptors.push(interceptor);
}
pub fn clear(&mut self) {
self.interceptors.clear();
}
pub fn apply(&self, request: &mut HttpRequest) -> HttpResult<()> {
for interceptor in &self.interceptors {
interceptor.apply(request).map_err(|error| {
let mut mapped = error;
if mapped.method.is_none() {
mapped = mapped.with_method(request.method());
}
if mapped.url.is_none() {
if let Ok(resolved_url) = request.resolved_url_with_query() {
mapped = mapped.with_url(&resolved_url);
} else if let Ok(parsed_url) = Url::parse(request.path()) {
mapped = mapped.with_url(&parsed_url);
}
}
mapped
})?;
}
Ok(())
}
}