From 56d0f6607ba5b62747ce9f663047e8774fdc36d5 Mon Sep 17 00:00:00 2001 From: Haze Booth Date: Tue, 2 Apr 2019 14:14:17 -0400 Subject: [PATCH] Add %R (Route) for logger --- src/middleware/logger.rs | 41 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/middleware/logger.rs b/src/middleware/logger.rs index d9c9b138a..369076cae 100644 --- a/src/middleware/logger.rs +++ b/src/middleware/logger.rs @@ -65,6 +65,8 @@ use crate::{HttpMessage, HttpResponse}; /// /// `%D` Time taken to serve the request, in milliseconds /// +/// `%R` Request route +/// /// `%{FOO}i` request.headers['FOO'] /// /// `%{FOO}o` response.headers['FOO'] @@ -272,7 +274,7 @@ impl Format { /// Returns `None` if the format string syntax is incorrect. pub fn new(s: &str) -> Format { log::trace!("Access log format: {}", s); - let fmt = Regex::new(r"%(\{([A-Za-z0-9\-_]+)\}([ioe])|[atPrsbTD]?)").unwrap(); + let fmt = Regex::new(r"%(\{([A-Za-z0-9\-_]+)\}([ioe])|[atPrRsbTD]?)").unwrap(); let mut idx = 0; let mut results = Vec::new(); @@ -300,6 +302,7 @@ impl Format { "r" => FormatText::RequestLine, "s" => FormatText::ResponseStatus, "b" => FormatText::ResponseSize, + "R" => FormatText::Route, "T" => FormatText::Time, "D" => FormatText::TimeMillis, _ => FormatText::Str(m.as_str().to_owned()), @@ -328,6 +331,7 @@ pub enum FormatText { Time, TimeMillis, RemoteAddr, + Route, RequestHeader(String), ResponseHeader(String), EnvironHeader(String), @@ -413,6 +417,12 @@ impl FormatText { )) }; } + FormatText::Route => { + *self = FormatText::Str(format!( + "{}", + req.path() + )) + } FormatText::RequestTime => { *self = FormatText::Str(format!( "{:?}", @@ -473,6 +483,35 @@ mod tests { let _res = block_on(srv.call(req)); } + #[test] + fn test_route() { + let mut format = Format::new("%T %R"); + let req = TestRequest::with_header( + header::USER_AGENT, + header::HeaderValue::from_static("ACTIX-WEB"), + ).uri("/test/route/yeah").to_srv_request(); + + let now = time::now(); + for unit in &mut format.0 { + unit.render_request(now, &req); + } + + let resp = HttpResponse::build(StatusCode::OK).force_close().finish(); + for unit in &mut format.0 { + unit.render_response(&resp); + } + + let render = |fmt: &mut Formatter| { + for unit in &format.0 { + unit.render(fmt, 1024, now)?; + } + Ok(()) + }; + let s = format!("{}", FormatDisplay(&render)); + println!("{}", s); + assert!(s.contains("/test/route/yeah")); + } + #[test] fn test_default_format() { let mut format = Format::default();