From 25b01e09e7b6a29b91148ca3f68c1551fb37903a Mon Sep 17 00:00:00 2001 From: alytantawyy Date: Fri, 12 Jun 2026 13:42:55 -0700 Subject: [PATCH] GH-50148: [C++] Add Content-Encoding support to S3 filesystem metadata --- cpp/src/arrow/filesystem/s3fs.cc | 9 +++++++++ cpp/src/arrow/filesystem/s3fs_test.cc | 10 ++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/cpp/src/arrow/filesystem/s3fs.cc b/cpp/src/arrow/filesystem/s3fs.cc index 0c15f6f18444..de68c7196255 100644 --- a/cpp/src/arrow/filesystem/s3fs.cc +++ b/cpp/src/arrow/filesystem/s3fs.cc @@ -1301,6 +1301,7 @@ std::shared_ptr GetObjectMetadata(const ObjectResult& re md->Append("Content-Length", ToChars(result.GetContentLength())); push("Cache-Control", result.GetCacheControl()); + push("Content-Encoding", result.GetContentEncoding()); push("Content-Type", result.GetContentType()); push("Content-Language", result.GetContentLanguage()); push("ETag", result.GetETag()); @@ -1319,6 +1320,7 @@ struct ObjectMetadataSetter { static std::unordered_map GetSetters() { return {{"ACL", CannedACLSetter()}, {"Cache-Control", StringSetter(&ObjectRequest::SetCacheControl)}, + {"Content-Encoding", ContentEncodingSetter()}, {"Content-Type", ContentTypeSetter()}, {"Content-Language", StringSetter(&ObjectRequest::SetContentLanguage)}, {"Expires", DateTimeSetter(&ObjectRequest::SetExpires)}}; @@ -1359,6 +1361,13 @@ struct ObjectMetadataSetter { }; } + static Setter ContentEncodingSetter() { + return [](const std::string& str, ObjectRequest* req) { + req->SetContentEncoding(str); + return Status::OK(); + }; + } + static Result ParseACL(const std::string& v) { if (v.empty()) { return S3Model::ObjectCannedACL::NOT_SET; diff --git a/cpp/src/arrow/filesystem/s3fs_test.cc b/cpp/src/arrow/filesystem/s3fs_test.cc index 6be20603a8f3..7478baabebeb 100644 --- a/cpp/src/arrow/filesystem/s3fs_test.cc +++ b/cpp/src/arrow/filesystem/s3fs_test.cc @@ -1532,8 +1532,9 @@ TEST_F(TestS3FS, OpenOutputStreamMetadata) { testing::IsSupersetOf(implicit_metadata->sorted_pairs())); // Create new file with explicit metadata - auto metadata = KeyValueMetadata::Make({"Content-Type", "Expires"}, - {"x-arrow/test6", "2016-02-05T20:08:35Z"}); + auto metadata = KeyValueMetadata::Make( + {"Content-Encoding", "Content-Type", "Expires"}, + {"gzip", "x-arrow/test6", "2016-02-05T20:08:35Z"}); AssertMetadataRoundtrip("bucket/mdfile1", metadata, testing::IsSupersetOf(metadata->sorted_pairs())); @@ -1543,8 +1544,9 @@ TEST_F(TestS3FS, OpenOutputStreamMetadata) { AssertMetadataRoundtrip("bucket/mdfile2", metadata, testing::_); // Create new file with default metadata - auto default_metadata = KeyValueMetadata::Make({"Content-Type", "Content-Language"}, - {"image/png", "fr_FR"}); + auto default_metadata = KeyValueMetadata::Make( + {"Content-Encoding", "Content-Type", "Content-Language"}, + {"br", "image/png", "fr_FR"}); options_.default_metadata = default_metadata; MakeFileSystem(); // (null, then empty metadata argument)