]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: prepare for supporting other meta headers
authorYehuda Sadeh <yehuda@hq.newdream.net>
Tue, 6 Sep 2011 23:57:17 +0000 (16:57 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Tue, 6 Sep 2011 23:58:43 +0000 (16:58 -0700)
src/rgw/rgw_op.cc
src/rgw/rgw_rest.cc

index 2fe571d56ed1a6534a0f2339b0512cfceb9c30c6..641c89be2bfb886d7c4af1ca1c1c2639a92d6abb 100644 (file)
@@ -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);
   }
 }
 
index 9cf35c555af579b24c6d0c620d9333587fcb812d..fa3c7a9d299feb8ec1753ab884a185d0478b44cb 100644 (file)
@@ -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;
+        }
       }
     }
   }