Skip to content

Commit ef63fb9

Browse files
authored
fix(object_store): Include Content-MD5 header for S3 DeleteObjects (#5415)
* fix(object_store): Include Content-MD5 header for S3 DeleteObjects S3 API [specification](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html) requires the presence of this header for all `DeleteObjects` requests to general purpose buckets: > The Content-MD5 request header is required for all Multi-Object Delete requests Some platform, such as MinIO, enforce this requirement, failing requests that don't include the header. * Switch dependency from md5 to md-5 md-5 seems better maintained.
1 parent 5bb226c commit ef63fb9

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

object_store/Cargo.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ reqwest = { version = "0.11", default-features = false, features = ["rustls-tls-
5454
ring = { version = "0.17", default-features = false, features = ["std"], optional = true }
5555
rustls-pemfile = { version = "2.0", default-features = false, features = ["std"], optional = true }
5656
tokio = { version = "1.25.0", features = ["sync", "macros", "rt", "time", "io-util"] }
57+
md-5 = { version = "0.10.6", default-features = false, optional = true }
5758

5859
[target.'cfg(target_family="unix")'.dev-dependencies]
5960
nix = { version = "0.27.1", features = ["fs"] }
@@ -62,7 +63,7 @@ nix = { version = "0.27.1", features = ["fs"] }
6263
cloud = ["serde", "serde_json", "quick-xml", "hyper", "reqwest", "reqwest/json", "reqwest/stream", "chrono/serde", "base64", "rand", "ring"]
6364
azure = ["cloud"]
6465
gcp = ["cloud", "rustls-pemfile"]
65-
aws = ["cloud"]
66+
aws = ["cloud", "md-5"]
6667
http = ["cloud"]
6768
tls-webpki-roots = ["reqwest?/rustls-tls-webpki-roots"]
6869

object_store/src/aws/client.rs

+9
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ use bytes::{Buf, Bytes};
4343
use hyper::http;
4444
use hyper::http::HeaderName;
4545
use itertools::Itertools;
46+
use md5::{Digest, Md5};
4647
use percent_encoding::{utf8_percent_encode, PercentEncode};
4748
use quick_xml::events::{self as xml_events};
4849
use reqwest::{
@@ -438,6 +439,14 @@ impl S3Client {
438439
None
439440
};
440441

442+
// S3 *requires* DeleteObjects to include a Content-MD5 header:
443+
// https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html
444+
// > "The Content-MD5 request header is required for all Multi-Object Delete requests"
445+
// Some platforms, like MinIO, enforce this requirement and fail requests without the header.
446+
let mut hasher = Md5::new();
447+
hasher.update(&body);
448+
builder = builder.header("Content-MD5", BASE64_STANDARD.encode(hasher.finalize()));
449+
441450
let response = builder
442451
.header(CONTENT_TYPE, "application/xml")
443452
.body(body)

0 commit comments

Comments
 (0)