diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-05-24 18:31:11 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-05-24 18:57:48 -0700 |
commit | 4dafea4312a4843e2b26fb870138413117acb20d (patch) | |
tree | 80ad03309c3ad545406e54e20e3c32395803c55f | |
parent | 51876499e00a7021057dce8d04ed27fb8369c7b5 (diff) | |
download | ceph-4dafea4312a4843e2b26fb870138413117acb20d.tar.gz |
rgw: forward request params through upstream REST
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r-- | src/rgw/rgw_common.cc | 7 | ||||
-rw-r--r-- | src/rgw/rgw_common.h | 12 | ||||
-rw-r--r-- | src/rgw/rgw_rest_client.cc | 34 | ||||
-rw-r--r-- | src/rgw/rgw_rest_client.h | 3 | ||||
-rw-r--r-- | src/rgw/rgw_rest_conn.cc | 2 | ||||
-rw-r--r-- | src/rgw/rgw_rest_s3.cc | 4 |
6 files changed, 57 insertions, 5 deletions
diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index 83151e727b2..efcf4305f00 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -471,7 +471,12 @@ int XMLArgs::parse() if (ret >= 0) { string& name = nv.get_name(); string& val = nv.get_val(); - val_map[name] = val; + + if (name.compare(0, sizeof(RGW_SYS_PARAM_PREFIX) - 1, RGW_SYS_PARAM_PREFIX) == 0) { + sys_val_map[name] = val; + } else { + val_map[name] = val; + } if ((name.compare("acl") == 0) || (name.compare("location") == 0) || diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index be91c85c571..f7c0799bab4 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -45,6 +45,8 @@ using ceph::crypto::MD5; #define RGW_AMZ_META_PREFIX "x-amz-meta-" +#define RGW_SYS_PARAM_PREFIX "rgwx-" + #define RGW_ATTR_ACL RGW_ATTR_PREFIX "acl" #define RGW_ATTR_CORS RGW_ATTR_PREFIX "cors" #define RGW_ATTR_ETAG RGW_ATTR_PREFIX "etag" @@ -205,6 +207,7 @@ class XMLArgs { string str, empty_str; map<string, string> val_map; + map<string, string> sys_val_map; map<string, string> sub_resources; bool has_resp_modifier; @@ -234,6 +237,9 @@ class XMLArgs map<string, string>::iterator iter = sub_resources.find(name); return (iter != sub_resources.end()); } + map<string, string>& get_params() { + return val_map; + } map<string, string>& get_sub_resources() { return sub_resources; } unsigned get_num_params() { return val_map.size(); @@ -241,6 +247,12 @@ class XMLArgs bool has_response_modifier() { return has_resp_modifier; } + void set_system() { /* make all system params visible */ + map<string, string>::iterator iter; + for (iter = sys_val_map.begin(); iter != sys_val_map.end(); ++iter) { + val_map[iter->first] = iter->second; + } + } }; class RGWConf; diff --git a/src/rgw/rgw_rest_client.cc b/src/rgw/rgw_rest_client.cc index f84950e2827..6d530a8c167 100644 --- a/src/rgw/rgw_rest_client.cc +++ b/src/rgw/rgw_rest_client.cc @@ -115,6 +115,33 @@ int RGWRESTClient::send_data(void *ptr, size_t len) return len; } +void RGWRESTClient::append_param(string& dest, const string& name, const string& val) +{ + if (dest.empty()) { + dest.append("?"); + } else { + dest.append("&"); + } + dest.append(name); + + if (!val.empty()) { + dest.append("="); + dest.append(val); + } +} + +void RGWRESTClient::get_params_str(map<string, string>& extra_args, string& dest) +{ + map<string, string>::iterator miter; + for (miter = extra_args.begin(); miter != extra_args.end(); ++miter) { + append_param(dest, miter->first, miter->second); + } + list<pair<string, string> >::iterator iter; + for (iter = params.begin(); iter != params.end(); ++iter) { + append_param(dest, iter->first, iter->second); + } +} + int RGWRESTClient::forward_request(RGWAccessKey& key, req_info& info, bufferlist *inbl) { @@ -125,7 +152,6 @@ int RGWRESTClient::forward_request(RGWAccessKey& key, req_info& info, bufferlist req_info new_info(cct, &new_env); new_info.rebuild_from(info); - new_env.remove("HTTP_X_AMZ_DATE"); new_env.set("HTTP_DATE", date_str.c_str()); map<string, string>& m = new_env.get_map(); @@ -159,6 +185,10 @@ int RGWRESTClient::forward_request(RGWAccessKey& key, req_info& info, bufferlist headers.push_back(make_pair<string, string>(iter->first, iter->second)); } + string params_str; + map<string, string>& args = new_info.args.get_params(); + get_params_str(args, params_str); + string new_url = url; string& resource = new_info.request_uri; string new_resource = resource; @@ -168,7 +198,7 @@ int RGWRESTClient::forward_request(RGWAccessKey& key, req_info& info, bufferlist new_resource = "/"; new_resource.append(resource); } - new_url.append(new_resource); + new_url.append(new_resource + params_str); bufferlist::iterator bliter; diff --git a/src/rgw/rgw_rest_client.h b/src/rgw/rgw_rest_client.h index 216399b26b7..0adfba2b952 100644 --- a/src/rgw/rgw_rest_client.h +++ b/src/rgw/rgw_rest_client.h @@ -17,6 +17,9 @@ protected: list<pair<string, string> > params; bufferlist::iterator *send_iter; + + void append_param(string& dest, const string& name, const string& val); + void get_params_str(map<string, string>& extra_args, string& dest); 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) { diff --git a/src/rgw/rgw_rest_conn.cc b/src/rgw/rgw_rest_conn.cc index 82fc07c1ec4..fd2a5e568df 100644 --- a/src/rgw/rgw_rest_conn.cc +++ b/src/rgw/rgw_rest_conn.cc @@ -33,7 +33,7 @@ int RGWRegionConnection::forward(const string& uid, req_info& info, bufferlist * if (ret < 0) return ret; list<pair<string, string> > params; - params.push_back(make_pair<string, string>("uid", uid)); + params.push_back(make_pair<string, string>(RGW_SYS_PARAM_PREFIX "uid", uid)); RGWRESTClient client(cct, url, NULL, ¶ms); return client.forward_request(key, info, inbl); } diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 9902dfc2e13..28129f6b8af 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -2005,7 +2005,9 @@ int RGW_Auth_S3::authorize(RGWRados *store, struct req_state *s) return -EPERM; if (s->user.system) { - string effective_uid = s->info.args.get("rgwx-uid"); + dout(20) << "system request" << dendl; + s->info.args.set_system(); + string effective_uid = s->info.args.get(RGW_SYS_PARAM_PREFIX "uid"); RGWUserInfo effective_user; if (!effective_uid.empty()) { ret = rgw_get_user_info_by_uid(store, effective_uid, effective_user); |