]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: handle response-* params
authorYehuda Sadeh <yehuda@inktank.com>
Fri, 6 Jul 2012 20:14:53 +0000 (13:14 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Fri, 6 Jul 2012 23:43:57 +0000 (16:43 -0700)
Handle response-* params that set response header field values.
Fixes #2734, #2735.
Backport: argonaut

Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_common.cc
src/rgw/rgw_common.h
src/rgw/rgw_rest_s3.cc

index 3ff0792b5d2f2cc03ad50371e9faf03fc92306b5..9aeb24a1a04b189f8f2d86c341e8322243ac7d14 100644 (file)
@@ -294,16 +294,28 @@ int XMLArgs::parse()
     NameVal nv(nameval);
     int ret = nv.parse();
     if (ret >= 0) {
-      val_map[nv.get_name()] = nv.get_val();
-
-      if ((nv.get_name().compare("acl") == 0) ||
-          (nv.get_name().compare("location") == 0) ||
-          (nv.get_name().compare("uploads") == 0) ||
-          (nv.get_name().compare("partNumber") == 0) ||
-          (nv.get_name().compare("uploadId") == 0) ||
-          (nv.get_name().compare("versionid") == 0) ||
-          (nv.get_name().compare("torrent") == 0)) {
-        sub_resources[nv.get_name()] = nv.get_val();
+      string& name = nv.get_name();
+      string& val = nv.get_val();
+      val_map[name] = val;
+
+      if ((name.compare("acl") == 0) ||
+          (name.compare("location") == 0) ||
+          (name.compare("uploads") == 0) ||
+          (name.compare("partNumber") == 0) ||
+          (name.compare("uploadId") == 0) ||
+          (name.compare("versionId") == 0) ||
+          (name.compare("torrent") == 0)) {
+        sub_resources[name] = val;
+      } else if (name[0] == 'r') { // root of all evil
+        if ((name.compare("response-content-type") == 0) ||
+           (name.compare("response-content-language") == 0) ||
+           (name.compare("response-expires") == 0) ||
+           (name.compare("response-cache-control") == 0) ||
+           (name.compare("response-content-disposition") == 0) ||
+           (name.compare("response-content-encoding") == 0)) {
+         sub_resources[name] = val;
+         has_resp_modifier = true;
+       }
       }
     }
 
@@ -313,19 +325,22 @@ int XMLArgs::parse()
   return 0;
 }
 
-string& XMLArgs::get(string& name)
+string& XMLArgs::get(string& name, bool *exists)
 {
   map<string, string>::iterator iter;
   iter = val_map.find(name);
-  if (iter == val_map.end())
-    return empty_str;
-  return iter->second;
+  bool e = (iter != val_map.end());
+  if (exists)
+    *exists = e;
+  if (e)
+    return iter->second;
+  return empty_str;
 }
 
-string& XMLArgs::get(const char *name)
+string& XMLArgs::get(const char *name, bool *exists)
 {
   string s(name);
-  return get(s);
+  return get(s, exists);
 }
 
 bool verify_bucket_permission(struct req_state *s, int perm)
index aa525718e86471f384c1145380553f4e2e8a4992..22f69f45ac7726b9cc48a34461a157b901878a90 100644 (file)
@@ -210,16 +210,22 @@ class XMLArgs
   string str, empty_str;
   map<string, string> val_map;
   map<string, string> sub_resources;
+
+  bool has_resp_modifier;
  public:
-  XMLArgs() {}
-  XMLArgs(string s) : str(s) {}
+  XMLArgs() : has_resp_modifier(false) {}
   /** Set the arguments; as received */
-  void set(string s) { val_map.clear(); sub_resources.clear(); str = s; }
+  void set(string s) {
+    has_resp_modifier = false;
+    val_map.clear();
+    sub_resources.clear();
+    str = s;
+  }
   /** parse the received arguments */
   int parse();
   /** Get the value for a specific argument parameter */
-  string& get(string& name);
-  string& get(const char *name);
+  string& get(string& name, bool *exists = NULL);
+  string& get(const char *name, bool *exists = NULL);
   /** see if a parameter is contained in this XMLArgs */
   bool exists(const char *name) {
     map<string, string>::iterator iter = val_map.find(name);
@@ -230,6 +236,10 @@ class XMLArgs
     return (iter != sub_resources.end());
   }
   map<string, string>& get_sub_resources() { return sub_resources; }
+
+  bool has_response_modifier() {
+    return has_resp_modifier;
+  }
 };
 
 class RGWConf;
index b6f0fa11c55094ecd8400ebaa243f96dd76d40b0..968b329d2ef27eee8e3385256bb96ae9652d86f4 100644 (file)
@@ -41,6 +41,7 @@ void dump_bucket(struct req_state *s, RGWBucketEnt& obj)
 
 int RGWGetObj_REST_S3::send_response(bufferlist& bl)
 {
+  string content_type_str;
   const char *content_type = NULL;
   int orig_ret = ret;
 
@@ -66,6 +67,28 @@ int RGWGetObj_REST_S3::send_response(bufferlist& bl)
       }
     }
 
+    if (s->args.has_response_modifier()) {
+      bool exists;
+      content_type_str = s->args.get("response-content-type", &exists);
+      if (exists)
+       content_type = content_type_str.c_str();
+      string val = s->args.get("response-content-language", &exists);
+      if (exists)
+        CGI_PRINTF(s, "Content-Language: %s\n", val.c_str());
+      val = s->args.get("response-expires", &exists);
+      if (exists)
+        CGI_PRINTF(s, "Expires: %s\n", val.c_str());
+      val = s->args.get("response-cache-control", &exists);
+      if (exists)
+        CGI_PRINTF(s, "Cache-Control: %s\n", val.c_str());
+      val = s->args.get("response-content-disposition", &exists);
+      if (exists)
+        CGI_PRINTF(s, "Content-Disposition: %s\n", val.c_str());
+      val = s->args.get("response-content-encoding", &exists);
+      if (exists)
+        CGI_PRINTF(s, "Content-Encoding: %s\n", val.c_str());
+    }
+
     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) {