From ba165fec6c2bc86e9bb3695ab99eb087b1cf9bba Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Tue, 18 Oct 2011 16:41:24 -0700 Subject: [PATCH] rgw: some swift obj metadata related fixes --- src/rgw/rgw_common.cc | 4 +++- src/rgw/rgw_rest.cc | 24 ++++++++++++++---------- src/rgw/rgw_rest_swift.cc | 22 ++++++++++++++++------ 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index 20fb7a0f88d79..c9aa697ec4126 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -333,7 +333,7 @@ bool url_decode(string& src_str, string& dest_str) int pos = 0; char c; - dout(10) << "src=" << (void *)src << dendl; + dout(10) << "src=" << src << dendl; while (*src) { if (*src != '%') { @@ -363,5 +363,7 @@ bool url_decode(string& src_str, string& dest_str) dest[pos] = 0; dest_str = dest; + dout(10) << "dest=" << dest << dendl; + return true; } diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index 10e44bfd3659a..dadfed2f74557 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -516,11 +516,11 @@ static int init_entities_from_header(struct req_state *s) if (first.size() == 0) goto done; - url_decode(first, s->bucket_name_str); + s->bucket_name_str = first; s->bucket_name = strdup(s->bucket_name_str.c_str()); if (req.size()) { - url_decode(req, s->object_str); + s->object_str = req; s->object = strdup(s->object_str.c_str()); } @@ -528,10 +528,10 @@ static int init_entities_from_header(struct req_state *s) } if (!s->bucket_name) { - url_decode(first, s->bucket_name_str); + s->bucket_name_str = first; s->bucket_name = strdup(s->bucket_name_str.c_str()); } else { - url_decode(req, s->object_str); + s->object_str = first; s->object = strdup(s->object_str.c_str()); goto done; } @@ -541,7 +541,7 @@ static int init_entities_from_header(struct req_state *s) if (pos >= 0) { string encoded_obj_str = req.substr(pos+1); - url_decode(encoded_obj_str, s->object_str); + s->object_str = encoded_obj_str; if (s->object_str.size() > 0) { s->object = strdup(s->object_str.c_str()); @@ -594,6 +594,7 @@ struct str_len { struct str_len meta_prefixes[] = { STR_LEN_ENTRY("HTTP_X_AMZ"), STR_LEN_ENTRY("HTTP_X_GOOG"), STR_LEN_ENTRY("HTTP_X_DHO"), + STR_LEN_ENTRY("HTTP_X_OBJECT"), {NULL, 0} }; static void init_auth_info(struct req_state *s) @@ -608,16 +609,18 @@ static void init_auth_info(struct req_state *s) int len = meta_prefixes[prefix_num].len; if (strncmp(p, prefix, len) == 0) { dout(10) << "meta>> " << p << dendl; - const char *name = p+5; /* skip the HTTP_ part */ + const char *name = p+len; /* skip the prefix */ const char *eq = strchr(name, '='); if (!eq) /* shouldn't happen! */ continue; - int len = eq - name; - char name_low[len + 1]; + int len = eq - name + 1; + char name_low[meta_prefixes[0].len + len + 1]; + len = snprintf(name_low, meta_prefixes[0].len - 5 + len, "%s%s", meta_prefixes[0].str + 5 /* skip HTTP_ */, name); // normalize meta prefix int j; for (j=0; jfcgx = fcgx; s->path_name = s->env->get("SCRIPT_NAME"); s->path_name_url = s->env->get("REQUEST_URI"); + url_decode(s->path_name_url, s->path_name_url); int pos = s->path_name_url.find('?'); if (pos >= 0) { s->path_name_url = s->path_name_url.substr(0, pos); diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index cae73d1334827..45155e1abd333 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -95,6 +95,8 @@ void RGWListBucket_REST_SWIFT::send_response() vector::iterator iter = objs.begin(); map::iterator pref_iter = common_prefixes.begin(); + dump_start(s); + s->formatter->open_array_section("container"); while (iter != objs.end() || pref_iter != common_prefixes.end()) { @@ -117,8 +119,18 @@ void RGWListBucket_REST_SWIFT::send_response() s->formatter->dump_format("name", iter->name.c_str()); s->formatter->dump_format("hash", "\"%s\"", iter->etag.c_str()); s->formatter->dump_int("bytes", iter->size); - if (iter->content_type.size()) - s->formatter->dump_format("content_type", iter->content_type.c_str()); + string single_content_type = iter->content_type; + if (iter->content_type.size()) { + // content type might hold multiple values, just dump the last one + size_t pos = iter->content_type.rfind(','); + if (pos > 0) { + ++pos; + while (single_content_type[pos] == ' ') + ++pos; + single_content_type = single_content_type.substr(pos); + } + s->formatter->dump_format("content_type", single_content_type.c_str()); + } dump_time(s, "last_modified", &iter->mtime); s->formatter->close_section(); } @@ -143,8 +155,6 @@ void RGWListBucket_REST_SWIFT::send_response() set_req_state_err(s, ret); dump_errno(s); - - dump_start(s); end_header(s); if (ret < 0) { return; @@ -276,8 +286,8 @@ int RGWGetObj_REST_SWIFT::send_response(void *handle) 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) { - name += sizeof(RGW_ATTR_PREFIX) - 1; - CGI_PRINTF(s,"%s: %s\r\n", name, iter->second.c_str()); + name += sizeof(RGW_ATTR_META_PREFIX) - 1; + CGI_PRINTF(s,"X-Object-Meta-%s: %s\r\n", name, iter->second.c_str()); } else if (!content_type && strcmp(name, RGW_ATTR_CONTENT_TYPE) == 0) { content_type = iter->second.c_str(); } -- 2.39.5