summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-05-24 18:31:11 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-05-24 18:57:48 -0700
commit4dafea4312a4843e2b26fb870138413117acb20d (patch)
tree80ad03309c3ad545406e54e20e3c32395803c55f
parent51876499e00a7021057dce8d04ed27fb8369c7b5 (diff)
downloadceph-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.cc7
-rw-r--r--src/rgw/rgw_common.h12
-rw-r--r--src/rgw/rgw_rest_client.cc34
-rw-r--r--src/rgw/rgw_rest_client.h3
-rw-r--r--src/rgw/rgw_rest_conn.cc2
-rw-r--r--src/rgw/rgw_rest_s3.cc4
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, &params);
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);