mirror of
https://github.com/ceph/ceph
synced 2025-04-26 12:48:43 +00:00
rgw: implement POST key can use ${filename}
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
This commit is contained in:
parent
d7b59429f2
commit
ca1e1776fc
@ -631,7 +631,7 @@ int RGWPostObj_ObjStore_S3::read_form_part_header(struct post_form_part *part,
|
|||||||
|
|
||||||
part->fields[field_name] = field;
|
part->fields[field_name] = field;
|
||||||
|
|
||||||
if (field_name.compare("Content-Disposition") == 0) {
|
if (stringcasecmp(field_name, "Content-Disposition") == 0) {
|
||||||
part->name = field.params["name"];
|
part->name = field.params["name"];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -666,6 +666,20 @@ bool RGWPostObj_ObjStore_S3::part_bl(const string& name, bufferlist *pbl)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RGWPostObj_ObjStore_S3::rebuild_key(string& key)
|
||||||
|
{
|
||||||
|
static string var = "${filename}";
|
||||||
|
int pos = key.find(var);
|
||||||
|
if (pos < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
string new_key = key.substr(0, pos);
|
||||||
|
new_key.append(filename);
|
||||||
|
new_key.append(key.substr(pos + var.size()));
|
||||||
|
|
||||||
|
key = new_key;
|
||||||
|
}
|
||||||
|
|
||||||
int RGWPostObj_ObjStore_S3::get_params()
|
int RGWPostObj_ObjStore_S3::get_params()
|
||||||
{
|
{
|
||||||
string temp_line;
|
string temp_line;
|
||||||
@ -721,12 +735,12 @@ int RGWPostObj_ObjStore_S3::get_params()
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
map<string, struct post_part_field>::iterator piter;
|
if (s->cct->_conf->subsys.should_gather(ceph_subsys_rgw, 20)) {
|
||||||
|
map<string, struct post_part_field, ltstr_nocase>::iterator piter;
|
||||||
for (piter = part.fields.begin(); piter != part.fields.end(); ++piter) {
|
for (piter = part.fields.begin(); piter != part.fields.end(); ++piter) {
|
||||||
ldout(s->cct, 20) << "read part header: name=" << part.name << " content_type=" << part.content_type << dendl;
|
ldout(s->cct, 20) << "read part header: name=" << part.name << " content_type=" << part.content_type << dendl;
|
||||||
ldout(s->cct, 20) << "name=" << piter->first << dendl;
|
ldout(s->cct, 20) << "name=" << piter->first << dendl;
|
||||||
ldout(s->cct, 20) << "val=" << piter->second.val << dendl;
|
ldout(s->cct, 20) << "val=" << piter->second.val << dendl;
|
||||||
if (s->cct->_conf->subsys.should_gather(ceph_subsys_rgw, 20)) {
|
|
||||||
ldout(s->cct, 20) << "params:" << dendl;
|
ldout(s->cct, 20) << "params:" << dendl;
|
||||||
map<string, string>& params = piter->second.params;
|
map<string, string>& params = piter->second.params;
|
||||||
for (iter = params.begin(); iter != params.end(); ++iter) {
|
for (iter = params.begin(); iter != params.end(); ++iter) {
|
||||||
@ -739,6 +753,11 @@ int RGWPostObj_ObjStore_S3::get_params()
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (stringcasecmp(part.name, "file") == 0) { /* beginning of data transfer */
|
if (stringcasecmp(part.name, "file") == 0) { /* beginning of data transfer */
|
||||||
|
struct post_part_field& field = part.fields["Content-Disposition"];
|
||||||
|
map<string, string>::iterator iter = field.params.find("filename");
|
||||||
|
if (iter != field.params.end()) {
|
||||||
|
filename = iter->second;
|
||||||
|
}
|
||||||
parts[part.name] = part;
|
parts[part.name] = part;
|
||||||
data_pending = true;
|
data_pending = true;
|
||||||
break;
|
break;
|
||||||
@ -757,6 +776,8 @@ int RGWPostObj_ObjStore_S3::get_params()
|
|||||||
if (!part_str("key", &s->object_str))
|
if (!part_str("key", &s->object_str))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
rebuild_key(s->object_str);
|
||||||
|
|
||||||
part_str("Content-Type", &content_type);
|
part_str("Content-Type", &content_type);
|
||||||
env.add_var("Content-Type", content_type);
|
env.add_var("Content-Type", content_type);
|
||||||
|
|
||||||
|
@ -90,12 +90,13 @@ struct post_part_field {
|
|||||||
struct post_form_part {
|
struct post_form_part {
|
||||||
string name;
|
string name;
|
||||||
string content_type;
|
string content_type;
|
||||||
map<string, struct post_part_field> fields;
|
map<string, struct post_part_field, ltstr_nocase> fields;
|
||||||
bufferlist data;
|
bufferlist data;
|
||||||
};
|
};
|
||||||
|
|
||||||
class RGWPostObj_ObjStore_S3 : public RGWPostObj_ObjStore {
|
class RGWPostObj_ObjStore_S3 : public RGWPostObj_ObjStore {
|
||||||
string boundary;
|
string boundary;
|
||||||
|
string filename;
|
||||||
bufferlist in_data;
|
bufferlist in_data;
|
||||||
map<string, post_form_part, const ltstr_nocase> parts;
|
map<string, post_form_part, const ltstr_nocase> parts;
|
||||||
RGWPolicyEnv env;
|
RGWPolicyEnv env;
|
||||||
@ -115,6 +116,7 @@ class RGWPostObj_ObjStore_S3 : public RGWPostObj_ObjStore {
|
|||||||
bool part_bl(const string& name, bufferlist *pbl);
|
bool part_bl(const string& name, bufferlist *pbl);
|
||||||
|
|
||||||
int get_policy();
|
int get_policy();
|
||||||
|
void rebuild_key(string& key);
|
||||||
public:
|
public:
|
||||||
RGWPostObj_ObjStore_S3() {}
|
RGWPostObj_ObjStore_S3() {}
|
||||||
~RGWPostObj_ObjStore_S3() {}
|
~RGWPostObj_ObjStore_S3() {}
|
||||||
|
Loading…
Reference in New Issue
Block a user