Loading codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt +0 −3 Original line number Diff line number Diff line Loading @@ -669,9 +669,6 @@ class ServerProtocolTestGenerator( FailingTest(RestJson, "RestJsonMalformedSetDuplicateItems", TestType.MalformedRequest), FailingTest(RestJson, "RestJsonMalformedSetNullItem", TestType.MalformedRequest), FailingTest(RestJson, "RestJsonHeaderMalformedStringInvalidBase64MediaType_case1", TestType.MalformedRequest), FailingTest(RestJson, "RestJsonBodyTimestampDefaultRejectsMalformedEpochSeconds_case5", TestType.MalformedRequest), FailingTest(RestJson, "RestJsonBodyTimestampDefaultRejectsMalformedEpochSeconds_case7", TestType.MalformedRequest), FailingTest(RestJson, "RestJsonBodyTimestampDefaultRejectsMalformedEpochSeconds_case9", TestType.MalformedRequest), FailingTest(RestJson, "RestJsonMalformedUnionNoFieldsSet", TestType.MalformedRequest), FailingTest(RestJson, "RestJsonMalformedSetDuplicateBlobs", TestType.MalformedRequest), Loading rust-runtime/aws-smithy-json/src/deserialize/token.rs +32 −3 Original line number Diff line number Diff line Loading @@ -216,9 +216,26 @@ pub fn expect_timestamp_or_null( timestamp_format: Format, ) -> Result<Option<DateTime>, Error> { Ok(match timestamp_format { Format::EpochSeconds => { expect_number_or_null(token)?.map(|v| DateTime::from_secs_f64(v.to_f64_lossy())) Format::EpochSeconds => expect_number_or_null(token)? .map(|v| v.to_f64_lossy()) .map(|v| { if v.is_nan() { Err(Error::new( ErrorReason::Custom(Cow::Owned("NaN is not a valid epoch".to_string())), None, )) } else if v.is_infinite() { Err(Error::new( ErrorReason::Custom(Cow::Owned( "Infinity is not a valid epoch".to_string(), )), None, )) } else { Ok(DateTime::from_secs_f64(v)) } }) .transpose()?, Format::DateTime | Format::HttpDate => expect_string_or_null(token)? .map(|v| DateTime::from_str(v.as_escaped_str(), timestamp_format)) .transpose() Loading Loading @@ -578,6 +595,18 @@ pub mod test { Ok(None), expect_timestamp_or_null(value_null(0), Format::HttpDate) ); for &invalid in &["NaN", "Infinity", "-Infinity"] { assert_eq!( Err(Error::new( ErrorReason::Custom(Cow::Owned(format!( "{} is not a valid epoch", invalid.replace("-", "") ))), None, )), expect_timestamp_or_null(value_string(0, invalid), Format::EpochSeconds) ); } assert_eq!( Ok(Some(DateTime::from_secs_f64(2048.0))), expect_timestamp_or_null(value_number(0, Number::Float(2048.0)), Format::EpochSeconds) Loading Loading
codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt +0 −3 Original line number Diff line number Diff line Loading @@ -669,9 +669,6 @@ class ServerProtocolTestGenerator( FailingTest(RestJson, "RestJsonMalformedSetDuplicateItems", TestType.MalformedRequest), FailingTest(RestJson, "RestJsonMalformedSetNullItem", TestType.MalformedRequest), FailingTest(RestJson, "RestJsonHeaderMalformedStringInvalidBase64MediaType_case1", TestType.MalformedRequest), FailingTest(RestJson, "RestJsonBodyTimestampDefaultRejectsMalformedEpochSeconds_case5", TestType.MalformedRequest), FailingTest(RestJson, "RestJsonBodyTimestampDefaultRejectsMalformedEpochSeconds_case7", TestType.MalformedRequest), FailingTest(RestJson, "RestJsonBodyTimestampDefaultRejectsMalformedEpochSeconds_case9", TestType.MalformedRequest), FailingTest(RestJson, "RestJsonMalformedUnionNoFieldsSet", TestType.MalformedRequest), FailingTest(RestJson, "RestJsonMalformedSetDuplicateBlobs", TestType.MalformedRequest), Loading
rust-runtime/aws-smithy-json/src/deserialize/token.rs +32 −3 Original line number Diff line number Diff line Loading @@ -216,9 +216,26 @@ pub fn expect_timestamp_or_null( timestamp_format: Format, ) -> Result<Option<DateTime>, Error> { Ok(match timestamp_format { Format::EpochSeconds => { expect_number_or_null(token)?.map(|v| DateTime::from_secs_f64(v.to_f64_lossy())) Format::EpochSeconds => expect_number_or_null(token)? .map(|v| v.to_f64_lossy()) .map(|v| { if v.is_nan() { Err(Error::new( ErrorReason::Custom(Cow::Owned("NaN is not a valid epoch".to_string())), None, )) } else if v.is_infinite() { Err(Error::new( ErrorReason::Custom(Cow::Owned( "Infinity is not a valid epoch".to_string(), )), None, )) } else { Ok(DateTime::from_secs_f64(v)) } }) .transpose()?, Format::DateTime | Format::HttpDate => expect_string_or_null(token)? .map(|v| DateTime::from_str(v.as_escaped_str(), timestamp_format)) .transpose() Loading Loading @@ -578,6 +595,18 @@ pub mod test { Ok(None), expect_timestamp_or_null(value_null(0), Format::HttpDate) ); for &invalid in &["NaN", "Infinity", "-Infinity"] { assert_eq!( Err(Error::new( ErrorReason::Custom(Cow::Owned(format!( "{} is not a valid epoch", invalid.replace("-", "") ))), None, )), expect_timestamp_or_null(value_string(0, invalid), Format::EpochSeconds) ); } assert_eq!( Ok(Some(DateTime::from_secs_f64(2048.0))), expect_timestamp_or_null(value_number(0, Number::Float(2048.0)), Format::EpochSeconds) Loading