summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-06-14 18:06:12 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-06-14 18:06:12 -0700
commit5ff2059758bdf625e7cf194224a8c67b52a45892 (patch)
tree3aac94e14aac4a9ffef53bbd8af35efdcba81d7d
parent10c0ae979e6ac6e7ca1f3cf5be633c914dbc5857 (diff)
downloadceph-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.cc70
-rw-r--r--src/rgw/rgw_common.h1
-rw-r--r--src/rgw/rgw_rest.cc107
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;
}