use crate::{
middleware::{MiddleResult, Middleware},
Content, Header, HeaderType, Method, Request, Response,
};
pub struct Trace {
exclude_headers: Vec<HeaderType>,
}
impl Trace {
pub fn new() -> Self {
Self {
exclude_headers: vec![HeaderType::Cookie],
}
}
pub fn exclude(mut self, header: HeaderType) -> Self {
self.exclude_headers.push(header);
self
}
pub fn exclude_all(mut self, headers: &[HeaderType]) -> Self {
self.exclude_headers.extend_from_slice(headers);
self
}
pub fn include(mut self, header: HeaderType) -> Self {
self.exclude_headers.retain(|h| *h != header);
self
}
}
impl Middleware for Trace {
fn pre(&self, req: &mut Request) -> MiddleResult {
if req.method != Method::TRACE {
return MiddleResult::Continue;
}
let headers = req
.headers
.iter()
.filter(|h| !self.exclude_headers.contains(&h.name))
.map(Header::to_string)
.fold(String::new(), |acc, i| acc + &i + "\r\n");
let out = format!(
"{} {} {}\r\n{}\r\n\r\n",
req.method,
req.path,
req.version,
&headers[..headers.len() - 2]
);
MiddleResult::Send(
Response::new()
.text(out)
.content(Content::Custom("message/http")),
)
}
}
impl Default for Trace {
fn default() -> Self {
Self::new()
}
}