You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by ga...@apache.org on 2020/04/08 23:01:02 UTC
[trafficserver] branch master updated: s3_auth_v4: multiple same
name fields signing fix
This is an automated email from the ASF dual-hosted git repository.
gancho pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push:
new e892afc s3_auth_v4: multiple same name fields signing fix
e892afc is described below
commit e892afc9b67381648017bb74be2201a856fcd19e
Author: Gancho Tenev <ga...@apache.org>
AuthorDate: Mon Apr 6 23:50:01 2020 -0700
s3_auth_v4: multiple same name fields signing fix
When signing multiple header fields with the same name AWS auth v4
seems to combine them into a single field by white-space trimming the
fields' values from the beginning and end and concatinating them by
using a comma in the order they are received. If same name header
fields already contain multiple values they are considered as a single
value headers during the trimming/concatenation.
This is undocumented behavior, discovered by reverse engineering
experiments, AWS signature calculation spec is not quite clear
about this case (unspecified, see CanonicalHeaders section):
https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html
---
plugins/s3_auth/aws_auth_v4.cc | 6 +-
plugins/s3_auth/aws_auth_v4.h | 1 +
plugins/s3_auth/unit_tests/test_aws_auth_v4.cc | 247 +++++++++++++++----------
plugins/s3_auth/unit_tests/test_aws_auth_v4.h | 6 +-
4 files changed, 156 insertions(+), 104 deletions(-)
diff --git a/plugins/s3_auth/aws_auth_v4.cc b/plugins/s3_auth/aws_auth_v4.cc
index 072a900..3f9aea0 100644
--- a/plugins/s3_auth/aws_auth_v4.cc
+++ b/plugins/s3_auth/aws_auth_v4.cc
@@ -385,7 +385,11 @@ getCanonicalRequestSha256Hash(TsInterface &api, bool signPayload, const StringSe
const char *trimValue = trimWhiteSpaces(value, valueLen, trimValueLen);
signedHeadersSet.insert(lowercaseName);
- headersMap[lowercaseName] = String(trimValue, trimValueLen);
+ if (headersMap.find(lowercaseName) == headersMap.end()) {
+ headersMap[lowercaseName] = String(trimValue, trimValueLen);
+ } else {
+ headersMap[lowercaseName].append(",").append(String(trimValue, trimValueLen));
+ }
}
for (const auto &it : signedHeadersSet) {
diff --git a/plugins/s3_auth/aws_auth_v4.h b/plugins/s3_auth/aws_auth_v4.h
index aa929de..865a199 100644
--- a/plugins/s3_auth/aws_auth_v4.h
+++ b/plugins/s3_auth/aws_auth_v4.h
@@ -36,6 +36,7 @@
typedef std::string String;
typedef std::set<std::string> StringSet;
typedef std::map<std::string, std::string> StringMap;
+typedef std::multimap<std::string, std::string> HeaderMultiMap;
class HeaderIterator;
diff --git a/plugins/s3_auth/unit_tests/test_aws_auth_v4.cc b/plugins/s3_auth/unit_tests/test_aws_auth_v4.cc
index 4bf58af..595fe00 100644
--- a/plugins/s3_auth/unit_tests/test_aws_auth_v4.cc
+++ b/plugins/s3_auth/unit_tests/test_aws_auth_v4.cc
@@ -405,10 +405,10 @@ TEST_CASE("AWSAuthSpecByExample: GET Object", "[AWS][auth][SpecByExample]")
api._host.assign("examplebucket.s3.amazonaws.com");
api._path.assign("test.txt");
api._query.assign("");
- api._headers["Host"] = "examplebucket.s3.amazonaws.com";
- api._headers["Range"] = "bytes=0-9";
- api._headers["x-amz-content-sha256"] = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
- api._headers["x-amz-date"] = "20130524T000000Z";
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("Range", "bytes=0-9"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
const char *bench[] = {
/* Authorization Header */
@@ -450,9 +450,9 @@ TEST_CASE("AWSAuthSpecByExample: GET Bucket Lifecycle", "[AWS][auth][SpecByExamp
api._host.assign("examplebucket.s3.amazonaws.com");
api._path.assign("");
api._query.assign("lifecycle");
- api._headers["Host"] = "examplebucket.s3.amazonaws.com";
- api._headers["x-amz-content-sha256"] = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
- api._headers["x-amz-date"] = "20130524T000000Z";
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
const char *bench[] = {
/* Authorization Header */
@@ -494,9 +494,9 @@ TEST_CASE("AWSAuthSpecByExample: Get Bucket List Objects", "[AWS][auth][SpecByEx
api._host.assign("examplebucket.s3.amazonaws.com");
api._path.assign("");
api._query.assign("max-keys=2&prefix=J");
- api._headers["Host"] = "examplebucket.s3.amazonaws.com";
- api._headers["x-amz-content-sha256"] = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
- api._headers["x-amz-date"] = "20130524T000000Z";
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
const char *bench[] = {
/* Authorization Header */
@@ -539,9 +539,9 @@ TEST_CASE("AWSAuthSpecByExample: GET Bucket List Objects, unsigned pay-load", "[
api._host.assign("examplebucket.s3.amazonaws.com");
api._path.assign("");
api._query.assign("max-keys=2&prefix=J");
- api._headers["Host"] = "examplebucket.s3.amazonaws.com";
- api._headers["x-amz-content-sha256"] = "UNSIGNED-PAYLOAD";
- api._headers["x-amz-date"] = "20130524T000000Z";
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "UNSIGNED-PAYLOAD"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
const char *bench[] = {
/* Authorization Header */
@@ -585,12 +585,13 @@ TEST_CASE("AWSAuthSpecByExample: GET Bucket List Objects, unsigned pay-load, exc
api._host.assign("examplebucket.s3.amazonaws.com");
api._path.assign("");
api._query.assign("max-keys=2&prefix=J");
- api._headers["Host"] = "examplebucket.s3.amazonaws.com";
- api._headers["x-amz-content-sha256"] = "UNSIGNED-PAYLOAD";
- api._headers["x-amz-date"] = "20130524T000000Z";
- api._headers["@internal"] = "internal value";
- api._headers["x-forwarded-for"] = "192.168.7.1";
- api._headers["via"] = "http/1.1 tcp ipv4 ats_dev[7e67ac60-c204-450d-90be-a426dd3b569f] (ApacheTrafficServer/7.2.0)";
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "UNSIGNED-PAYLOAD"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
+ api._headers.insert(std::make_pair("@internal", "internal value"));
+ api._headers.insert(std::make_pair("x-forwarded-for", "192.168.7.1"));
+ api._headers.insert(
+ std::make_pair("via", "http/1.1 tcp ipv4 ats_dev[7e67ac60-c204-450d-90be-a426dd3b569f] (ApacheTrafficServer/7.2.0)"));
const char *bench[] = {
/* Authorization Header */
@@ -633,9 +634,9 @@ TEST_CASE("AWSAuthSpecByExample: GET Bucket List Objects, query param value alre
api._host.assign("examplebucket.s3.amazonaws.com");
api._path.assign("PATH==");
api._query.assign("key=TEST==");
- api._headers["Host"] = "examplebucket.s3.amazonaws.com";
- api._headers["x-amz-content-sha256"] = "UNSIGNED-PAYLOAD";
- api._headers["x-amz-date"] = "20130524T000000Z";
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "UNSIGNED-PAYLOAD"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
const char *bench[] = {
/* Authorization Header */
@@ -669,7 +670,54 @@ TEST_CASE("AWSAuthSpecByExample: GET Bucket List Objects, query param value alre
ValidateBench(api, /*signePayload */ false, &now, bench, defaultIncludeHeaders, defaultExcludeHeaders);
}
-/* Utility parameters related tests ******************************************************************************** */
+TEST_CASE("S3AuthV4UtilParams: signing multiple same name fields", "[AWS][auth][utility]")
+{
+ time_t now = 1369353600; /* 5/24/2013 00:00:00 GMT */
+
+ /* Define the HTTP request elements */
+ MockTsInterface api;
+ api._method.assign("GET");
+ api._host.assign("examplebucket.s3.amazonaws.com");
+ api._path.assign("");
+ api._query.assign("max-keys=2&prefix=J");
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("Content-Type", "gzip"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "UNSIGNED-PAYLOAD"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
+ api._headers.insert(std::make_pair("HeaderA", "HeaderAValue"));
+ api._headers.insert(std::make_pair("HeaderB", "HeaderBValue1"));
+ api._headers.insert(std::make_pair("HeaderB", "HeaderBValue2"));
+ api._headers.insert(std::make_pair("HeaderC", " HeaderCValue1, HeaderCValue2 ")); // LWS between values
+ api._headers.insert(std::make_pair("HeaderC", "HeaderCValue3,HeaderCValue4")); // No LWS between values
+
+ const char *bench[] = {
+ /* Authorization Header */
+ "AWS4-HMAC-SHA256 "
+ "Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,"
+ "SignedHeaders=content-type;headera;headerb;headerc;host;x-amz-content-sha256;x-amz-date,"
+ "Signature=c9f57637044ddb0633430a8631f946a35d0ffff0cf7647aeaa2d0e985a69e674",
+
+ /* Canonical Request sha256 */
+ "e3429bb6a99fea0162c703ba6aaf771e16d2bb8f637c9300cd468fcbe1b66a0e",
+ /* Date and time*/
+ "20130524T000000Z",
+ /* String to sign */
+ "AWS4-HMAC-SHA256\n"
+ "20130524T000000Z\n"
+ "20130524/us-east-1/s3/aws4_request\n"
+ "e3429bb6a99fea0162c703ba6aaf771e16d2bb8f637c9300cd468fcbe1b66a0e",
+ /* Signature */
+ "c9f57637044ddb0633430a8631f946a35d0ffff0cf7647aeaa2d0e985a69e674",
+ /* Payload hash */
+ "UNSIGNED-PAYLOAD",
+ /* Signed Headers */
+ "content-type;headera;headerb;headerc;host;x-amz-content-sha256;x-amz-date",
+ };
+
+ ValidateBench(api, /*signePayload */ false, &now, bench, defaultIncludeHeaders, defaultExcludeHeaders);
+}
+
+///* Utility parameters related tests ******************************************************************************** */
void
ValidateBenchCanonicalRequest(TsInterface &api, bool signPayload, time_t *now, const char *bench[],
@@ -696,16 +744,16 @@ TEST_CASE("S3AuthV4UtilParams: include all headers by default", "[AWS][auth][uti
api._host.assign("examplebucket.s3.amazonaws.com");
api._path.assign("");
api._query.assign("max-keys=2&prefix=J");
- api._headers["Host"] = "examplebucket.s3.amazonaws.com";
- api._headers["Content-Type"] = "gzip";
- api._headers["x-amz-content-sha256"] = "UNSIGNED-PAYLOAD";
- api._headers["x-amz-date"] = "20130524T000000Z";
- api._headers["HeaderA"] = "HeaderAValue";
- api._headers["HeaderB"] = "HeaderBValue";
- api._headers["HeaderC"] = "HeaderCValue";
- api._headers["HeaderD"] = "HeaderDValue";
- api._headers["HeaderE"] = "HeaderEValue";
- api._headers["HeaderF"] = "HeaderFValue";
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("Content-Type", "gzip"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "UNSIGNED-PAYLOAD"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
+ api._headers.insert(std::make_pair("HeaderA", "HeaderAValue"));
+ api._headers.insert(std::make_pair("HeaderB", "HeaderBValue"));
+ api._headers.insert(std::make_pair("HeaderC", "HeaderCValue"));
+ api._headers.insert(std::make_pair("HeaderD", "HeaderDValue"));
+ api._headers.insert(std::make_pair("HeaderE", "HeaderEValue"));
+ api._headers.insert(std::make_pair("HeaderF", "HeaderFValue"));
StringSet include = defaultIncludeHeaders;
StringSet exclude = defaultExcludeHeaders;
@@ -730,16 +778,16 @@ TEST_CASE("S3AuthV4UtilParams: include all headers explicit", "[AWS][auth][SpecB
api._host.assign("examplebucket.s3.amazonaws.com");
api._path.assign("");
api._query.assign("max-keys=2&prefix=J");
- api._headers["Host"] = "examplebucket.s3.amazonaws.com";
- api._headers["Content-Type"] = "gzip";
- api._headers["x-amz-content-sha256"] = "UNSIGNED-PAYLOAD";
- api._headers["x-amz-date"] = "20130524T000000Z";
- api._headers["HeaderA"] = "HeaderAValue";
- api._headers["HeaderB"] = "HeaderBValue";
- api._headers["HeaderC"] = "HeaderCValue";
- api._headers["HeaderD"] = "HeaderDValue";
- api._headers["HeaderE"] = "HeaderEValue";
- api._headers["HeaderF"] = "HeaderFValue";
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("Content-Type", "gzip"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "UNSIGNED-PAYLOAD"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
+ api._headers.insert(std::make_pair("HeaderA", "HeaderAValue"));
+ api._headers.insert(std::make_pair("HeaderB", "HeaderBValue"));
+ api._headers.insert(std::make_pair("HeaderC", "HeaderCValue"));
+ api._headers.insert(std::make_pair("HeaderD", "HeaderDValue"));
+ api._headers.insert(std::make_pair("HeaderE", "HeaderEValue"));
+ api._headers.insert(std::make_pair("HeaderF", "HeaderFValue"));
StringSet include;
commaSeparateString<StringSet>(include, "HeaderA,HeaderB,HeaderC,HeaderD,HeaderE,HeaderF");
@@ -765,16 +813,16 @@ TEST_CASE("S3AuthV4UtilParams: exclude all headers explicit", "[AWS][auth][utili
api._host.assign("examplebucket.s3.amazonaws.com");
api._path.assign("");
api._query.assign("max-keys=2&prefix=J");
- api._headers["Host"] = "examplebucket.s3.amazonaws.com";
- api._headers["Content-Type"] = "gzip";
- api._headers["x-amz-content-sha256"] = "UNSIGNED-PAYLOAD";
- api._headers["x-amz-date"] = "20130524T000000Z";
- api._headers["HeaderA"] = "HeaderAValue";
- api._headers["HeaderB"] = "HeaderBValue";
- api._headers["HeaderC"] = "HeaderCValue";
- api._headers["HeaderD"] = "HeaderDValue";
- api._headers["HeaderE"] = "HeaderEValue";
- api._headers["HeaderF"] = "HeaderFValue";
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("Content-Type", "gzip"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "UNSIGNED-PAYLOAD"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
+ api._headers.insert(std::make_pair("HeaderA", "HeaderAValue"));
+ api._headers.insert(std::make_pair("HeaderB", "HeaderBValue"));
+ api._headers.insert(std::make_pair("HeaderC", "HeaderCValue"));
+ api._headers.insert(std::make_pair("HeaderD", "HeaderDValue"));
+ api._headers.insert(std::make_pair("HeaderE", "HeaderEValue"));
+ api._headers.insert(std::make_pair("HeaderF", "HeaderFValue"));
StringSet include = defaultIncludeHeaders;
StringSet exclude;
@@ -800,16 +848,15 @@ TEST_CASE("S3AuthV4UtilParams: include/exclude non overlapping headers", "[AWS][
api._host.assign("examplebucket.s3.amazonaws.com");
api._path.assign("");
api._query.assign("max-keys=2&prefix=J");
- api._headers["Host"] = "examplebucket.s3.amazonaws.com";
- api._headers["Content-Type"] = "gzip";
- api._headers["x-amz-content-sha256"] = "UNSIGNED-PAYLOAD";
- api._headers["x-amz-date"] = "20130524T000000Z";
- api._headers["HeaderA"] = "HeaderAValue";
- api._headers["HeaderB"] = "HeaderBValue";
- api._headers["HeaderC"] = "HeaderCValue";
- api._headers["HeaderD"] = "HeaderDValue";
- api._headers["HeaderE"] = "HeaderEValue";
- api._headers["HeaderF"] = "HeaderFValue";
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("Content-Type", "gzip"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "UNSIGNED-PAYLOAD"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
+ api._headers.insert(std::make_pair("HeaderA", "HeaderAValue"));
+ api._headers.insert(std::make_pair("HeaderB", "HeaderBValue"));
+ api._headers.insert(std::make_pair("HeaderC", "HeaderCValue"));
+ api._headers.insert(std::make_pair("HeaderD", "HeaderEValue"));
+ api._headers.insert(std::make_pair("HeaderF", "HeaderFValue"));
StringSet include, exclude;
commaSeparateString<StringSet>(include, "HeaderA,HeaderB,HeaderC");
@@ -835,16 +882,16 @@ TEST_CASE("S3AuthV4UtilParams: include/exclude overlapping headers", "[AWS][auth
api._host.assign("examplebucket.s3.amazonaws.com");
api._path.assign("");
api._query.assign("max-keys=2&prefix=J");
- api._headers["Host"] = "examplebucket.s3.amazonaws.com";
- api._headers["Content-Type"] = "gzip";
- api._headers["x-amz-content-sha256"] = "UNSIGNED-PAYLOAD";
- api._headers["x-amz-date"] = "20130524T000000Z";
- api._headers["HeaderA"] = "HeaderAValue";
- api._headers["HeaderB"] = "HeaderBValue";
- api._headers["HeaderC"] = "HeaderCValue";
- api._headers["HeaderD"] = "HeaderDValue";
- api._headers["HeaderE"] = "HeaderEValue";
- api._headers["HeaderF"] = "HeaderFValue";
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("Content-Type", "gzip"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "UNSIGNED-PAYLOAD"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
+ api._headers.insert(std::make_pair("HeaderA", "HeaderAValue"));
+ api._headers.insert(std::make_pair("HeaderB", "HeaderBValue"));
+ api._headers.insert(std::make_pair("HeaderC", "HeaderCValue"));
+ api._headers.insert(std::make_pair("HeaderD", "HeaderDValue"));
+ api._headers.insert(std::make_pair("HeaderE", "HeaderEValue"));
+ api._headers.insert(std::make_pair("HeaderF", "HeaderFValue"));
StringSet include, exclude;
commaSeparateString<StringSet>(include, "HeaderA,HeaderB,HeaderC");
@@ -870,16 +917,16 @@ TEST_CASE("S3AuthV4UtilParams: include/exclude overlapping headers missing inclu
api._host.assign("examplebucket.s3.amazonaws.com");
api._path.assign("");
api._query.assign("max-keys=2&prefix=J");
- api._headers["Host"] = "examplebucket.s3.amazonaws.com";
- api._headers["Content-Type"] = "gzip";
- api._headers["x-amz-content-sha256"] = "UNSIGNED-PAYLOAD";
- api._headers["x-amz-date"] = "20130524T000000Z";
- api._headers["HeaderA"] = "HeaderAValue";
- api._headers["HeaderB"] = "HeaderBValue";
- api._headers["HeaderC"] = "HeaderCValue";
- api._headers["HeaderD"] = "HeaderDValue";
- api._headers["HeaderE"] = "HeaderEValue";
- api._headers["HeaderF"] = "HeaderFValue";
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("Content-Type", "gzip"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "UNSIGNED-PAYLOAD"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
+ api._headers.insert(std::make_pair("HeaderA", "HeaderAValue"));
+ api._headers.insert(std::make_pair("HeaderB", "HeaderBValue"));
+ api._headers.insert(std::make_pair("HeaderC", "HeaderCValue"));
+ api._headers.insert(std::make_pair("HeaderD", "HeaderDValue"));
+ api._headers.insert(std::make_pair("HeaderE", "HeaderEValue"));
+ api._headers.insert(std::make_pair("HeaderF", "HeaderFValue"));
StringSet include, exclude;
commaSeparateString<StringSet>(include, "HeaderA,HeaderC");
@@ -905,16 +952,16 @@ TEST_CASE("S3AuthV4UtilParams: include/exclude overlapping headers missing exclu
api._host.assign("examplebucket.s3.amazonaws.com");
api._path.assign("");
api._query.assign("max-keys=2&prefix=J");
- api._headers["Host"] = "examplebucket.s3.amazonaws.com";
- api._headers["Content-Type"] = "gzip";
- api._headers["x-amz-content-sha256"] = "UNSIGNED-PAYLOAD";
- api._headers["x-amz-date"] = "20130524T000000Z";
- api._headers["HeaderA"] = "HeaderAValue";
- api._headers["HeaderB"] = "HeaderBValue";
- api._headers["HeaderC"] = "HeaderCValue";
- api._headers["HeaderD"] = "HeaderDValue";
- api._headers["HeaderE"] = "HeaderEValue";
- api._headers["HeaderF"] = "HeaderFValue";
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("Content-Type", "gzip"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "UNSIGNED-PAYLOAD"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
+ api._headers.insert(std::make_pair("HeaderA", "HeaderAValue"));
+ api._headers.insert(std::make_pair("HeaderB", "HeaderBValue"));
+ api._headers.insert(std::make_pair("HeaderC", "HeaderCValue"));
+ api._headers.insert(std::make_pair("HeaderD", "HeaderDValue"));
+ api._headers.insert(std::make_pair("HeaderE", "HeaderEValue"));
+ api._headers.insert(std::make_pair("HeaderF", "HeaderFValue"));
StringSet include, exclude;
commaSeparateString<StringSet>(include, "HeaderA,HeaderB,HeaderC");
@@ -943,10 +990,10 @@ TEST_CASE("S3AuthV4UtilParams: include content type", "[AWS][auth][utility]")
api._host.assign("examplebucket.s3.amazonaws.com");
api._path.assign("");
api._query.assign("max-keys=2&prefix=J");
- api._headers["Host"] = "examplebucket.s3.amazonaws.com";
- api._headers["Content-Type"] = "gzip";
- api._headers["x-amz-content-sha256"] = "UNSIGNED-PAYLOAD";
- api._headers["x-amz-date"] = "20130524T000000Z";
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("Content-Type", "gzip"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "UNSIGNED-PAYLOAD"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
StringSet include = defaultIncludeHeaders;
StringSet exclude;
@@ -976,9 +1023,9 @@ TEST_CASE("S3AuthV4UtilParams: include missing content type", "[AWS][auth][utili
api._host.assign("examplebucket.s3.amazonaws.com");
api._path.assign("");
api._query.assign("max-keys=2&prefix=J");
- api._headers["Host"] = "examplebucket.s3.amazonaws.com";
- api._headers["x-amz-content-sha256"] = "UNSIGNED-PAYLOAD";
- api._headers["x-amz-date"] = "20130524T000000Z";
+ api._headers.insert(std::make_pair("Host", "examplebucket.s3.amazonaws.com"));
+ api._headers.insert(std::make_pair("x-amz-content-sha256", "UNSIGNED-PAYLOAD"));
+ api._headers.insert(std::make_pair("x-amz-date", "20130524T000000Z"));
StringSet include = defaultIncludeHeaders;
StringSet exclude;
diff --git a/plugins/s3_auth/unit_tests/test_aws_auth_v4.h b/plugins/s3_auth/unit_tests/test_aws_auth_v4.h
index 1341517..e295d75 100644
--- a/plugins/s3_auth/unit_tests/test_aws_auth_v4.h
+++ b/plugins/s3_auth/unit_tests/test_aws_auth_v4.h
@@ -30,7 +30,7 @@
class HeaderIterator
{
public:
- HeaderIterator(const StringMap::iterator &it) { _it = it; }
+ HeaderIterator(const HeaderMultiMap::iterator &it) { _it = it; }
HeaderIterator(const HeaderIterator &i) { _it = i._it; }
~HeaderIterator() {}
HeaderIterator &
@@ -69,7 +69,7 @@ public:
*len = _it->second.length();
return _it->second.c_str();
}
- StringMap::iterator _it;
+ HeaderMultiMap::iterator _it;
};
/* Define a mock API to be used in unit-tests */
@@ -115,7 +115,7 @@ public:
String _host;
String _path;
String _query;
- StringMap _headers;
+ HeaderMultiMap _headers;
};
/* Expose the following methods only to the unit tests */