]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: forward request params through upstream REST
authorYehuda Sadeh <yehuda@inktank.com>
Sat, 25 May 2013 01:31:11 +0000 (18:31 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Sat, 25 May 2013 01:57:48 +0000 (18:57 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_common.cc
src/rgw/rgw_common.h
src/rgw/rgw_rest_client.cc
src/rgw/rgw_rest_client.h
src/rgw/rgw_rest_conn.cc
src/rgw/rgw_rest_s3.cc

index 83151e727b2d0333b8db3d5c7b645dd0dc3ee2a5..efcf4305f00687c3a5ad567745dd65b015a55acc 100644 (file)
@@ -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) ||
index be91c85c5712b2a9457453cf669e7d531630ef81..f7c0799bab425ce8aba0b6a712573cb9493cb5b9 100644 (file)
@@ -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;
index f84950e282730b12fa700e7cbfe1c65da13a5a6f..6d530a8c16745d98f18e0ceb66b9dd8c16e8d1b1 100644 (file)
@@ -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;
 
index 216399b26b7b3119d620944d0922b7b3bc307e9e..0adfba2b9520f6dfc2dfb747c058edbaa8954bc0 100644 (file)
@@ -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) {
index 82fc07c1ec46b904407584ae4df9fcde3334fdeb..fd2a5e568df1c60416e50ffcb70cb691e9da2467 100644 (file)
@@ -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);
 }
index 9902dfc2e13b3574df047efd145e9ba29ccf6fdd..28129f6b8af2fe98e101e3dd0522265c155cf22e 100644 (file)
@@ -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);