]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: swift related adjustments
authorYehuda Sadeh <yehuda@hq.newdream.net>
Thu, 27 Oct 2011 21:31:16 +0000 (14:31 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Thu, 27 Oct 2011 21:35:01 +0000 (14:35 -0700)
src/rgw/rgw_common.cc
src/rgw/rgw_common.h
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rest.cc
src/rgw/rgw_rest_swift.cc
src/rgw/rgw_rest_swift.h

index c9aa697ec4126f1c4a8eb625ec1425e5f2f11755..53ac82892c164c0d721f1e4a842beaea862c0427 100644 (file)
@@ -65,6 +65,7 @@ req_state::req_state(struct RGWEnv *e) : acl(NULL), os_auth_token(NULL), os_user
   content_length = 0;
   object = NULL;
   bucket_name = NULL;
+  has_bad_meta = false;
 }
 
 req_state::~req_state() {
index c395dc6e61b7c233274528da4978eec43e71b53f..a215423393266c4b4ea0ee3c8d6dda778fdd1641 100644 (file)
@@ -511,6 +511,7 @@ struct req_state {
    string bucket_owner;
 
    map<string, string> x_meta_map;
+   bool has_bad_meta;
 
    RGWUserInfo user; 
    RGWAccessControlPolicy *acl;
index 8c7ab3a065453ac7877298ce47810c3200496810..21456d5e4593764bed4816120314a2639492ed3a 100644 (file)
@@ -112,7 +112,7 @@ static void format_xattr(std::string &xattr)
  * attrs: will be filled up with attrs mapped as <attr_name, attr_contents>
  *
  */
-void get_request_metadata(struct req_state *s, map<string, bufferlist>& attrs)
+static void get_request_metadata(struct req_state *s, map<string, bufferlist>& attrs)
 {
   map<string, string>::iterator iter;
   for (iter = s->x_meta_map.begin(); iter != s->x_meta_map.end(); ++iter) {
index e736103bb3616ef1e0c2c774ab0c6966fe053b51..4e935855221a1a0a649665416a04ea0e37186a6b 100644 (file)
@@ -20,9 +20,6 @@ using namespace std;
 
 struct req_state;
 
-/** Get the HTTP request metadata */
-extern void get_request_metadata(struct req_state *s, map<string, bufferlist>& attrs);
-
 /**
  * Provide the base class for all ops.
  */
@@ -275,6 +272,7 @@ public:
   int verify_permission();
   void execute();
 
+  virtual int get_params() = 0;
   virtual void send_response() = 0;
 };
 
index 1912d6066b660f1836f2a5111b8fa3ca65f02ddf..19102033dca5ef2785cacdedd513c9eeb80f4050 100644 (file)
@@ -56,6 +56,7 @@ const static struct rgw_html_errors RGW_HTML_ERRORS[] = {
     { ENOTEMPTY, 409, "BucketNotEmpty" },
     { ERR_PRECONDITION_FAILED, 412, "PreconditionFailed" },
     { ERANGE, 416, "InvalidRange" },
+    { ERR_UNPROCESSABLE_ENTITY, 422, "UnprocessableEntity" },
     { ERR_INTERNAL_ERROR, 500, "InternalError" },
 };
 
@@ -65,7 +66,6 @@ const static struct rgw_html_errors RGW_HTML_SWIFT_ERRORS[] = {
     { ERR_USER_SUSPENDED, 401, "UserSuspended" },
     { ERR_INVALID_UTF8, 412, "Invalid UTF8" },
     { ERR_BAD_URL, 412, "Bad URL" },
-    { ERR_UNPROCESSABLE_ENTITY, 422, "UnprocessableEntity" },
 };
 
 #define ARRAY_LEN(arr) (sizeof(arr) / sizeof(arr[0]))
@@ -598,7 +598,7 @@ struct str_len meta_prefixes[] = { STR_LEN_ENTRY("HTTP_X_AMZ"),
                                    STR_LEN_ENTRY("HTTP_X_OBJECT"),
                                    {NULL, 0} };
 
-static void init_auth_info(struct req_state *s)
+static int init_auth_info(struct req_state *s)
 {
   const char *p;
 
@@ -614,9 +614,13 @@ static void init_auth_info(struct req_state *s)
         const char *eq = strchr(name, '=');
         if (!eq) /* shouldn't happen! */
           continue;
-        int name_len = eq - name + 1;
+        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, "%s%s", meta_prefixes[0].str + 5 /* skip HTTP_ */, name); // normalize meta prefix
+        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] != '_')
@@ -648,6 +652,7 @@ static void init_auth_info(struct req_state *s)
     dout(10) << "x>> " << iter->first << ":" << iter->second << dendl;
   }
 
+  return 0;
 }
 
 static bool looks_like_ip_address(const char *bucket)
index e5bdefd9f70e5e03cc3a407d6fbc88686fedbb47..5a0f9782faebcdb26109b9ffc6147b4c4f27e5ce 100644 (file)
@@ -238,8 +238,11 @@ void RGWDeleteBucket_REST_SWIFT::send_response()
 
 int RGWPutObj_REST_SWIFT::get_params()
 {
+  if (s->has_bad_meta)
+    return -EINVAL;
+
   supplied_etag = s->env->get("HTTP_ETAG");
-  return 0;
+  return RGWPutObj_REST::get_params();
 }
 
 void RGWPutObj_REST_SWIFT::send_response()
@@ -253,6 +256,13 @@ void RGWPutObj_REST_SWIFT::send_response()
   flush_formatter_to_req_state(s, s->formatter);
 }
 
+int RGWPutObjMetadata_REST_SWIFT::get_params()
+{
+  if (s->has_bad_meta)
+    return -EINVAL;
+  return 0;
+}
+
 void RGWPutObjMetadata_REST_SWIFT::send_response()
 {
   if (!ret)
index 63bbcb769ab03d8b4b608bf9a21ef0c7178ee349..10af388554831af728a2f1249e1548b46df64468 100644 (file)
@@ -86,6 +86,7 @@ public:
   RGWPutObjMetadata_REST_SWIFT() {}
   ~RGWPutObjMetadata_REST_SWIFT() {}
 
+  int get_params();
   void send_response();
 };