]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: unquote etag for if-match
authorYehuda Sadeh <yehuda@inktank.com>
Wed, 7 Nov 2012 23:39:56 +0000 (15:39 -0800)
committerYehuda Sadeh <yehuda@inktank.com>
Wed, 7 Nov 2012 23:42:20 +0000 (15:42 -0800)
Fixes: #3453
Passed ETag for copy/get request may be quoted.

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

index b0460929da8086e564308a1a8f77a27106eee925..e76554d2f3180da6a57b1be39a1027041360a63f 100644 (file)
@@ -141,6 +141,23 @@ std::ostream& operator<<(std::ostream& oss, const rgw_err &err)
   return oss;
 }
 
+string rgw_string_unquote(const string& s)
+{
+  if (s[0] != '"' || s.size() < 2)
+    return s;
+
+  int len;
+  for (len = s.size(); len > 2; --len) {
+    if (s[len - 1] != ' ')
+      break;
+  }
+
+  if (s[len-1] != '"')
+    return s;
+
+  return s.substr(1, len - 2);
+}
+
 static bool check_str_end(const char *s)
 {
   if (!s)
index f4a02eedcf4e37b6796f4778cb2da53431d49e68..a1a2686ec73012733b27910b88c2ca68b37daf5b 100644 (file)
@@ -1018,6 +1018,7 @@ static inline const char *rgw_obj_category_name(RGWObjCategory category)
   return "unknown";
 }
 
+extern string rgw_string_unquote(const string& s);
 /** time parsing */
 extern int parse_time(const char *time_str, time_t *time);
 extern bool parse_rfc2616(const char *s, struct tm *t);
index 70659cc3e666c2fabb4a180161e791b24d8da3e7..19c66c2937ced015e307736915fc554924cca633 100644 (file)
@@ -1714,23 +1714,6 @@ int RGWCompleteMultipart::verify_permission()
   return 0;
 }
 
-static string string_unquote(const string& s)
-{
-  if (s[0] != '"' || s.size() < 2)
-    return s;
-
-  int len;
-  for (len = s.size(); len > 2; --len) {
-    if (s[len - 1] != ' ')
-      break;
-  }
-
-  if (s[len-1] != '"')
-    return s;
-
-  return s.substr(1, len - 2);
-}
-
 void RGWCompleteMultipart::execute()
 {
   RGWMultiCompleteUpload *parts;
@@ -1796,7 +1779,7 @@ void RGWCompleteMultipart::execute()
       ret = -ERR_INVALID_PART;
       return;
     }
-    string part_etag = string_unquote(iter->second);
+    string part_etag = rgw_string_unquote(iter->second);
     if (part_etag.compare(obj_iter->second.etag) != 0) {
       ldout(s->cct, 0) << "NOTICE: etag mismatch: part: " << iter->first << " etag: " << iter->second << dendl;
       ret = -ERR_INVALID_PART;
index 583992def6ea09ff1a98031b47685a293aa2b010..538f206b121550e684370f3d31e0170229a736ce 100644 (file)
@@ -2252,19 +2252,22 @@ int RGWRados::prepare_get_obj(void *ctx, rgw_obj& obj,
       goto done_err;
 
     if (if_match) {
-      ldout(cct, 10) << "ETag: " << etag.c_str() << " " << " If-Match: " << if_match << dendl;
-      if (strcmp(if_match, etag.c_str())) {
+      string if_match_str = rgw_string_unquote(if_match);
+      ldout(cct, 10) << "ETag: " << etag.c_str() << " " << " If-Match: " << if_match_str << dendl;
+      if (if_match_str.compare(etag.c_str()) != 0) {
         r = -ERR_PRECONDITION_FAILED;
         goto done_err;
       }
     }
 
     if (if_nomatch) {
-      ldout(cct, 10) << "ETag: " << etag.c_str() << " " << " If-NoMatch: " << if_nomatch << dendl;
-      if (strcmp(if_nomatch, etag.c_str()) == 0) {
+      string if_nomatch_str = rgw_string_unquote(if_nomatch);
+      ldout(cct, 10) << "ETag: " << etag.c_str() << " " << " If-NoMatch: " << if_nomatch_str << dendl;
+      if (if_nomatch_str.compare(etag.c_str()) == 0) {
         r = -ERR_NOT_MODIFIED;
         goto done_err;
       }
+      if_nomatch = if_nomatch_str.c_str();
     }
   }