*/
void rgw_create_s3_v4_canonical_request(struct req_state *s, const string& canonical_uri, const string& canonical_qs,
const string& canonical_hdrs, const string& signed_hdrs, const string& request_payload,
- string& canonical_req, string& canonical_req_hash)
+ bool unsigned_payload, string& canonical_req, string& canonical_req_hash)
{
string request_payload_hash;
- if (len < 0) {
+ if (unsigned_payload) {
request_payload_hash = "UNSIGNED-PAYLOAD";
} else {
- rgw_hash_s3_string_sha256(data, len, request_payload_hash);
+ rgw_hash_s3_string_sha256(request_payload.c_str(), request_payload.size(), request_payload_hash);
}
dout(10) << "payload request hash = " << request_payload_hash << dendl;
void rgw_hash_s3_string_sha256(const string& str, string& dest);
void rgw_create_s3_v4_canonical_request(struct req_state *s, const string& canonical_uri, const string& canonical_qs,
const string& canonical_hdrs, const string& signed_hdrs, const string& request_payload,
- string& canonical_req, string& canonical_req_hash);
+ bool unsigned_payload, string& canonical_req, string& canonical_req_hash);
void rgw_create_s3_v4_string_to_sign(const string& algorithm, const string& request_date, const string& credential_scope, const string& hashed_qr, string& string_to_sign);
int rgw_calculate_s3_v4_aws_signature(struct req_state *s, const string& access_key_id, const string &date, const string& region, const string& service, const string& string_to_sign, string& signature);
string request_payload;
+ bool unsigned_payload = false;
if (using_qs) {
- len = -1;
+ unsigned_payload = true;
}
- if (!using_qs && ((s->content_length > 0) || s->info.env->get("HTTP_TRANSFER_ENCODING"))) {
+ if (using_qs || ((s->content_length == 0) && s->info.env->get("HTTP_TRANSFER_ENCODING") == NULL)) {
+
+ /* requests lacking of body are authenticated now */
+
+ /* craft canonical request */
+
+ string canonical_req;
+ string canonical_req_hash;
+
+ rgw_create_s3_v4_canonical_request(s, canonical_uri, canonical_qs,
+ canonical_hdrs, signed_hdrs, request_payload, unsigned_payload,
+ canonical_req, canonical_req_hash);
/* TODO: read body in request_payload */