]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: some swift obj metadata related fixes
authorYehuda Sadeh <yehuda@hq.newdream.net>
Tue, 18 Oct 2011 23:41:24 +0000 (16:41 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Tue, 18 Oct 2011 23:41:24 +0000 (16:41 -0700)
src/rgw/rgw_common.cc
src/rgw/rgw_rest.cc
src/rgw/rgw_rest_swift.cc

index 20fb7a0f88d79ff7d05444e8fea670f160686e0c..c9aa697ec4126f1c4a8eb625ec1425e5f2f11755 100644 (file)
@@ -333,7 +333,7 @@ bool url_decode(string& src_str, string& dest_str)
   int pos = 0;
   char c;
 
-  dout(10) << "src=" << (void *)src << dendl;
+  dout(10) << "src=" << src << dendl;
 
   while (*src) {
     if (*src != '%') {
@@ -363,5 +363,7 @@ bool url_decode(string& src_str, string& dest_str)
   dest[pos] = 0;
   dest_str = dest;
 
+  dout(10) << "dest=" << dest << dendl;
+
   return true;
 }
index 10e44bfd3659aee023cf5dd63e92152240d26a9e..dadfed2f74557241ec78c9ca13be99581ae6369a 100644 (file)
@@ -516,11 +516,11 @@ static int init_entities_from_header(struct req_state *s)
     if (first.size() == 0)
       goto done;
 
-    url_decode(first, s->bucket_name_str);
+    s->bucket_name_str = first;
     s->bucket_name = strdup(s->bucket_name_str.c_str());
    
     if (req.size()) {
-      url_decode(req, s->object_str);
+      s->object_str = req;
       s->object = strdup(s->object_str.c_str());
     }
 
@@ -528,10 +528,10 @@ static int init_entities_from_header(struct req_state *s)
   }
 
   if (!s->bucket_name) {
-    url_decode(first, s->bucket_name_str);
+    s->bucket_name_str = first;
     s->bucket_name = strdup(s->bucket_name_str.c_str());
   } else {
-    url_decode(req, s->object_str);
+    s->object_str = first;
     s->object = strdup(s->object_str.c_str());
     goto done;
   }
@@ -541,7 +541,7 @@ static int init_entities_from_header(struct req_state *s)
 
   if (pos >= 0) {
     string encoded_obj_str = req.substr(pos+1);
-    url_decode(encoded_obj_str, s->object_str);
+    s->object_str = encoded_obj_str;
 
     if (s->object_str.size() > 0) {
       s->object = strdup(s->object_str.c_str());
@@ -594,6 +594,7 @@ struct str_len {
 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_OBJECT"),
                                    {NULL, 0} };
 
 static void init_auth_info(struct req_state *s)
@@ -608,16 +609,18 @@ static void init_auth_info(struct req_state *s)
       int len = meta_prefixes[prefix_num].len;
       if (strncmp(p, prefix, len) == 0) {
         dout(10) << "meta>> " << p << dendl;
-        const char *name = p+5; /* skip the HTTP_ part */
+        const char *name = p+len; /* skip the prefix */
         const char *eq = strchr(name, '=');
         if (!eq) /* shouldn't happen! */
           continue;
-        int len = eq - name;
-        char name_low[len + 1];
+        int len = eq - name + 1;
+        char name_low[meta_prefixes[0].len + len + 1];
+        len = snprintf(name_low, meta_prefixes[0].len - 5 + len, "%s%s", meta_prefixes[0].str + 5 /* skip HTTP_ */, name); // normalize meta prefix
         int j;
         for (j=0; j<len; j++) {
-          name_low[j] = tolower(name[j]);
-          if (name_low[j] == '_')
+          if (name_low[j] != '_')
+            name_low[j] = tolower(name_low[j]);
+          else
             name_low[j] = '-';
         }
         name_low[j] = 0;
@@ -750,6 +753,7 @@ int RGWHandler_REST::preprocess(struct req_state *s, FCGX_Request *fcgx)
   s->fcgx = fcgx;
   s->path_name = s->env->get("SCRIPT_NAME");
   s->path_name_url = s->env->get("REQUEST_URI");
+  url_decode(s->path_name_url, s->path_name_url);
   int pos = s->path_name_url.find('?');
   if (pos >= 0) {
     s->path_name_url = s->path_name_url.substr(0, pos);
index cae73d13348271dcf4785111fb9e37195628d9e1..45155e1abd333563df1cf46348400e75de8dfd89 100644 (file)
@@ -95,6 +95,8 @@ void RGWListBucket_REST_SWIFT::send_response()
   vector<RGWObjEnt>::iterator iter = objs.begin();
   map<string, bool>::iterator pref_iter = common_prefixes.begin();
 
+  dump_start(s);
+
   s->formatter->open_array_section("container");
 
   while (iter != objs.end() || pref_iter != common_prefixes.end()) {
@@ -117,8 +119,18 @@ void RGWListBucket_REST_SWIFT::send_response()
       s->formatter->dump_format("name", iter->name.c_str());
       s->formatter->dump_format("hash", "\"%s\"", iter->etag.c_str());
       s->formatter->dump_int("bytes", iter->size);
-      if (iter->content_type.size())
-        s->formatter->dump_format("content_type", iter->content_type.c_str());
+      string single_content_type = iter->content_type;
+      if (iter->content_type.size()) {
+        // content type might hold multiple values, just dump the last one
+        size_t pos = iter->content_type.rfind(',');
+        if (pos > 0) {
+          ++pos;
+          while (single_content_type[pos] == ' ')
+            ++pos;
+          single_content_type = single_content_type.substr(pos);
+        }
+        s->formatter->dump_format("content_type", single_content_type.c_str());
+      }
       dump_time(s, "last_modified", &iter->mtime);
       s->formatter->close_section();
     }
@@ -143,8 +155,6 @@ void RGWListBucket_REST_SWIFT::send_response()
 
   set_req_state_err(s, ret);
   dump_errno(s);
-
-  dump_start(s);
   end_header(s);
   if (ret < 0) {
     return;
@@ -276,8 +286,8 @@ int RGWGetObj_REST_SWIFT::send_response(void *handle)
     for (iter = attrs.begin(); iter != attrs.end(); ++iter) {
        const char *name = iter->first.c_str();
        if (strncmp(name, RGW_ATTR_META_PREFIX, sizeof(RGW_ATTR_META_PREFIX)-1) == 0) {
-         name += sizeof(RGW_ATTR_PREFIX) - 1;
-         CGI_PRINTF(s,"%s: %s\r\n", name, iter->second.c_str());
+         name += sizeof(RGW_ATTR_META_PREFIX) - 1;
+         CGI_PRINTF(s,"X-Object-Meta-%s: %s\r\n", name, iter->second.c_str());
        } else if (!content_type && strcmp(name, RGW_ATTR_CONTENT_TYPE) == 0) {
          content_type = iter->second.c_str();
        }