Skip to content

Commit e666326

Browse files
committed
add CompleteMultipartUploadResult
1 parent 1b67edd commit e666326

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

core/src/services/gcs/backend.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ impl Access for GcsBackend {
429429
}
430430

431431
let slc = resp.into_body();
432-
let m = GcsCore::get_metadata_from_response(path, slc)?;
432+
let m = GcsCore::build_metadata_from_object_response(path, slc)?;
433433

434434
Ok(RpStat::new(m))
435435
}

core/src/services/gcs/core.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ impl GcsCore {
647647
self.send(req).await
648648
}
649649

650-
pub fn get_metadata_from_response(path: &str, data: Buffer) -> Result<Metadata> {
650+
pub fn build_metadata_from_object_response(path: &str, data: Buffer) -> Result<Metadata> {
651651
let meta: GetObjectJsonResponse =
652652
serde_json::from_reader(data.reader()).map_err(new_json_deserialize_error)?;
653653

@@ -769,6 +769,16 @@ pub struct CompleteMultipartUploadRequestPart {
769769
pub etag: String,
770770
}
771771

772+
/// Response of Complete a multipart upload
773+
///
774+
/// refer to: https://cloud.google.com/storage/docs/xml-api/post-object-complete
775+
#[derive(Default, Debug, Deserialize)]
776+
#[serde(default, rename_all = "PascalCase")]
777+
pub struct CompleteMultipartUploadResult {
778+
#[serde(rename = "ETag")]
779+
pub etag: String,
780+
}
781+
772782
/// The raw json response returned by [`get`](https://cloud.google.com/storage/docs/json_api/v1/objects/get)
773783
#[derive(Debug, Default, Deserialize)]
774784
#[serde(default, rename_all = "camelCase")]
@@ -841,7 +851,7 @@ mod tests {
841851
}
842852
}"#;
843853

844-
let meta = GcsCore::get_metadata_from_response("1.png", content.into())
854+
let meta = GcsCore::build_metadata_from_object_response("1.png", content.into())
845855
.expect("parse metadata should not fail");
846856

847857
assert_eq!(meta.content_length(), 56535);

core/src/services/gcs/writer.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ use std::sync::Arc;
2020
use bytes::Buf;
2121
use http::StatusCode;
2222

23-
use super::core::CompleteMultipartUploadRequestPart;
2423
use super::core::GcsCore;
2524
use super::core::InitiateMultipartUploadResult;
25+
use super::core::{CompleteMultipartUploadRequestPart, CompleteMultipartUploadResult};
2626
use super::error::parse_error;
2727
use crate::raw::*;
2828
use crate::*;
@@ -63,7 +63,8 @@ impl oio::MultipartWrite for GcsWriter {
6363

6464
match status {
6565
StatusCode::CREATED | StatusCode::OK => {
66-
let metadata = GcsCore::get_metadata_from_response(&self.path, resp.into_body())?;
66+
let metadata =
67+
GcsCore::build_metadata_from_object_response(&self.path, resp.into_body())?;
6768
Ok(metadata)
6869
}
6970
_ => Err(parse_error(resp)),
@@ -142,7 +143,11 @@ impl oio::MultipartWrite for GcsWriter {
142143
if !resp.status().is_success() {
143144
return Err(parse_error(resp));
144145
}
145-
let metadata = GcsCore::get_metadata_from_response(&self.path, resp.into_body())?;
146+
let data: CompleteMultipartUploadResult =
147+
quick_xml::de::from_reader(resp.into_body().reader())
148+
.map_err(new_xml_deserialize_error)?;
149+
let mut metadata = Metadata::new(EntryMode::from_path(&self.path));
150+
metadata.set_etag(&data.etag);
146151
Ok(metadata)
147152
}
148153

0 commit comments

Comments
 (0)