Unverified Commit 2225bd82 authored by Nugine's avatar Nugine
Browse files

s3s: xml: de: fix bool

parent 3054f981
Loading
Loading
Loading
Loading
+20 −8
Original line number Diff line number Diff line
@@ -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>,
@@ -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>>
@@ -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> {
+13 −0
Original line number Diff line number Diff line
@@ -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);
    }
}
+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
+2 −0
Original line number Diff line number Diff line
@@ -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),
        })
    }