Skip to content

Commit 793648f

Browse files
committed
Support anonymous requests
1 parent 523946a commit 793648f

5 files changed

Lines changed: 30 additions & 11 deletions

File tree

src/s3cpp/auth.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,27 @@
1313

1414
template <typename T>
1515
void AWSSigV4Signer::sign(HttpRequestBase<T>& request) {
16-
// Autorization
17-
const std::string hash_algo = "AWS4-HMAC-SHA256";
16+
// For anonymous requests (empty credentials), only add required headers but skip Authorization
17+
const bool is_anonymous = access_key.empty() || secret_key.empty();
1818

19-
// Compute payload hash and set header ONLY for body requests
19+
// Compute payload hash and set header for all requests
2020
std::string payload_hash;
2121
if constexpr (std::is_same_v<T, HttpBodyRequest>) {
2222
const std::string& body = static_cast<HttpBodyRequest&>(request).getBody();
2323
payload_hash = hex(sha256(body));
24-
request.header("x-amz-content-sha256", payload_hash);
2524
} else {
25+
// Empty payload hash for GET/HEAD requests
2626
payload_hash = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
2727
}
28+
request.header("x-amz-content-sha256", payload_hash);
29+
30+
// Skip signing for anonymous requests
31+
if (is_anonymous) {
32+
return;
33+
}
34+
35+
// Autorization
36+
const std::string hash_algo = "AWS4-HMAC-SHA256";
2837

2938
// Compute date and add it as a header
3039
const std::string timestamp = this->getTimestamp();

src/s3cpp/httpclient.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ std::expected<HttpResponse, std::string> HttpClient::execute_get(HttpRequest& re
7474
CURLcode code = curl_easy_perform(curl_handle);
7575
curl_slist_free_all(list);
7676
if (code != CURLE_OK) {
77-
return std::unexpected<std::string>(std::format("libcurl error: {}", curl_easy_strerror(code)));
77+
return std::unexpected<std::string>(std::format("libcurl error on execute_get: {}", curl_easy_strerror(code)));
7878
}
7979

8080
// get HTTP code
@@ -115,7 +115,7 @@ std::expected<HttpResponse, std::string> HttpClient::execute_head(HttpRequest& r
115115
CURLcode code = curl_easy_perform(curl_handle);
116116
curl_slist_free_all(list);
117117
if (code != CURLE_OK) {
118-
return std::unexpected<std::string>(std::format("libcurl error: {}", curl_easy_strerror(code)));
118+
return std::unexpected<std::string>(std::format("libcurl error execute_head: {}", curl_easy_strerror(code)));
119119
}
120120

121121
// get HTTP code
@@ -174,7 +174,7 @@ std::expected<HttpResponse, std::string> HttpClient::execute_post(HttpBodyReques
174174
CURLcode code = curl_easy_perform(curl_handle);
175175
curl_slist_free_all(list);
176176
if (code != CURLE_OK) {
177-
return std::unexpected<std::string>(std::format("libcurl error: {}", curl_easy_strerror(code)));
177+
return std::unexpected<std::string>(std::format("libcurl error execute_post: {}", curl_easy_strerror(code)));
178178
}
179179

180180
// get HTTP code
@@ -229,7 +229,7 @@ std::expected<HttpResponse, std::string> HttpClient::execute_delete(HttpBodyRequ
229229
CURLcode code = curl_easy_perform(curl_handle);
230230
curl_slist_free_all(list);
231231
if (code != CURLE_OK) {
232-
return std::unexpected<std::string>(std::format("libcurl error: {}", curl_easy_strerror(code)));
232+
return std::unexpected<std::string>(std::format("libcurl error execute_delete: {}", curl_easy_strerror(code)));
233233
}
234234

235235
// get HTTP code

src/s3cpp/s3.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ Error S3Client::deserializeError(const std::vector<XMLNode>& nodes) {
607607
} else if (node.tag == "Error.Resource") {
608608
error.Resource = std::move(node.value);
609609
} else if (node.tag == "Error.RequestId") {
610-
error.RequestId = Parser.parseNumber<int>(std::move(node.value));
610+
error.RequestId = std::move(node.value);
611611
} else {
612612
continue;
613613
}

src/s3cpp/xml.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ class XMLParser {
184184

185185
template <typename T>
186186
T parseNumber(const std::string s) {
187-
int code;
187+
T code;
188188
std::from_chars_result result;
189189
int base = 10;
190190

@@ -204,7 +204,7 @@ class XMLParser {
204204
}
205205

206206
if (result.ec == std::errc {}) {
207-
return static_cast<T>(code);
207+
return code;
208208
}
209209
throw std::runtime_error(std::format("Unable to parse number from '{}'", s));
210210
}

test/aws_test.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#include "gtest/gtest.h"
2+
#include <s3cpp/s3.h>
3+
#include <string>
4+
5+
TEST(AWS, AWSAnonymousCredsListBucket) {
6+
S3Client client("", "");
7+
std::expected<ListObjectsResult, Error> res = client.ListObjects("fast-ai-imageclas");
8+
if (!res)
9+
FAIL() << std::format("ListObjects request failed. Code={}, Message={}", res.error().Code, res.error().Message);
10+
}

0 commit comments

Comments
 (0)