1
0
mirror of https://github.com/minio/minio-cpp.git synced 2025-04-18 08:24:00 +03:00

fix: correct multipart XML CompleteMultipartUploadResult (#183)

existing implementation was not parsing complete multipart
response properly.

Bonus: add support for new checksum fields
This commit is contained in:
Harshavardhana 2025-01-05 15:30:23 +05:30 committed by GitHub
parent 5a5533e4d5
commit 818d2036ac
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 23 additions and 7 deletions

View File

@ -153,6 +153,10 @@ struct CompleteMultipartUploadResponse : public Response {
std::string location;
std::string etag;
std::string version_id;
std::string checksumCRC32;
std::string checksumCRC32C;
std::string checksumSHA1;
std::string checksumSHA256;
CompleteMultipartUploadResponse() = default;

View File

@ -123,8 +123,7 @@ CompleteMultipartUploadResponse CompleteMultipartUploadResponse::ParseXML(
if (!result) {
return error::make<CompleteMultipartUploadResponse>("unable to parse XML");
}
auto root = xdoc.select_node("/CompleteMultipartUploadOutput");
auto root = xdoc.select_node("/CompleteMultipartUploadResult");
pugi::xpath_node text;
text = root.node().select_node("Bucket/text()");
@ -139,6 +138,18 @@ CompleteMultipartUploadResponse CompleteMultipartUploadResponse::ParseXML(
text = root.node().select_node("ETag/text()");
resp.etag = utils::Trim(text.node().value(), '"');
text = root.node().select_node("ChecksumCRC32/text()");
resp.checksumCRC32 = text.node().value();
text = root.node().select_node("ChecksumCRC32/text()");
resp.checksumCRC32C = text.node().value();
text = root.node().select_node("ChecksumSHA1/text()");
resp.checksumSHA1 = text.node().value();
text = root.node().select_node("ChecksumSHA256/text()");
resp.checksumSHA256 = text.node().value();
resp.version_id = version_id;
return resp;

View File

@ -461,9 +461,7 @@ class Tests {
std::string object_name = RandObjectName();
std::string data = "PutObject()";
std::stringstream ss(data);
minio::s3::PutObjectArgs args(
ss, static_cast<long>(data.length()),
0); // PWTODO: PutObjectArgs should accept size_t instead of long
minio::s3::PutObjectArgs args(ss, data.length(), 0);
args.bucket = bucket_name_;
args.object = object_name;
minio::s3::PutObjectResponse resp = client_.PutObject(args);
@ -475,9 +473,9 @@ class Tests {
{
std::string object_name = RandObjectName();
size_t size = 13930573;
size_t size = 67108865; // (64MiB + 1) bytes
RandCharStream stream(size);
minio::s3::PutObjectArgs args(stream, static_cast<long>(size), 0);
minio::s3::PutObjectArgs args(stream, size, 0);
args.bucket = bucket_name_;
args.object = object_name;
minio::s3::PutObjectResponse resp = client_.PutObject(args);
@ -485,6 +483,9 @@ class Tests {
throw std::runtime_error("<Multipart> PutObject(): " +
resp.Error().String());
}
if (resp.etag == "") {
throw std::runtime_error("<Multipart> PutObject(): etag is missing");
}
RemoveObject(bucket_name_, object_name);
}
}