]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: cleanup, move init_meta_info() into req_info
authorYehuda Sadeh <yehuda@inktank.com>
Sat, 15 Jun 2013 01:06:12 +0000 (18:06 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Sat, 15 Jun 2013 01:06:12 +0000 (18:06 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_common.cc
src/rgw/rgw_common.h
src/rgw/rgw_rest.cc

index 31bb200e61521924a6b8bd8e6f86a018d70ef451..45c63c3c470f41e9fc0b8d5e5835f772e5e94d34 100644 (file)
@@ -162,6 +162,76 @@ req_state::~req_state() {
   free((void *)bucket_name);
 }
 
+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"),
+                                   STR_LEN_ENTRY("HTTP_X_RGW"),
+                                   STR_LEN_ENTRY("HTTP_X_OBJECT"),
+                                   STR_LEN_ENTRY("HTTP_X_CONTAINER"),
+                                   {NULL, 0} };
+
+
+int req_info::init_meta_info(bool *found_bad_meta)
+{
+  x_meta_map.clear();
+
+  map<string, string>& m = env->get_map();
+  map<string, string>::iterator iter;
+  for (iter = m.begin(); iter != m.end(); ++iter) {
+    const char *prefix;
+    const string& header_name = iter->first;
+    const string& val = iter->second;
+    for (int prefix_num = 0; (prefix = meta_prefixes[prefix_num].str) != NULL; prefix_num++) {
+      int len = meta_prefixes[prefix_num].len;
+      const char *p = header_name.c_str();
+      if (strncmp(p, prefix, len) == 0) {
+        dout(10) << "meta>> " << p << dendl;
+        const char *name = p+len; /* skip the prefix */
+        int name_len = header_name.size() - len;
+
+        if (found_bad_meta && strncmp(name, "_META_", name_len) == 0)
+          *found_bad_meta = true;
+
+        char name_low[meta_prefixes[0].len + name_len + 1];
+        snprintf(name_low, meta_prefixes[0].len - 5 + name_len + 1, "%s%s", meta_prefixes[0].str + 5 /* skip HTTP_ */, name); // normalize meta prefix
+        int j;
+        for (j = 0; name_low[j]; j++) {
+          if (name_low[j] != '_')
+            name_low[j] = tolower(name_low[j]);
+          else
+            name_low[j] = '-';
+        }
+        name_low[j] = 0;
+
+        map<string, string>::iterator iter;
+        iter = x_meta_map.find(name_low);
+        if (iter != 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);
+          x_meta_map[name_low] = old;
+        } else {
+          x_meta_map[name_low] = val;
+        }
+      }
+    }
+  }
+  for (iter = x_meta_map.begin(); iter != x_meta_map.end(); ++iter) {
+    dout(10) << "x>> " << iter->first << ":" << iter->second << dendl;
+  }
+
+  return 0;
+}
+
 std::ostream& operator<<(std::ostream& oss, const rgw_err &err)
 {
   oss << "rgw_err(http_ret=" << err.http_ret << ", s3='" << err.s3_code << "') ";
index 151b7667556241971c6c7a86b985cfc4dba84a1b..148623c6677d7fdd87b52665a0aa9dc85c65fbb1 100644 (file)
@@ -686,6 +686,7 @@ struct req_info {
 
   req_info(CephContext *cct, RGWEnv *_env);
   void rebuild_from(req_info& src);
+  int init_meta_info(bool *found_nad_meta);
 };
 
 /** Store all the state necessary to complete and respond to an HTTP request*/
index d2c277446fd5beda9166f1bea477a213a99beb78..b1578989d4b77e99dfe287611ba2d9ecdbedfe3e 100644 (file)
@@ -959,111 +959,6 @@ int RGWRESTOp::verify_permission()
   return check_caps(s->user.caps);
 }
 
-static void line_unfold(const char *line, string& sdest)
-{
-  char dest[strlen(line) + 1];
-  const char *p = line;
-  char *d = dest;
-
-  while (isspace(*p))
-    ++p;
-
-  bool last_space = false;
-
-  while (*p) {
-    switch (*p) {
-    case '\n':
-    case '\r':
-      *d = ' ';
-      if (!last_space)
-        ++d;
-      last_space = true;
-      break;
-    default:
-      *d = *p;
-      ++d;
-      last_space = false;
-      break;
-    }
-    ++p;
-  }
-  *d = 0;
-  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"),
-                                   STR_LEN_ENTRY("HTTP_X_RGW"),
-                                   STR_LEN_ENTRY("HTTP_X_OBJECT"),
-                                   STR_LEN_ENTRY("HTTP_X_CONTAINER"),
-                                   {NULL, 0} };
-
-static int init_meta_info(struct req_state *s)
-{
-  const char *p;
-
-  s->info.x_meta_map.clear();
-
-  const char **envp = s->cio->envp();
-
-  for (int i=0; (p = envp[i]); ++i) {
-    const char *prefix;
-    for (int prefix_num = 0; (prefix = meta_prefixes[prefix_num].str) != NULL; prefix_num++) {
-      int len = meta_prefixes[prefix_num].len;
-      if (strncmp(p, prefix, len) == 0) {
-        dout(10) << "meta>> " << p << dendl;
-        const char *name = p+len; /* skip the prefix */
-        const char *eq = strchr(name, '=');
-        if (!eq) /* shouldn't happen! */
-          continue;
-        int name_len = eq - name;
-
-        if (strncmp(name, "_META_", name_len) == 0)
-          s->has_bad_meta = true;
-
-        char name_low[meta_prefixes[0].len + name_len + 1];
-        snprintf(name_low, meta_prefixes[0].len - 5 + name_len + 1, "%s%s", meta_prefixes[0].str + 5 /* skip HTTP_ */, name); // normalize meta prefix
-        int j;
-        for (j = 0; name_low[j]; j++) {
-          if (name_low[j] != '_')
-            name_low[j] = tolower(name_low[j]);
-          else
-            name_low[j] = '-';
-        }
-        name_low[j] = 0;
-        string val;
-        line_unfold(eq + 1, val);
-
-        map<string, string>::iterator iter;
-        iter = s->info.x_meta_map.find(name_low);
-        if (iter != s->info.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->info.x_meta_map[name_low] = old;
-        } else {
-          s->info.x_meta_map[name_low] = val;
-        }
-      }
-    }
-  }
-  map<string, string>::iterator iter;
-  for (iter = s->info.x_meta_map.begin(); iter != s->info.x_meta_map.end(); ++iter) {
-    dout(10) << "x>> " << iter->first << ":" << iter->second << dendl;
-  }
-
-  return 0;
-}
 
 int RGWHandler_ObjStore::allocate_formatter(struct req_state *s, int default_type, bool configurable)
 {
@@ -1306,7 +1201,7 @@ int RGWREST::preprocess(struct req_state *s, RGWClientIO *cio)
   }
   s->op = op_from_method(info.method);
 
-  init_meta_info(s);
+  info.init_meta_info(&s->has_bad_meta);
 
   return 0;
 }