diff --git a/Cargo.lock b/Cargo.lock index b4479b1..ae2b968 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1552,9 +1552,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", ] @@ -1862,7 +1862,7 @@ dependencies = [ "opentelemetry", "opentelemetry-otlp", "pin-project-lite", - "quick-xml 0.30.0", + "quick-xml", "refinery", "reqwest", "reqwest-middleware", @@ -2065,16 +2065,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "quick-xml" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc053f057dd768a56f62cd7e434c42c831d296968997e9ac1f76ea7c2d14c41" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "quick-xml" version = "0.30.0" @@ -2420,15 +2410,15 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "rusty-s3" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c92776b0db0fea6d7cc3abb9d0d745814c71124471a3bfd84b1265a28c06130" +checksum = "31aa883f1b986a5249641e574ca0e11ac4fb9970b009c6fbb96fedaf4fa78db8" dependencies = [ "base64 0.21.4", "hmac", "md-5", "percent-encoding", - "quick-xml 0.27.1", + "quick-xml", "serde", "serde_json", "sha2", diff --git a/Cargo.toml b/Cargo.toml index c863b9e..1988e1f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,7 +44,7 @@ refinery = { version = "0.8.10", features = ["tokio-postgres", "postgres"] } reqwest = { version = "0.11.18", default-features = false, features = ["json", "rustls-tls", "stream"] } reqwest-middleware = "0.2.2" reqwest-tracing = { version = "0.4.5" } -rusty-s3 = "0.4.1" +rusty-s3 = "0.5.0" serde = { version = "1.0", features = ["derive"] } serde-tuple-vec-map = "1.0.1" serde_json = "1.0" diff --git a/src/store/object_store.rs b/src/store/object_store.rs index 2985e51..a5f9e56 100644 --- a/src/store/object_store.rs +++ b/src/store/object_store.rs @@ -15,7 +15,10 @@ use base64::{prelude::BASE64_STANDARD, Engine}; use futures_core::Stream; use reqwest::{header::RANGE, Body, Response}; use reqwest_middleware::{ClientWithMiddleware, RequestBuilder}; -use rusty_s3::{actions::S3Action, Bucket, BucketError, Credentials, UrlStyle}; +use rusty_s3::{ + actions::{CreateMultipartUpload, S3Action}, + Bucket, BucketError, Credentials, UrlStyle, +}; use std::{string::FromUtf8Error, sync::Arc, time::Duration}; use storage_path_generator::{Generator, Path}; use streem::IntoStreamer; @@ -122,16 +125,6 @@ pub(crate) struct ObjectStoreConfig { public_endpoint: Option, } -#[derive(serde::Deserialize, Debug)] -struct InitiateMultipartUploadResponse { - #[serde(rename = "Bucket")] - _bucket: String, - #[serde(rename = "Key")] - _key: String, - #[serde(rename = "UploadId")] - upload_id: String, -} - impl ObjectStoreConfig { pub(crate) fn build(self, client: ClientWithMiddleware) -> ObjectStore { ObjectStore { @@ -255,10 +248,9 @@ impl Store for ObjectStore { return Err(status_error(response).await); } - let body = response.bytes().await.map_err(ObjectError::Request)?; - let body: InitiateMultipartUploadResponse = - quick_xml::de::from_reader(&*body).map_err(ObjectError::from)?; - let upload_id = &body.upload_id; + let body = response.text().await.map_err(ObjectError::Request)?; + let body = CreateMultipartUpload::parse_response(&body).map_err(ObjectError::Xml)?; + let upload_id = body.upload_id(); // hack-ish: use async block as Result boundary let res = async { @@ -280,7 +272,7 @@ impl Store for ObjectStore { let this = self.clone(); let object_id2 = object_id.clone(); - let upload_id2 = upload_id.clone(); + let upload_id2 = upload_id.to_string(); let handle = crate::sync::spawn( async move { let response = this