s3 0.1.36

A lean, modern, unofficial S3-compatible client for Rust.
Documentation
use std::io::Read;

use crate::error::{Error, Result};
use crate::transport::blocking_transport::{BlockingResponse, BlockingResponseBody};

pub(crate) fn read_body_bytes(body: BlockingResponseBody) -> Result<Vec<u8>> {
    let mut out = Vec::new();
    body.into_reader()
        .read_to_end(&mut out)
        .map_err(|e| Error::transport("failed to read response body", Some(Box::new(e))))?;
    Ok(out)
}

pub(crate) fn read_body_string(body: BlockingResponseBody) -> Result<String> {
    let bytes = read_body_bytes(body)?;
    crate::util::text::decode_utf8_response_body(&bytes)
}

pub(crate) fn read_response_error(resp: BlockingResponse) -> Result<Error> {
    let (parts, body) = resp.into_parts();
    let body = read_body_string(body)?;
    Ok(crate::transport::blocking_transport::response_error(
        parts.status,
        &parts.headers,
        &body,
    ))
}

pub(crate) fn parse_blocking_xml_response<T>(
    resp: BlockingResponse,
    parse: impl FnOnce(&str) -> Result<T>,
) -> Result<T> {
    let (parts, body) = resp.into_parts();
    let body = read_body_string(body)?;
    super::common::parse_xml_or_service_error(parts.status, &parts.headers, &body, parse)
}