]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: implement s3 encoding-type for get bucket 5579/head
authorJeff Weber <jweber@cofront.net>
Wed, 5 Aug 2015 23:06:46 +0000 (19:06 -0400)
committerJeff Weber <jweber@cofront.net>
Thu, 20 Aug 2015 22:33:35 +0000 (22:33 +0000)
This change introduces handling for the encoding-type request
parameter on the get bucket operation. An object key may contain
characters which are not supported in XML. Passing the value "url" for
the encoding-type parameter will cause the key to be urlencoded in the
response.

Fixes: #12735
Signed-off-by: Jeff Weber <jweber@cofront.net>
src/rgw/rgw_op.h
src/rgw/rgw_rest_s3.cc

index 764078b94928953d952d6c697f6e0f27efd34cb8..32e8c80fe49742217b440a7e0125bc24911a5f8b 100644 (file)
@@ -258,6 +258,7 @@ protected:
   rgw_obj_key end_marker;
   string max_keys;
   string delimiter;
+  string encoding_type;
   bool list_versions;
   int max;
   int ret;
index 2dce3e1b46ae93bd07e60c127fcc857a564cea2d..570b00c0e9b106e23936fe706074ffa17e1d1a2c 100644 (file)
@@ -243,6 +243,7 @@ int RGWListBucket_ObjStore_S3::get_params()
     return ret;
   }
   delimiter = s->info.args.get("delimiter");
+  encoding_type = s->info.args.get("encoding-type");
   return 0;
 }
 
@@ -261,13 +262,23 @@ void RGWListBucket_ObjStore_S3::send_versioned_response()
 
   s->formatter->dump_string("IsTruncated", (max && is_truncated ? "true" : "false"));
 
+  bool encode_key = false;
+  if (strcasecmp(encoding_type.c_str(), "url") == 0)
+    encode_key = true;
+
   if (ret >= 0) {
     vector<RGWObjEnt>::iterator iter;
     for (iter = objs.begin(); iter != objs.end(); ++iter) {
       time_t mtime = iter->mtime.sec();
       const char *section_name = (iter->is_delete_marker() ? "DeleteMarker" : "Version");
       s->formatter->open_array_section(section_name);
-      s->formatter->dump_string("Key", iter->key.name);
+      if (encode_key) {
+        string key_name;
+        url_encode(iter->key.name, key_name);
+        s->formatter->dump_string("Key", key_name);
+      } else {
+        s->formatter->dump_string("Key", iter->key.name);
+      }
       string version_id = iter->key.instance;
       if (version_id.empty()) {
         version_id = "null";
@@ -328,11 +339,21 @@ void RGWListBucket_ObjStore_S3::send_response()
 
   s->formatter->dump_string("IsTruncated", (max && is_truncated ? "true" : "false"));
 
+  bool encode_key = false;
+  if (strcasecmp(encoding_type.c_str(), "url") == 0)
+    encode_key = true;
+
   if (ret >= 0) {
     vector<RGWObjEnt>::iterator iter;
     for (iter = objs.begin(); iter != objs.end(); ++iter) {
       s->formatter->open_array_section("Contents");
-      s->formatter->dump_string("Key", iter->key.name);
+      if (encode_key) {
+        string key_name;
+        url_encode(iter->key.name, key_name);
+        s->formatter->dump_string("Key", key_name);
+      } else {
+        s->formatter->dump_string("Key", iter->key.name);
+      }
       time_t mtime = iter->mtime.sec();
       dump_time(s, "LastModified", &mtime);
       s->formatter->dump_format("ETag", "\"%s\"", iter->etag.c_str());