Loading crates/s3s/src/http/de.rs +20 −8 Original line number Diff line number Diff line Loading @@ -146,6 +146,16 @@ fn malformed_xml(source: xml::DeError) -> S3Error { S3Error::with_source(S3ErrorCode::MalformedXML, Box::new(source)) } fn deserialize_xml<T>(bytes: &[u8]) -> S3Result<T> where T: for<'xml> xml::Deserialize<'xml>, { let mut d = xml::Deserializer::new(&bytes); let ans = T::deserialize(&mut d).map_err(malformed_xml)?; d.expect_eof().map_err(malformed_xml)?; Ok(ans) } pub fn take_xml_body<T>(req: &mut Request) -> S3Result<T> where T: for<'xml> xml::Deserialize<'xml>, Loading @@ -154,10 +164,11 @@ where if bytes.is_empty() { return Err(S3ErrorCode::MissingRequestBodyError.into()); } let mut d = xml::Deserializer::new(&bytes); let ans = T::deserialize(&mut d).map_err(malformed_xml)?; d.expect_eof().map_err(malformed_xml)?; Ok(ans) let result = deserialize_xml(&bytes); if result.is_err() { debug!(?bytes, "malformed xml body"); } result } pub fn take_opt_xml_body<T>(req: &mut Request) -> S3Result<Option<T>> Loading @@ -168,10 +179,11 @@ where if bytes.is_empty() { return Ok(None); } let mut d = xml::Deserializer::new(&bytes); let ans = T::deserialize(&mut d).map_err(malformed_xml)?; d.expect_eof().map_err(malformed_xml)?; Ok(Some(ans)) let result = deserialize_xml(&bytes).map(Some); if result.is_err() { debug!(?bytes, "malformed xml body"); } result } pub fn take_string_body(req: &mut Request) -> S3Result<String> { Loading crates/s3s/src/tests/xml.rs +13 −0 Original line number Diff line number Diff line Loading @@ -40,3 +40,16 @@ fn d001() { assert_eq!(parts[2].part_number, 3); assert_eq!(parts[2].e_tag.as_deref(), Some("\"acbd18db4cc2f85cedef654fccc4a4d8\"")); } #[test] fn d002() { use crate::dto::SelectObjectContentRequest; let input = read(concat!(DATA_DIR, "/d002.xml")); let ans = deserialize::<SelectObjectContentRequest>(&input).unwrap(); { let csv = ans.input_serialization.csv.as_ref().unwrap(); assert_eq!(csv.allow_quoted_record_delimiter, false); } } crates/s3s/src/tests/xml/d002.xml 0 → 100644 +21 −0 Original line number Diff line number Diff line <SelectObjectContentRequest xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Expression>select * from s3object</Expression> <ExpressionType>SQL</ExpressionType> <InputSerialization> <CompressionType>NONE</CompressionType> <CSV> <AllowQuotedRecordDelimiter>FALSE</AllowQuotedRecordDelimiter> <Comments>#</Comments> <FieldDelimiter>,</FieldDelimiter> <FileHeaderInfo>NONE</FileHeaderInfo> <QuoteCharacter>""</QuoteCharacter> <QuoteEscapeCharacter>"</QuoteEscapeCharacter> <RecordDelimiter>\n</RecordDelimiter> </CSV> </InputSerialization> <OutputSerialization> <JSON> <RecordDelimiter>\n</RecordDelimiter> </JSON> </OutputSerialization> </SelectObjectContentRequest> No newline at end of file crates/s3s/src/xml/de.rs +2 −0 Original line number Diff line number Diff line Loading @@ -332,6 +332,8 @@ impl<'xml> DeserializeContent<'xml> for bool { d.text(|t| match t.as_ref() { b"true" => Ok(true), b"false" => Ok(false), b"TRUE" => Ok(true), b"FALSE" => Ok(false), _ => Err(DeError::InvalidContent), }) } Loading Loading
crates/s3s/src/http/de.rs +20 −8 Original line number Diff line number Diff line Loading @@ -146,6 +146,16 @@ fn malformed_xml(source: xml::DeError) -> S3Error { S3Error::with_source(S3ErrorCode::MalformedXML, Box::new(source)) } fn deserialize_xml<T>(bytes: &[u8]) -> S3Result<T> where T: for<'xml> xml::Deserialize<'xml>, { let mut d = xml::Deserializer::new(&bytes); let ans = T::deserialize(&mut d).map_err(malformed_xml)?; d.expect_eof().map_err(malformed_xml)?; Ok(ans) } pub fn take_xml_body<T>(req: &mut Request) -> S3Result<T> where T: for<'xml> xml::Deserialize<'xml>, Loading @@ -154,10 +164,11 @@ where if bytes.is_empty() { return Err(S3ErrorCode::MissingRequestBodyError.into()); } let mut d = xml::Deserializer::new(&bytes); let ans = T::deserialize(&mut d).map_err(malformed_xml)?; d.expect_eof().map_err(malformed_xml)?; Ok(ans) let result = deserialize_xml(&bytes); if result.is_err() { debug!(?bytes, "malformed xml body"); } result } pub fn take_opt_xml_body<T>(req: &mut Request) -> S3Result<Option<T>> Loading @@ -168,10 +179,11 @@ where if bytes.is_empty() { return Ok(None); } let mut d = xml::Deserializer::new(&bytes); let ans = T::deserialize(&mut d).map_err(malformed_xml)?; d.expect_eof().map_err(malformed_xml)?; Ok(Some(ans)) let result = deserialize_xml(&bytes).map(Some); if result.is_err() { debug!(?bytes, "malformed xml body"); } result } pub fn take_string_body(req: &mut Request) -> S3Result<String> { Loading
crates/s3s/src/tests/xml.rs +13 −0 Original line number Diff line number Diff line Loading @@ -40,3 +40,16 @@ fn d001() { assert_eq!(parts[2].part_number, 3); assert_eq!(parts[2].e_tag.as_deref(), Some("\"acbd18db4cc2f85cedef654fccc4a4d8\"")); } #[test] fn d002() { use crate::dto::SelectObjectContentRequest; let input = read(concat!(DATA_DIR, "/d002.xml")); let ans = deserialize::<SelectObjectContentRequest>(&input).unwrap(); { let csv = ans.input_serialization.csv.as_ref().unwrap(); assert_eq!(csv.allow_quoted_record_delimiter, false); } }
crates/s3s/src/tests/xml/d002.xml 0 → 100644 +21 −0 Original line number Diff line number Diff line <SelectObjectContentRequest xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Expression>select * from s3object</Expression> <ExpressionType>SQL</ExpressionType> <InputSerialization> <CompressionType>NONE</CompressionType> <CSV> <AllowQuotedRecordDelimiter>FALSE</AllowQuotedRecordDelimiter> <Comments>#</Comments> <FieldDelimiter>,</FieldDelimiter> <FileHeaderInfo>NONE</FileHeaderInfo> <QuoteCharacter>""</QuoteCharacter> <QuoteEscapeCharacter>"</QuoteEscapeCharacter> <RecordDelimiter>\n</RecordDelimiter> </CSV> </InputSerialization> <OutputSerialization> <JSON> <RecordDelimiter>\n</RecordDelimiter> </JSON> </OutputSerialization> </SelectObjectContentRequest> No newline at end of file
crates/s3s/src/xml/de.rs +2 −0 Original line number Diff line number Diff line Loading @@ -332,6 +332,8 @@ impl<'xml> DeserializeContent<'xml> for bool { d.text(|t| match t.as_ref() { b"true" => Ok(true), b"false" => Ok(false), b"TRUE" => Ok(true), b"FALSE" => Ok(false), _ => Err(DeError::InvalidContent), }) } Loading