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());
}
}
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;
}
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());
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)
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; j<len; j++) {
- name_low[j] = tolower(name[j]);
- if (name_low[j] == '_')
+ if (name_low[j] != '_')
+ name_low[j] = tolower(name_low[j]);
+ else
name_low[j] = '-';
}
name_low[j] = 0;
s->fcgx = 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);
vector<RGWObjEnt>::iterator iter = objs.begin();
map<string, bool>::iterator pref_iter = common_prefixes.begin();
+ dump_start(s);
+
s->formatter->open_array_section("container");
while (iter != objs.end() || pref_iter != common_prefixes.end()) {
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();
}
set_req_state_err(s, ret);
dump_errno(s);
-
- dump_start(s);
end_header(s);
if (ret < 0) {
return;
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();
}