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) ||
#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"
{
string str, empty_str;
map<string, string> val_map;
+ map<string, string> sys_val_map;
map<string, string> sub_resources;
bool has_resp_modifier;
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();
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;
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)
{
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();
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;
new_resource = "/";
new_resource.append(resource);
}
- new_url.append(new_resource);
+ new_url.append(new_resource + params_str);
bufferlist::iterator bliter;
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) {
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);
}
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);