Skip to content

Commit 0185b83

Browse files
committed
Set default value of payload hash to the empty hash
1 parent 293fc36 commit 0185b83

2 files changed

Lines changed: 33 additions & 1 deletion

File tree

src/s3cpp/auth.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class AWSSigV4Signer {
2020
void sign(HttpRequestBase<T>& request);
2121

2222
template <typename T>
23-
std::string createCannonicalRequest(HttpRequestBase<T>& request, const std::string& payload_hash = "");
23+
std::string createCannonicalRequest(HttpRequestBase<T>& request, const std::string& payload_hash = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
2424

2525
const unsigned char* sha256(const std::string& str);
2626
const unsigned char* HMAC_SHA256(const unsigned char* key, size_t key_len, const std::string& data);

test/auth_test.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,38 @@ TEST(AUTH, CannonicalGETRequest) {
7070
EXPECT_TRUE(req.getHeaders().contains("Authorization"));
7171
}
7272

73+
TEST(AUTH, CannonicalGETRequestWithoutPayload) {
74+
// create signer & http client
75+
auto signer = AWSSigV4Signer("minio_access", "minio_secret");
76+
HttpClient client {};
77+
78+
// prepare request
79+
const std::string host = "s3.amazonaws.com";
80+
const std::string URI = "/amzn-s3-demo-bucket/myphoto.jpg";
81+
const std::string URL = std::format("http://{}{}", host, URI);
82+
const std::string timestamp = signer.getTimestamp();
83+
const std::string empty_payload_hash = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
84+
HttpRequest req = client.get(URL)
85+
.header("Host", host)
86+
.header("X-Amz-Date", timestamp)
87+
.header("X-Amz-Content-Sha256", empty_payload_hash);
88+
89+
const std::string expected_canonical = std::format("GET\n"
90+
"/amzn-s3-demo-bucket/myphoto.jpg\n"
91+
"\n"
92+
"host:{}\n"
93+
"x-amz-content-sha256:{}\n"
94+
"x-amz-date:{}\n"
95+
"\n"
96+
"host;x-amz-content-sha256;x-amz-date\n"
97+
"{}",
98+
host, empty_payload_hash, timestamp, empty_payload_hash);
99+
100+
EXPECT_EQ(signer.createCannonicalRequest(req), expected_canonical);
101+
signer.sign(req);
102+
EXPECT_TRUE(req.getHeaders().contains("Authorization"));
103+
}
104+
73105
TEST(AUTH, MinIOBasicRequest) {
74106
// create signer & http client
75107
auto signer = AWSSigV4Signer("minio_access", "minio_secret");

0 commit comments

Comments
 (0)