diff options
Diffstat (limited to 'components/hyper_serde')
-rw-r--r-- | components/hyper_serde/Cargo.toml | 3 | ||||
-rw-r--r-- | components/hyper_serde/lib.rs | 24 | ||||
-rw-r--r-- | components/hyper_serde/tests/supported.rs | 5 | ||||
-rw-r--r-- | components/hyper_serde/tests/tokens.rs | 17 |
4 files changed, 28 insertions, 21 deletions
diff --git a/components/hyper_serde/Cargo.toml b/components/hyper_serde/Cargo.toml index 566027fc279..736eca035f5 100644 --- a/components/hyper_serde/Cargo.toml +++ b/components/hyper_serde/Cargo.toml @@ -16,6 +16,7 @@ doctest = false test = false [dependencies] +chrono = "0.4" cookie = { workspace = true } headers = { workspace = true } http = { workspace = true } @@ -23,7 +24,7 @@ hyper = { workspace = true } mime = { workspace = true } serde = { workspace = true } serde_bytes = { workspace = true } -time = { workspace = true } [dev-dependencies] serde_test = "1.0" +time = { workspace = true } diff --git a/components/hyper_serde/lib.rs b/components/hyper_serde/lib.rs index 4df1983ea7a..735f08cf44b 100644 --- a/components/hyper_serde/lib.rs +++ b/components/hyper_serde/lib.rs @@ -20,7 +20,7 @@ //! * `hyper::Method` //! * `hyper::Uri` //! * `mime::Mime` -//! * `time::Tm` +//! * `std::time::SystemTime` //! //! # How do I use a data type with a `HeaderMap` member with Serde? //! @@ -66,8 +66,10 @@ use std::ops::{Deref, DerefMut}; use std::str::FromStr; +use std::time::SystemTime; use std::{cmp, fmt, str}; +use chrono::{DateTime, SecondsFormat, Utc}; use cookie::Cookie; use headers::ContentType; use http::HeaderMap; @@ -78,7 +80,6 @@ use serde::de::{self, Error, MapAccess, SeqAccess, Visitor}; use serde::ser::{SerializeMap, SerializeSeq}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde_bytes::{ByteBuf, Bytes}; -use time::{strptime, Tm}; /// Deserialises a `T` value with a given deserializer. /// @@ -604,15 +605,15 @@ impl<'de> Visitor<'de> for StatusVisitor { } } -impl<'de> Deserialize<'de> for De<Tm> { +impl<'de> Deserialize<'de> for De<SystemTime> { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>, { - struct TmVisitor; + struct SystemTimeVisitor; - impl<'de> Visitor<'de> for TmVisitor { - type Value = De<Tm>; + impl<'de> Visitor<'de> for SystemTimeVisitor { + type Value = De<SystemTime>; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { write!(formatter, "a date and time according to RFC 3339") @@ -622,22 +623,23 @@ impl<'de> Deserialize<'de> for De<Tm> { where E: de::Error, { - strptime(v, "%Y-%m-%dT%H:%M:%SZ") - .map(De::new) + DateTime::parse_from_rfc3339(v) + .map(|t| De::new(SystemTime::from(t))) .map_err(|e| E::custom(e.to_string())) } } - deserializer.deserialize_string(TmVisitor) + deserializer.deserialize_string(SystemTimeVisitor) } } -impl<'a> Serialize for Ser<'a, Tm> { +impl<'a> Serialize for Ser<'a, SystemTime> { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { - serializer.serialize_str(&self.v.rfc3339().to_string()) + let date_time: DateTime<Utc> = self.v.clone().into(); + serializer.serialize_str(&date_time.to_rfc3339_opts(SecondsFormat::Secs, true)) } } diff --git a/components/hyper_serde/tests/supported.rs b/components/hyper_serde/tests/supported.rs index 54480903c7e..4eddd69adef 100644 --- a/components/hyper_serde/tests/supported.rs +++ b/components/hyper_serde/tests/supported.rs @@ -8,6 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +use std::time::SystemTime; + use cookie::Cookie; use headers::ContentType; use http::header::HeaderMap; @@ -15,7 +17,6 @@ use hyper::{Method, StatusCode, Uri}; use hyper_serde::{De, Ser, Serde}; use mime::Mime; use serde::{Deserialize, Serialize}; -use time::Tm; fn is_supported<T>() where @@ -33,6 +34,6 @@ fn supported() { is_supported::<Method>(); is_supported::<Mime>(); is_supported::<StatusCode>(); - is_supported::<Tm>(); + is_supported::<SystemTime>(); is_supported::<Uri>(); } diff --git a/components/hyper_serde/tests/tokens.rs b/components/hyper_serde/tests/tokens.rs index d7ad09f4e9c..2ba79ce3bb6 100644 --- a/components/hyper_serde/tests/tokens.rs +++ b/components/hyper_serde/tests/tokens.rs @@ -15,7 +15,6 @@ use http::StatusCode; use hyper::{Method, Uri}; use hyper_serde::{De, Ser}; use serde_test::{assert_de_tokens, assert_ser_tokens, Token}; -use time::Duration; #[test] fn test_content_type() { @@ -32,7 +31,7 @@ fn test_cookie() { // string with a bunch of indices in it which apparently is different from the exact same // cookie but parsed as a bunch of strings. let cookie: Cookie = Cookie::build("Hello", "World!") - .max_age(Duration::seconds(42)) + .max_age(time::Duration::seconds(42)) .domain("servo.org") .path("/") .secure(true) @@ -112,14 +111,18 @@ fn test_raw_status() { } #[test] -fn test_tm() { - use time::strptime; +fn test_system_time_serialization() { + use std::time::SystemTime; - let time = strptime("2017-02-22T12:03:31Z", "%Y-%m-%dT%H:%M:%SZ").unwrap(); - let tokens = &[Token::Str("2017-02-22T12:03:31Z")]; + use chrono::{NaiveDateTime, TimeZone, Utc}; + + let time = SystemTime::from(Utc.from_utc_datetime( + &NaiveDateTime::parse_from_str("2023-01-15T12:53:31Z", "%Y-%m-%dT%H:%M:%SZ").unwrap(), + )); + let tokens = &[Token::Str("2023-01-15T12:53:31Z")]; - assert_ser_tokens(&Ser::new(&time), tokens); assert_de_tokens(&De::new(time), tokens); + assert_ser_tokens(&Ser::new(&time), tokens); } #[test] |