diff options
author | Yehuda Sadeh <yehuda@hq.newdream.net> | 2011-09-06 16:57:17 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@hq.newdream.net> | 2011-09-06 16:58:43 -0700 |
commit | 78a364662f5bb5cf66880705fcc2e795dba2c24f (patch) | |
tree | 2e654b343913a43a1927274ad358f4b0adde9a10 | |
parent | 0f87638d615cf76ad75cfadb717867906e740613 (diff) | |
download | ceph-78a364662f5bb5cf66880705fcc2e795dba2c24f.tar.gz |
rgw: prepare for supporting other meta headers
-rw-r--r-- | src/rgw/rgw_op.cc | 19 | ||||
-rw-r--r-- | src/rgw/rgw_rest.cc | 75 |
2 files changed, 53 insertions, 41 deletions
diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 2fe571d56ed..641c89be2bf 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -117,17 +117,14 @@ void get_request_metadata(struct req_state *s, map<string, bufferlist>& attrs) for (iter = s->x_meta_map.begin(); iter != s->x_meta_map.end(); ++iter) { const string &name(iter->first); string &xattr(iter->second); -#define X_AMZ_META "x-amz-meta" - if (name.find(X_AMZ_META) == 0) { - RGW_LOG(10) << "x>> " << name << ":" << xattr << dendl; - format_xattr(xattr); - string attr_name(RGW_ATTR_PREFIX); - attr_name.append(name); - map<string, bufferlist>::value_type v(attr_name, bufferlist()); - std::pair < map<string, bufferlist>::iterator, bool > rval(attrs.insert(v)); - bufferlist& bl(rval.first->second); - bl.append(xattr.c_str(), xattr.size() + 1); - } + RGW_LOG(10) << "x>> " << name << ":" << xattr << dendl; + format_xattr(xattr); + string attr_name(RGW_ATTR_PREFIX); + attr_name.append(name); + map<string, bufferlist>::value_type v(attr_name, bufferlist()); + std::pair < map<string, bufferlist>::iterator, bool > rval(attrs.insert(v)); + bufferlist& bl(rval.first->second); + bl.append(xattr.c_str(), xattr.size() + 1); } } diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index 9cf35c555af..fa3c7a9d299 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -542,6 +542,18 @@ static void line_unfold(const char *line, string& sdest) sdest = dest; } +struct str_len { + const char *str; + int len; +}; + +#define STR_LEN_ENTRY(s) { s, sizeof(s) - 1 } + +struct str_len meta_prefixes[] = { STR_LEN_ENTRY("HTTP_X_AMZ"), + STR_LEN_ENTRY("HTTP_X_GOOG"), + STR_LEN_ENTRY("HTTP_X_DHO"), + {NULL, 0} }; + static void init_auth_info(struct req_state *s) { const char *p; @@ -549,36 +561,39 @@ static void init_auth_info(struct req_state *s) s->x_meta_map.clear(); for (int i=0; (p = s->fcgx->envp[i]); ++i) { -#define HTTP_X_AMZ "HTTP_X_AMZ" - if (strncmp(p, HTTP_X_AMZ, sizeof(HTTP_X_AMZ) - 1) == 0) { - RGW_LOG(10) << "meta>> " << p << dendl; - const char *name = p+5; /* skip the HTTP_ part */ - const char *eq = strchr(name, '='); - if (!eq) /* shouldn't happen! */ - continue; - int len = eq - name; - char name_low[len + 1]; - int j; - for (j=0; j<len; j++) { - name_low[j] = tolower(name[j]); - if (name_low[j] == '_') - name_low[j] = '-'; - } - name_low[j] = 0; - string val; - line_unfold(eq + 1, val); - - map<string, string>::iterator iter; - iter = s->x_meta_map.find(name_low); - if (iter != s->x_meta_map.end()) { - string old = iter->second; - int pos = old.find_last_not_of(" \t"); /* get rid of any whitespaces after the value */ - old = old.substr(0, pos + 1); - old.append(","); - old.append(val); - s->x_meta_map[name_low] = old; - } else { - s->x_meta_map[name_low] = val; + const char *prefix; + for (int prefix_num = 0; prefix = meta_prefixes[prefix_num].str; prefix_num++) { + int len = meta_prefixes[prefix_num].len; + if (strncmp(p, prefix, len) == 0) { + RGW_LOG(10) << "meta>> " << p << dendl; + const char *name = p+5; /* skip the HTTP_ part */ + const char *eq = strchr(name, '='); + if (!eq) /* shouldn't happen! */ + continue; + int len = eq - name; + char name_low[len + 1]; + int j; + for (j=0; j<len; j++) { + name_low[j] = tolower(name[j]); + if (name_low[j] == '_') + name_low[j] = '-'; + } + name_low[j] = 0; + string val; + line_unfold(eq + 1, val); + + map<string, string>::iterator iter; + iter = s->x_meta_map.find(name_low); + if (iter != s->x_meta_map.end()) { + string old = iter->second; + int pos = old.find_last_not_of(" \t"); /* get rid of any whitespaces after the value */ + old = old.substr(0, pos + 1); + old.append(","); + old.append(val); + s->x_meta_map[name_low] = old; + } else { + s->x_meta_map[name_low] = val; + } } } } |