diff --git a/Cargo.lock b/Cargo.lock index 482db25c..5780ca65 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3737,9 +3737,9 @@ checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" [[package]] name = "quick-xml" -version = "0.26.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f50b1c63b38611e7d4d7f68b82d3ad0cc71a2ad2e7f61fc10f1328d917c93cd" +checksum = "f2e3bf4aa9d243beeb01a7b3bc30b77cfe2c44e24ec02d751a7104a53c2c49a1" dependencies = [ "memchr", "serde", diff --git a/Cargo.toml b/Cargo.toml index c6da24c5..f56999f7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -95,7 +95,7 @@ fjall = "2.11" async-compression = { version = "0.4", features = ["tokio", "zstd"] } zstd = { version = "0.13", default-features = false } -quick-xml = { version = "0.26", features = ["serialize"] } +quick-xml = { version = "0.39", features = ["serialize"] } rmp-serde = "1.3" serde = { version = "1.0", default-features = false, features = ["derive", "rc"] } serde_bytes = "0.11" diff --git a/src/api/s3/error.rs b/src/api/s3/error.rs index 58badf21..1b1a75f8 100644 --- a/src/api/s3/error.rs +++ b/src/api/s3/error.rs @@ -69,8 +69,16 @@ pub enum Error { InvalidUtf8String(#[from] std::string::FromUtf8Error), /// The client sent invalid XML data - #[error("Invalid XML: {0}")] - InvalidXml(String), + #[error("failed to deserialize XML")] + InvalidXml(#[from] roxmltree::Error), + + /// The client sent invalid XML data + #[error("XML deserialization failed")] + InvalidXmlDe(#[from] quick_xml::de::DeError), + + /// The server failed to serialize data into XML + #[error("failed to serialize XML")] + InvalidXmlSe(#[from] quick_xml::se::SeError), /// The client sent a range header with invalid value #[error("Invalid HTTP range: {0:?}")] @@ -105,18 +113,6 @@ impl From<(http_range::HttpRangeParseError, u64)> for Error { } } -impl From for Error { - fn from(err: roxmltree::Error) -> Self { - Self::InvalidXml(format!("{}", err)) - } -} - -impl From for Error { - fn from(err: quick_xml::de::DeError) -> Self { - Self::InvalidXml(format!("{}", err)) - } -} - impl From for Error { fn from(err: SignatureError) -> Self { match err { @@ -149,6 +145,8 @@ impl Error { Error::AuthorizationHeaderMalformed(_) => "AuthorizationHeaderMalformed", Error::NotImplemented(_) => "NotImplemented", Error::InvalidXml(_) => "MalformedXML", + Error::InvalidXmlDe(_) => "MalformedXML", + Error::InvalidXmlSe(_) => "InternalError", Error::InvalidRange(_) => "InvalidRange", Error::InvalidDigest(_) => "InvalidDigest", Error::InvalidUtf8Str(_) | Error::InvalidUtf8String(_) => "InvalidRequest", @@ -166,6 +164,7 @@ impl ApiError for Error { Error::PreconditionFailed => StatusCode::PRECONDITION_FAILED, Error::InvalidRange(_) => StatusCode::RANGE_NOT_SATISFIABLE, Error::NotImplemented(_) => StatusCode::NOT_IMPLEMENTED, + Error::InvalidXmlSe(_) => StatusCode::INTERNAL_SERVER_ERROR, Error::AuthorizationHeaderMalformed(_) | Error::InvalidPart | Error::InvalidPartOrder @@ -173,6 +172,7 @@ impl ApiError for Error { | Error::InvalidDigest(_) | Error::InvalidEncryptionAlgorithm(_) | Error::InvalidXml(_) + | Error::InvalidXmlDe(_) | Error::InvalidUtf8Str(_) | Error::InvalidUtf8String(_) => StatusCode::BAD_REQUEST, }