diff --git a/Cargo.lock b/Cargo.lock index 651fdc22d..d727207cf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -356,6 +356,7 @@ dependencies = [ "futures-util", "impl-more", "itoa", + "jiff", "language-tags", "log", "mime", @@ -374,7 +375,6 @@ dependencies = [ "smallvec", "socket2 0.6.3", "static_assertions", - "time", "tokio", "tokio-util", "tracing", @@ -1813,10 +1813,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" dependencies = [ "jiff-static", + "jiff-tzdb-platform", "log", "portable-atomic", "portable-atomic-util", "serde_core", + "windows-sys 0.52.0", ] [[package]] @@ -1830,6 +1832,21 @@ dependencies = [ "syn", ] +[[package]] +name = "jiff-tzdb" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c900ef84826f1338a557697dc8fc601df9ca9af4ac137c7fb61d4c6f2dfd3076" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + [[package]] name = "jobserver" version = "0.1.34" diff --git a/actix-web/Cargo.toml b/actix-web/Cargo.toml index 13b5615f7..8fe020ea1 100644 --- a/actix-web/Cargo.toml +++ b/actix-web/Cargo.toml @@ -152,6 +152,7 @@ futures-core = { version = "0.3.17", default-features = false } futures-util = { version = "0.3.17", default-features = false } impl-more = "0.1.4" itoa = "1" +jiff = "0.2" language-tags = "0.3" log = "0.4" mime = "0.3" @@ -164,7 +165,6 @@ serde_json = "1.0" serde_urlencoded = "0.7" smallvec = "1.6.1" socket2 = "0.6" -time = { version = "0.3", default-features = false, features = ["formatting"] } tracing = "0.1.30" url = "2.5.4" diff --git a/actix-web/src/middleware/logger.rs b/actix-web/src/middleware/logger.rs index e258775c8..e80c98f2f 100644 --- a/actix-web/src/middleware/logger.rs +++ b/actix-web/src/middleware/logger.rs @@ -16,13 +16,13 @@ use actix_service::{Service, Transform}; use actix_utils::future::{ready, Ready}; use bytes::Bytes; use futures_core::ready; +use jiff::Timestamp; use log::{debug, warn, Level}; use pin_project_lite::pin_project; #[cfg(feature = "unicode")] use regex::Regex; #[cfg(not(feature = "unicode"))] use regex_lite::Regex; -use time::{format_description::well_known::Rfc3339, OffsetDateTime}; use crate::{ body::{BodySize, MessageBody}, @@ -330,13 +330,13 @@ where LoggerResponse { fut: self.service.call(req), format: None, - time: OffsetDateTime::now_utc(), + time: Timestamp::now(), log_target: Cow::Borrowed(""), log_level: self.inner.log_level, _phantom: PhantomData, } } else { - let now = OffsetDateTime::now_utc(); + let now = Timestamp::now(); let mut format = self.inner.format.clone(); for unit in &mut format.0 { @@ -363,7 +363,7 @@ pin_project! { { #[pin] fut: S::Future, - time: OffsetDateTime, + time: Timestamp, format: Option, log_target: Cow<'static, str>, log_level: Level, @@ -432,7 +432,7 @@ pin_project! { body: B, format: Option, size: usize, - time: OffsetDateTime, + time: Timestamp, log_target: Cow<'static, str>, log_level: Level } @@ -614,20 +614,18 @@ impl FormatText { &self, fmt: &mut fmt::Formatter<'_>, size: usize, - entry_time: OffsetDateTime, + entry_time: Timestamp, ) -> Result<(), fmt::Error> { match self { FormatText::Str(ref string) => fmt.write_str(string), FormatText::Percent => "%".fmt(fmt), FormatText::ResponseSize => size.fmt(fmt), FormatText::Time => { - let rt = OffsetDateTime::now_utc() - entry_time; - let rt = rt.as_seconds_f64(); + let rt = entry_time.duration_until(Timestamp::now()).as_secs_f64(); fmt.write_fmt(format_args!("{:.6}", rt)) } FormatText::TimeMillis => { - let rt = OffsetDateTime::now_utc() - entry_time; - let rt = (rt.whole_nanoseconds() as f64) / 1_000_000.0; + let rt = entry_time.duration_until(Timestamp::now()).as_millis_f64(); fmt.write_fmt(format_args!("{:.6}", rt)) } FormatText::EnvironHeader(ref name) => { @@ -669,7 +667,7 @@ impl FormatText { } } - fn render_request(&mut self, now: OffsetDateTime, req: &ServiceRequest) { + fn render_request(&mut self, now: Timestamp, req: &ServiceRequest) { match self { FormatText::RequestLine => { *self = if req.query_string().is_empty() { @@ -690,7 +688,7 @@ impl FormatText { }; } FormatText::UrlPath => *self = FormatText::Str(req.path().to_string()), - FormatText::RequestTime => *self = FormatText::Str(now.format(&Rfc3339).unwrap()), + FormatText::RequestTime => *self = FormatText::Str(now.to_string()), FormatText::RequestHeader(ref name) => { let s = if let Some(val) = req.headers().get(name) { String::from_utf8_lossy(val.as_bytes()).into_owned() @@ -805,7 +803,7 @@ mod tests { )) .to_srv_request(); - let now = OffsetDateTime::now_utc(); + let now = Timestamp::now(); for unit in &mut format.0 { unit.render_request(now, &req); } @@ -816,7 +814,7 @@ mod tests { unit.render_response(&res); } - let entry_time = OffsetDateTime::now_utc(); + let entry_time = Timestamp::now(); let render = |fmt: &mut fmt::Formatter<'_>| { for unit in &format.0 { unit.render(fmt, 1024, entry_time)?; @@ -838,7 +836,7 @@ mod tests { .uri("/test/route/yeah") .to_srv_request(); - let now = OffsetDateTime::now_utc(); + let now = Timestamp::now(); for unit in &mut format.0 { unit.render_request(now, &req); } @@ -871,7 +869,7 @@ mod tests { .peer_addr("127.0.0.1:8081".parse().unwrap()) .to_srv_request(); - let now = OffsetDateTime::now_utc(); + let now = Timestamp::now(); for unit in &mut format.0 { unit.render_request(now, &req); } @@ -882,7 +880,7 @@ mod tests { unit.render_response(&res); } - let entry_time = OffsetDateTime::now_utc(); + let entry_time = Timestamp::now(); let render = |fmt: &mut fmt::Formatter<'_>| { for unit in &format.0 { unit.render(fmt, 1024, entry_time)?; @@ -901,7 +899,7 @@ mod tests { let mut format = Format::new("%t"); let req = TestRequest::default().to_srv_request(); - let now = OffsetDateTime::now_utc(); + let now = Timestamp::now(); for unit in &mut format.0 { unit.render_request(now, &req); } @@ -919,7 +917,7 @@ mod tests { Ok(()) }; let s = format!("{}", FormatDisplay(&render)); - assert!(s.contains(&now.format(&Rfc3339).unwrap())); + assert!(s.contains(&now.to_string())); } #[actix_rt::test] @@ -933,7 +931,7 @@ mod tests { )) .to_srv_request(); - let now = OffsetDateTime::now_utc(); + let now = Timestamp::now(); for unit in &mut format.0 { unit.render_request(now, &req); } @@ -944,7 +942,7 @@ mod tests { unit.render_response(&res); } - let entry_time = OffsetDateTime::now_utc(); + let entry_time = Timestamp::now(); let render = |fmt: &mut fmt::Formatter<'_>| { for unit in &format.0 { unit.render(fmt, 1024, entry_time)?; @@ -971,7 +969,7 @@ mod tests { assert_eq!(label, "CUSTOM"); let req = TestRequest::default().to_srv_request(); - let now = OffsetDateTime::now_utc(); + let now = Timestamp::now(); unit.render_request(now, &req); @@ -1004,7 +1002,7 @@ mod tests { let req = TestRequest::default().to_http_request(); let resp_ok = ServiceResponse::new(req, HttpResponse::Ok().finish()); - let now = OffsetDateTime::now_utc(); + let now = Timestamp::now(); unit.render_response(&resp_ok); let render = |fmt: &mut fmt::Formatter<'_>| unit.render(fmt, 1024, now);