diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-14 18:06:12 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-14 18:06:12 -0700 |
commit | 5ff2059758bdf625e7cf194224a8c67b52a45892 (patch) | |
tree | 3aac94e14aac4a9ffef53bbd8af35efdcba81d7d | |
parent | 10c0ae979e6ac6e7ca1f3cf5be633c914dbc5857 (diff) | |
download | ceph-5ff2059758bdf625e7cf194224a8c67b52a45892.tar.gz |
rgw: cleanup, move init_meta_info() into req_info
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r-- | src/rgw/rgw_common.cc | 70 | ||||
-rw-r--r-- | src/rgw/rgw_common.h | 1 | ||||
-rw-r--r-- | src/rgw/rgw_rest.cc | 107 |
3 files changed, 72 insertions, 106 deletions
diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index 31bb200e615..45c63c3c470 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -162,6 +162,76 @@ req_state::~req_state() { free((void *)bucket_name); } +struct str_len { + const char *str; + int len; +}; + +#define STR_LEN_ENTRY(s) { s, sizeof(s) - 1 } + +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_RGW"), + STR_LEN_ENTRY("HTTP_X_OBJECT"), + STR_LEN_ENTRY("HTTP_X_CONTAINER"), + {NULL, 0} }; + + +int req_info::init_meta_info(bool *found_bad_meta) +{ + x_meta_map.clear(); + + map<string, string>& m = env->get_map(); + map<string, string>::iterator iter; + for (iter = m.begin(); iter != m.end(); ++iter) { + const char *prefix; + const string& header_name = iter->first; + const string& val = iter->second; + for (int prefix_num = 0; (prefix = meta_prefixes[prefix_num].str) != NULL; prefix_num++) { + int len = meta_prefixes[prefix_num].len; + const char *p = header_name.c_str(); + if (strncmp(p, prefix, len) == 0) { + dout(10) << "meta>> " << p << dendl; + const char *name = p+len; /* skip the prefix */ + int name_len = header_name.size() - len; + + if (found_bad_meta && strncmp(name, "_META_", name_len) == 0) + *found_bad_meta = true; + + char name_low[meta_prefixes[0].len + name_len + 1]; + 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] != '_') + name_low[j] = tolower(name_low[j]); + else + name_low[j] = '-'; + } + name_low[j] = 0; + + map<string, string>::iterator iter; + iter = x_meta_map.find(name_low); + if (iter != x_meta_map.end()) { + string old = iter->second; + int pos = old.find_last_not_of(" \t"); /* get rid of any whitespaces after the value */ + old = old.substr(0, pos + 1); + old.append(","); + old.append(val); + x_meta_map[name_low] = old; + } else { + x_meta_map[name_low] = val; + } + } + } + } + for (iter = x_meta_map.begin(); iter != x_meta_map.end(); ++iter) { + dout(10) << "x>> " << iter->first << ":" << iter->second << dendl; + } + + return 0; +} + std::ostream& operator<<(std::ostream& oss, const rgw_err &err) { oss << "rgw_err(http_ret=" << err.http_ret << ", s3='" << err.s3_code << "') "; diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index 151b7667556..148623c6677 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -686,6 +686,7 @@ struct req_info { req_info(CephContext *cct, RGWEnv *_env); void rebuild_from(req_info& src); + int init_meta_info(bool *found_nad_meta); }; /** Store all the state necessary to complete and respond to an HTTP request*/ diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index d2c277446fd..b1578989d4b 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -959,111 +959,6 @@ int RGWRESTOp::verify_permission() return check_caps(s->user.caps); } -static void line_unfold(const char *line, string& sdest) -{ - char dest[strlen(line) + 1]; - const char *p = line; - char *d = dest; - - while (isspace(*p)) - ++p; - - bool last_space = false; - - while (*p) { - switch (*p) { - case '\n': - case '\r': - *d = ' '; - if (!last_space) - ++d; - last_space = true; - break; - default: - *d = *p; - ++d; - last_space = false; - break; - } - ++p; - } - *d = 0; - sdest = dest; -} - -struct str_len { - const char *str; - int len; -}; - -#define STR_LEN_ENTRY(s) { s, sizeof(s) - 1 } - -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_RGW"), - STR_LEN_ENTRY("HTTP_X_OBJECT"), - STR_LEN_ENTRY("HTTP_X_CONTAINER"), - {NULL, 0} }; - -static int init_meta_info(struct req_state *s) -{ - const char *p; - - s->info.x_meta_map.clear(); - - const char **envp = s->cio->envp(); - - for (int i=0; (p = envp[i]); ++i) { - const char *prefix; - for (int prefix_num = 0; (prefix = meta_prefixes[prefix_num].str) != NULL; prefix_num++) { - int len = meta_prefixes[prefix_num].len; - if (strncmp(p, prefix, len) == 0) { - dout(10) << "meta>> " << p << dendl; - const char *name = p+len; /* skip the prefix */ - const char *eq = strchr(name, '='); - if (!eq) /* shouldn't happen! */ - continue; - 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 + 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] != '_') - name_low[j] = tolower(name_low[j]); - else - name_low[j] = '-'; - } - name_low[j] = 0; - string val; - line_unfold(eq + 1, val); - - map<string, string>::iterator iter; - iter = s->info.x_meta_map.find(name_low); - if (iter != s->info.x_meta_map.end()) { - string old = iter->second; - int pos = old.find_last_not_of(" \t"); /* get rid of any whitespaces after the value */ - old = old.substr(0, pos + 1); - old.append(","); - old.append(val); - s->info.x_meta_map[name_low] = old; - } else { - s->info.x_meta_map[name_low] = val; - } - } - } - } - map<string, string>::iterator iter; - for (iter = s->info.x_meta_map.begin(); iter != s->info.x_meta_map.end(); ++iter) { - dout(10) << "x>> " << iter->first << ":" << iter->second << dendl; - } - - return 0; -} int RGWHandler_ObjStore::allocate_formatter(struct req_state *s, int default_type, bool configurable) { @@ -1306,7 +1201,7 @@ int RGWREST::preprocess(struct req_state *s, RGWClientIO *cio) } s->op = op_from_method(info.method); - init_meta_info(s); + info.init_meta_info(&s->has_bad_meta); return 0; } |