From: Yehuda Sadeh Date: Thu, 27 Oct 2011 21:31:16 +0000 (-0700) Subject: rgw: swift related adjustments X-Git-Tag: v0.38~40 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=354055f8767f418dffaab87c8ef3994d937f96b7;p=ceph.git rgw: swift related adjustments --- diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index c9aa697ec412..53ac82892c16 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -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() { diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index c395dc6e61b7..a21542339326 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -511,6 +511,7 @@ struct req_state { string bucket_owner; map x_meta_map; + bool has_bad_meta; RGWUserInfo user; RGWAccessControlPolicy *acl; diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 8c7ab3a06545..21456d5e4593 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -112,7 +112,7 @@ static void format_xattr(std::string &xattr) * attrs: will be filled up with attrs mapped as * */ -void get_request_metadata(struct req_state *s, map& attrs) +static void get_request_metadata(struct req_state *s, map& attrs) { map::iterator iter; for (iter = s->x_meta_map.begin(); iter != s->x_meta_map.end(); ++iter) { diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index e736103bb361..4e935855221a 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -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& 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; }; diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index 1912d6066b66..19102033dca5 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -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) diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index e5bdefd9f70e..5a0f9782faeb 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -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) diff --git a/src/rgw/rgw_rest_swift.h b/src/rgw/rgw_rest_swift.h index 63bbcb769ab0..10af38855483 100644 --- a/src/rgw/rgw_rest_swift.h +++ b/src/rgw/rgw_rest_swift.h @@ -86,6 +86,7 @@ public: RGWPutObjMetadata_REST_SWIFT() {} ~RGWPutObjMetadata_REST_SWIFT() {} + int get_params(); void send_response(); };