From a24f78f5a4c5d585568f1b676f8af6d20e793310 Mon Sep 17 00:00:00 2001 From: Alvaro Huarte Date: Mon, 18 Nov 2019 12:38:16 +0100 Subject: [PATCH] Adds requester_pays option to enable requests involving Requester Pays buckets --- src/curl.cpp | 5 +++++ src/curl.h | 3 +++ src/s3fs.cpp | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/src/curl.cpp b/src/curl.cpp index 06191bc..35c32fa 100644 --- a/src/curl.cpp +++ b/src/curl.cpp @@ -392,6 +392,7 @@ off_t S3fsCurl::multipart_size = MULTIPART_SIZE; // default bool S3fsCurl::is_sigv4 = true; // default bool S3fsCurl::is_ua = true; // default bool S3fsCurl::is_use_session_token = false; // default +bool S3fsCurl::requester_pays = false; // default //------------------------------------------------------------------- // Class methods for S3fsCurl @@ -2755,6 +2756,10 @@ void S3fsCurl::insertV4Headers() requestHeaders = curl_slist_sort_insert(requestHeaders, "x-amz-content-sha256", contentSHA256.c_str()); requestHeaders = curl_slist_sort_insert(requestHeaders, "x-amz-date", date8601.c_str()); + if (S3fsCurl::IsRequesterPays()) { + requestHeaders = curl_slist_sort_insert(requestHeaders, "x-amz-request-payer", "requester"); + } + if(!S3fsCurl::IsPublicBucket()){ string Signature = CalcSignature(op, realpath, query_string + (type == REQTYPE_PREMULTIPOST || type == REQTYPE_MULTILIST ? "=" : ""), strdate, contentSHA256, date8601); string auth = "AWS4-HMAC-SHA256 Credential=" + AWSAccessKeyId + "/" + strdate + "/" + endpoint + diff --git a/src/curl.h b/src/curl.h index b34f21b..5ccba90 100644 --- a/src/curl.h +++ b/src/curl.h @@ -301,6 +301,7 @@ class S3fsCurl static off_t multipart_size; static bool is_sigv4; static bool is_ua; // User-Agent + static bool requester_pays; // variables CURL* hCurl; @@ -477,6 +478,8 @@ class S3fsCurl static bool SetUserAgentFlag(bool isset) { bool bresult = S3fsCurl::is_ua; S3fsCurl::is_ua = isset; return bresult; } static bool IsUserAgentFlag(void) { return S3fsCurl::is_ua; } static void InitUserAgent(void); + static bool SetRequesterPays(bool flag) { bool old_flag = S3fsCurl::requester_pays; S3fsCurl::requester_pays = flag; return old_flag; } + static bool IsRequesterPays(void) { return S3fsCurl::requester_pays; } // methods bool CreateCurlHandle(bool only_pool = false, bool remake = false); diff --git a/src/s3fs.cpp b/src/s3fs.cpp index 959d33f..0f7c2a9 100644 --- a/src/s3fs.cpp +++ b/src/s3fs.cpp @@ -5062,6 +5062,10 @@ static int my_fuse_opt_proc(void* data, const char* arg, int key, struct fuse_ar use_wtf8 = true; return 0; } + if(0 == strcmp(arg, "requester_pays")){ + S3fsCurl::SetRequesterPays(true); + return 0; + } // [NOTE] // following option will be discarding, because these are not for fuse.