summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-06-03 20:25:10 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-06-10 14:28:03 -0700
commit284f6a20df1a895a7c2752a628ab6e28a0b74c99 (patch)
tree8a19219cf49ec8e36cf7bfaaf8ab872d0ff7dee9
parent72cb5fd64ca3b40959c2c70039637349ae8cb5d0 (diff)
downloadceph-284f6a20df1a895a7c2752a628ab6e28a0b74c99.tar.gz
rgw: format put request auth
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r--src/rgw/rgw_rest_client.cc70
-rw-r--r--src/rgw/rgw_rest_client.h2
2 files changed, 55 insertions, 17 deletions
diff --git a/src/rgw/rgw_rest_client.cc b/src/rgw/rgw_rest_client.cc
index d7c0a9596a9..6702237b745 100644
--- a/src/rgw/rgw_rest_client.cc
+++ b/src/rgw/rgw_rest_client.cc
@@ -154,19 +154,9 @@ void RGWRESTClient::get_params_str(map<string, string>& extra_args, string& dest
}
}
-int RGWRESTClient::forward_request(RGWAccessKey& key, req_info& info, size_t max_response, bufferlist *inbl, bufferlist *outbl)
+int RGWRESTClient::sign_request(RGWAccessKey& key, RGWEnv& env, req_info& info)
{
-
- string date_str;
- get_new_date_str(cct, date_str);
-
- RGWEnv new_env;
- req_info new_info(cct, &new_env);
- new_info.rebuild_from(info);
-
- new_env.set("HTTP_DATE", date_str.c_str());
-
- map<string, string>& m = new_env.get_map();
+ map<string, string>& m = env.get_map();
map<string, string>::iterator i;
for (i = m.begin(); i != m.end(); ++i) {
@@ -174,7 +164,7 @@ int RGWRESTClient::forward_request(RGWAccessKey& key, req_info& info, size_t max
}
string canonical_header;
- if (!rgw_create_s3_canonical_header(new_info, NULL, canonical_header, false)) {
+ if (!rgw_create_s3_canonical_header(info, NULL, canonical_header, false)) {
ldout(cct, 0) << "failed to create canonical s3 header" << dendl;
return -EINVAL;
}
@@ -192,6 +182,28 @@ int RGWRESTClient::forward_request(RGWAccessKey& key, req_info& info, size_t max
m["AUTHORIZATION"] = auth_hdr;
+ return 0;
+}
+
+int RGWRESTClient::forward_request(RGWAccessKey& key, req_info& info, size_t max_response, bufferlist *inbl, bufferlist *outbl)
+{
+
+ string date_str;
+ get_new_date_str(cct, date_str);
+
+ RGWEnv new_env;
+ req_info new_info(cct, &new_env);
+ new_info.rebuild_from(info);
+
+ new_env.set("HTTP_DATE", date_str.c_str());
+
+ int ret = sign_request(key, new_env, new_info);
+ if (ret < 0) {
+ ldout(cct, 0) << "ERROR: failed to sign request" << dendl;
+ return ret;
+ }
+
+ map<string, string>& m = new_env.get_map();
map<string, string>::iterator iter;
for (iter = m.begin(); iter != m.end(); ++iter) {
headers.push_back(make_pair<string, string>(iter->first, iter->second));
@@ -237,19 +249,43 @@ int RGWRESTClient::forward_request(RGWAccessKey& key, req_info& info, size_t max
int RGWRESTClient::put_obj(RGWAccessKey& key, rgw_obj& obj, uint64_t obj_size, void (*get_data)(uint64_t ofs, uint64_t len, bufferlist& bl, void *))
{
string resource = obj.bucket.name + "/" + obj.object;
- string new_url = url + "/" + resource;
+ string new_url = url;
+ if (new_url[new_url.size() - 1] != '/')
+ new_url.append("/");
+
string date_str;
get_new_date_str(cct, date_str);
RGWEnv new_env;
req_info new_info(cct, &new_env);
+ string params_str;
+ map<string, string>& args = new_info.args.get_params();
+ get_params_str(args, params_str);
+
+ new_url.append(resource + params_str);
+
new_env.set("HTTP_DATE", date_str.c_str());
- new_info.script_uri = resource;
- new_info.request_uri = resource;
+ new_info.method = "PUT";
- int r = process("PUT", new_url.c_str());
+ new_info.script_uri = "/";
+ new_info.script_uri.append(resource);
+ new_info.request_uri = new_info.script_uri;
+
+ int ret = sign_request(key, new_env, new_info);
+ if (ret < 0) {
+ ldout(cct, 0) << "ERROR: failed to sign request" << dendl;
+ return ret;
+ }
+
+ map<string, string>& m = new_env.get_map();
+ map<string, string>::iterator iter;
+ for (iter = m.begin(); iter != m.end(); ++iter) {
+ headers.push_back(make_pair<string, string>(iter->first, iter->second));
+ }
+
+ int r = process(new_info.method, new_url.c_str());
if (r < 0)
return r;
diff --git a/src/rgw/rgw_rest_client.h b/src/rgw/rgw_rest_client.h
index 1b3b46bcf3d..fee9c1d38b4 100644
--- a/src/rgw/rgw_rest_client.h
+++ b/src/rgw/rgw_rest_client.h
@@ -23,6 +23,8 @@ protected:
void append_param(string& dest, const string& name, const string& val);
void get_params_str(map<string, string>& extra_args, string& dest);
+
+ int sign_request(RGWAccessKey& key, RGWEnv& env, req_info& info);
public:
RGWRESTClient(CephContext *_cct, string& _url, list<pair<string, string> > *_headers,
list<pair<string, string> > *_params) : cct(_cct), status(0), url(_url), send_iter(NULL),