Handle response-* params that set response header field values.
Fixes #2734, #2735.
Backport: argonaut
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
NameVal nv(nameval);
int ret = nv.parse();
if (ret >= 0) {
- val_map[nv.get_name()] = nv.get_val();
-
- if ((nv.get_name().compare("acl") == 0) ||
- (nv.get_name().compare("location") == 0) ||
- (nv.get_name().compare("uploads") == 0) ||
- (nv.get_name().compare("partNumber") == 0) ||
- (nv.get_name().compare("uploadId") == 0) ||
- (nv.get_name().compare("versionid") == 0) ||
- (nv.get_name().compare("torrent") == 0)) {
- sub_resources[nv.get_name()] = nv.get_val();
+ string& name = nv.get_name();
+ string& val = nv.get_val();
+ val_map[name] = val;
+
+ if ((name.compare("acl") == 0) ||
+ (name.compare("location") == 0) ||
+ (name.compare("uploads") == 0) ||
+ (name.compare("partNumber") == 0) ||
+ (name.compare("uploadId") == 0) ||
+ (name.compare("versionId") == 0) ||
+ (name.compare("torrent") == 0)) {
+ sub_resources[name] = val;
+ } else if (name[0] == 'r') { // root of all evil
+ if ((name.compare("response-content-type") == 0) ||
+ (name.compare("response-content-language") == 0) ||
+ (name.compare("response-expires") == 0) ||
+ (name.compare("response-cache-control") == 0) ||
+ (name.compare("response-content-disposition") == 0) ||
+ (name.compare("response-content-encoding") == 0)) {
+ sub_resources[name] = val;
+ has_resp_modifier = true;
+ }
}
}
return 0;
}
-string& XMLArgs::get(string& name)
+string& XMLArgs::get(string& name, bool *exists)
{
map<string, string>::iterator iter;
iter = val_map.find(name);
- if (iter == val_map.end())
- return empty_str;
- return iter->second;
+ bool e = (iter != val_map.end());
+ if (exists)
+ *exists = e;
+ if (e)
+ return iter->second;
+ return empty_str;
}
-string& XMLArgs::get(const char *name)
+string& XMLArgs::get(const char *name, bool *exists)
{
string s(name);
- return get(s);
+ return get(s, exists);
}
bool verify_bucket_permission(struct req_state *s, int perm)
string str, empty_str;
map<string, string> val_map;
map<string, string> sub_resources;
+
+ bool has_resp_modifier;
public:
- XMLArgs() {}
- XMLArgs(string s) : str(s) {}
+ XMLArgs() : has_resp_modifier(false) {}
/** Set the arguments; as received */
- void set(string s) { val_map.clear(); sub_resources.clear(); str = s; }
+ void set(string s) {
+ has_resp_modifier = false;
+ val_map.clear();
+ sub_resources.clear();
+ str = s;
+ }
/** parse the received arguments */
int parse();
/** Get the value for a specific argument parameter */
- string& get(string& name);
- string& get(const char *name);
+ string& get(string& name, bool *exists = NULL);
+ string& get(const char *name, bool *exists = NULL);
/** see if a parameter is contained in this XMLArgs */
bool exists(const char *name) {
map<string, string>::iterator iter = val_map.find(name);
return (iter != sub_resources.end());
}
map<string, string>& get_sub_resources() { return sub_resources; }
+
+ bool has_response_modifier() {
+ return has_resp_modifier;
+ }
};
class RGWConf;
int RGWGetObj_REST_S3::send_response(bufferlist& bl)
{
+ string content_type_str;
const char *content_type = NULL;
int orig_ret = ret;
}
}
+ if (s->args.has_response_modifier()) {
+ bool exists;
+ content_type_str = s->args.get("response-content-type", &exists);
+ if (exists)
+ content_type = content_type_str.c_str();
+ string val = s->args.get("response-content-language", &exists);
+ if (exists)
+ CGI_PRINTF(s, "Content-Language: %s\n", val.c_str());
+ val = s->args.get("response-expires", &exists);
+ if (exists)
+ CGI_PRINTF(s, "Expires: %s\n", val.c_str());
+ val = s->args.get("response-cache-control", &exists);
+ if (exists)
+ CGI_PRINTF(s, "Cache-Control: %s\n", val.c_str());
+ val = s->args.get("response-content-disposition", &exists);
+ if (exists)
+ CGI_PRINTF(s, "Content-Disposition: %s\n", val.c_str());
+ val = s->args.get("response-content-encoding", &exists);
+ if (exists)
+ CGI_PRINTF(s, "Content-Encoding: %s\n", val.c_str());
+ }
+
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) {