This is needed for later request forwarding.
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
rgw_dencoder_src = rgw/rgw_dencoder.cc \
rgw/rgw_acl.cc \
rgw/rgw_common.cc \
+ rgw/rgw_env.cc \
rgw/rgw_json_enc.cc
ceph_dencoder_SOURCES = test/encoding/ceph_dencoder.cc ${rgw_dencoder_src} perfglue/disabled_heap_profiler.cc
ceph_rgw_multiparser_LDADD = $(my_radosgw_ldadd)
bin_DEBUGPROGRAMS += ceph_rgw_multiparser
-ceph_rgw_jsonparser_SOURCES = rgw/rgw_jsonparser.cc rgw/rgw_common.cc rgw/rgw_json_enc.cc
+ceph_rgw_jsonparser_SOURCES = rgw/rgw_jsonparser.cc rgw/rgw_common.cc rgw/rgw_env.cc rgw/rgw_json_enc.cc
ceph_rgw_jsonparser_CXXFLAGS = ${CRYPTO_CXXFLAGS} ${AM_CXXFLAGS}
ceph_rgw_jsonparser_LDADD = $(my_radosgw_ldadd)
bin_DEBUGPROGRAMS += ceph_rgw_jsonparser
}
+req_info::req_info(CephContext *cct, struct RGWEnv *e) : env(e) {
+ method = env->get("REQUEST_METHOD");
+ script_uri = env->get("SCRIPT_URI", cct->_conf->rgw_script_uri.c_str());
+ request_uri = env->get("REQUEST_URI", cct->_conf->rgw_request_uri.c_str());
+ int pos = request_uri.find('?');
+ if (pos >= 0) {
+ request_params = request_uri.substr(pos + 1);
+ request_uri = request_uri.substr(0, pos);
+ }
+ host = env->get("HTTP_HOST");
+}
+
+
req_state::req_state(CephContext *_cct, struct RGWEnv *e) : cct(_cct), cio(NULL), op(OP_UNKNOWN),
bucket_cors(NULL), has_acl_header(false),
- os_auth_token(NULL), env(e)
+ os_auth_token(NULL), info(_cct, e)
{
- enable_ops_log = env->conf->enable_ops_log;
- enable_usage_log = env->conf->enable_usage_log;
+ enable_ops_log = e->conf->enable_ops_log;
+ enable_usage_log = e->conf->enable_usage_log;
content_started = false;
format = 0;
formatter = NULL;
object = NULL;
bucket_name = NULL;
has_bad_meta = false;
- host = NULL;
- method = NULL;
length = NULL;
copy_source = NULL;
http_auth = NULL;
void generate_new_write_ver(CephContext *cct);
};
+struct req_info {
+ RGWEnv *env;
+ XMLArgs args;
+ map<string, string> x_meta_map;
+
+ const char *host;
+ const char *method;
+ string script_uri;
+ string request_uri;
+ string request_params;
+
+ req_info(CephContext *cct, RGWEnv *_env);
+};
+
/** Store all the state necessary to complete and respond to an HTTP request*/
struct req_state {
CephContext *cct;
ceph::Formatter *formatter;
string decoded_uri;
string effective_uri;
- string request_uri;
- string script_uri;
- string request_params;
- const char *host;
- const char *method;
const char *length;
uint64_t content_length;
map<string, string> generic_attrs;
uint32_t perm_mask;
utime_t header_time;
- XMLArgs args;
-
const char *bucket_name;
const char *object;
RGWObjVersionTracker objv_tracker;
- map<string, string> x_meta_map;
bool has_bad_meta;
RGWUserInfo user;
utime_t time;
- struct RGWEnv *env;
-
void *obj_ctx;
string dialect;
string req_id;
+ req_info info;
+
req_state(CephContext *_cct, struct RGWEnv *e);
~req_state();
};
static void set_param_str(struct req_state *s, const char *name, string& str)
{
- const char *p = s->env->get(name);
+ const char *p = s->info.env->get(name);
if (p)
str = p;
}
}
void log(struct req_state *s, const char *msg) {
- if (s->method && req_str.size() == 0) {
- req_str = s->method;
+ if (s->info.method && req_str.size() == 0) {
+ req_str = s->info.method;
req_str.append(" ");
- req_str.append(s->request_uri);
+ req_str.append(s->info.request_uri);
}
utime_t t = ceph_clock_now(g_ceph_context) - ts;
dout(2) << "req " << id << ":" << t << ":" << s->dialect << ":" << req_str << ":" << (op ? op->name() : "") << ":" << msg << dendl;
* attrs: will be filled up with attrs mapped as <attr_name, attr_contents>
*
*/
-void rgw_get_request_metadata(struct req_state *s, map<string, bufferlist>& attrs)
+static void rgw_get_request_metadata(CephContext *cct, struct req_info& info, map<string, bufferlist>& attrs)
{
map<string, string>::iterator iter;
- for (iter = s->x_meta_map.begin(); iter != s->x_meta_map.end(); ++iter) {
+ for (iter = info.x_meta_map.begin(); iter != info.x_meta_map.end(); ++iter) {
const string &name(iter->first);
string &xattr(iter->second);
- ldout(s->cct, 10) << "x>> " << name << ":" << xattr << dendl;
+ ldout(cct, 10) << "x>> " << name << ":" << xattr << dendl;
format_xattr(xattr);
string attr_name(RGW_ATTR_PREFIX);
attr_name.append(name);
static int read_policy(RGWRados *store, struct req_state *s, RGWBucketInfo& bucket_info, RGWAccessControlPolicy *policy, rgw_bucket& bucket, string& object)
{
string upload_id;
- upload_id = s->args.get("uploadId");
+ upload_id = s->info.args.get("uploadId");
string oid = object;
rgw_obj obj;
string oid = s->object_str;
string upload_id;
- upload_id = s->args.get("uploadId");
+ upload_id = s->info.args.get("uploadId");
mp.init(oid, upload_id);
- part_num = s->args.get("partNumber");
+ part_num = s->info.args.get("partNumber");
if (part_num.empty()) {
return -EINVAL;
}
{
RGWPutObjProcessor *processor;
- bool multipart = s->args.exists("uploadId");
+ bool multipart = s->info.args.exists("uploadId");
uint64_t part_size = s->cct->_conf->rgw_obj_stripe_size;
attrbl.append(val.c_str(), val.size() + 1);
}
- rgw_get_request_metadata(s, attrs);
+ rgw_get_request_metadata(s->cct, s->info, attrs);
ret = processor->complete(etag, attrs);
done:
if (ret < 0)
return;
- rgw_get_request_metadata(s, attrs);
+ rgw_get_request_metadata(s->cct, s->info, attrs);
/* no need to track object versioning, need it for bucket's data only */
RGWObjVersionTracker *ptracker = (s->object ? NULL : &s->objv_tracker);
dest_policy.encode(aclbl);
attrs[RGW_ATTR_ACL] = aclbl;
- rgw_get_request_metadata(s, attrs);
+ rgw_get_request_metadata(s->cct, s->info, attrs);
map<string, string>::iterator iter;
for (iter = s->generic_attrs.begin(); iter != s->generic_attrs.end(); ++iter) {
ret = -EACCES;
return;
}
- req_meth = s->env->get("HTTP_ACCESS_CONTROL_REQUEST_METHOD");
+ req_meth = s->info.env->get("HTTP_ACCESS_CONTROL_REQUEST_METHOD");
if (!req_meth) {
dout(0) <<
"Preflight request without mandatory Access-control-request-method header"
ret = -EACCES;
return;
}
- origin = s->env->get("HTTP_ORIGIN");
+ origin = s->info.env->get("HTTP_ORIGIN");
if (!origin) {
dout(0) <<
"Preflight request without mandatory Origin header"
ret = -EACCES;
return;
}
- req_hdrs = s->env->get("HTTP_ACCESS_CONTROL_ALLOW_HEADERS");
+ req_hdrs = s->info.env->get("HTTP_ACCESS_CONTROL_ALLOW_HEADERS");
ret = validate_cors_request();
if (!rule) {
origin = req_meth = NULL;
attrbl.append(val.c_str(), val.size() + 1);
}
- rgw_get_request_metadata(s, attrs);
+ rgw_get_request_metadata(s->cct, s->info, attrs);
do {
char buf[33];
ret = -EINVAL;
string upload_id;
string meta_oid;
- upload_id = s->args.get("uploadId");
+ upload_id = s->info.args.get("uploadId");
map<uint32_t, RGWUploadPartInfo> obj_parts;
map<uint32_t, RGWUploadPartInfo>::iterator obj_iter;
RGWAccessControlPolicy policy(s->cct);
if (s->prot_flags & RGW_REST_SWIFT) {
string path_args;
- path_args = s->args.get("path");
+ path_args = s->info.args.get("path");
if (!path_args.empty()) {
if (!delimiter.empty() || !prefix.empty()) {
ret = -EINVAL;
struct req_state;
class RGWHandler;
-void rgw_get_request_metadata(struct req_state *s, map<string, bufferlist>& attrs);
-
/**
* Provide the base class for all ops.
void dump_uri_from_state(struct req_state *s)
{
- if (strcmp(s->request_uri.c_str(), "/") == 0) {
+ if (strcmp(s->info.request_uri.c_str(), "/") == 0) {
string location = "http://";
- string server = s->env->get("SERVER_NAME", "<SERVER_NAME>");
+ string server = s->info.env->get("SERVER_NAME", "<SERVER_NAME>");
location.append(server);
location += "/";
if (!s->bucket_name_str.empty()) {
}
}
else {
- s->cio->print("Location: \"%s\"\n", s->request_uri.c_str());
+ s->cio->print("Location: \"%s\"\n", s->info.request_uri.c_str());
}
}
int RGWGetObj_ObjStore::get_params()
{
- range_str = s->env->get("HTTP_RANGE");
- if_mod = s->env->get("HTTP_IF_MODIFIED_SINCE");
- if_unmod = s->env->get("HTTP_IF_UNMODIFIED_SINCE");
- if_match = s->env->get("HTTP_IF_MATCH");
- if_nomatch = s->env->get("HTTP_IF_NONE_MATCH");
+ range_str = s->info.env->get("HTTP_RANGE");
+ if_mod = s->info.env->get("HTTP_IF_MODIFIED_SINCE");
+ if_unmod = s->info.env->get("HTTP_IF_UNMODIFIED_SINCE");
+ if_match = s->info.env->get("HTTP_IF_MATCH");
+ if_nomatch = s->info.env->get("HTTP_IF_NONE_MATCH");
return 0;
}
int RESTArgs::get_string(struct req_state *s, const string& name, const string& def_val, string *val, bool *existed)
{
bool exists;
- *val = s->args.get(name, &exists);
+ *val = s->info.args.get(name, &exists);
if (existed)
*existed = exists;
int RESTArgs::get_uint64(struct req_state *s, const string& name, uint64_t def_val, uint64_t *val, bool *existed)
{
bool exists;
- string sval = s->args.get(name, &exists);
+ string sval = s->info.args.get(name, &exists);
if (existed)
*existed = exists;
int RESTArgs::get_int64(struct req_state *s, const string& name, int64_t def_val, int64_t *val, bool *existed)
{
bool exists;
- string sval = s->args.get(name, &exists);
+ string sval = s->info.args.get(name, &exists);
if (existed)
*existed = exists;
int RESTArgs::get_uint32(struct req_state *s, const string& name, uint32_t def_val, uint32_t *val, bool *existed)
{
bool exists;
- string sval = s->args.get(name, &exists);
+ string sval = s->info.args.get(name, &exists);
if (existed)
*existed = exists;
int RESTArgs::get_int32(struct req_state *s, const string& name, int32_t def_val, int32_t *val, bool *existed)
{
bool exists;
- string sval = s->args.get(name, &exists);
+ string sval = s->info.args.get(name, &exists);
if (existed)
*existed = exists;
int RESTArgs::get_time(struct req_state *s, const string& name, const utime_t& def_val, utime_t *val, bool *existed)
{
bool exists;
- string sval = s->args.get(name, &exists);
+ string sval = s->info.args.get(name, &exists);
if (existed)
*existed = exists;
int RESTArgs::get_epoch(struct req_state *s, const string& name, uint64_t def_val, uint64_t *epoch, bool *existed)
{
bool exists;
- string date = s->args.get(name, &exists);
+ string date = s->info.args.get(name, &exists);
if (existed)
*existed = exists;
int RESTArgs::get_bool(struct req_state *s, const string& name, bool def_val, bool *val, bool *existed)
{
bool exists;
- string sval = s->args.get(name, &exists);
+ string sval = s->info.args.get(name, &exists);
if (existed)
*existed = exists;
int RGWPutObj_ObjStore::get_params()
{
- supplied_md5_b64 = s->env->get("HTTP_CONTENT_MD5");
+ supplied_md5_b64 = s->info.env->get("HTTP_CONTENT_MD5");
return 0;
}
}
if (!ofs)
- supplied_md5_b64 = s->env->get("HTTP_CONTENT_MD5");
+ supplied_md5_b64 = s->info.env->get("HTTP_CONTENT_MD5");
return len;
}
return ret;
data[len] = '\0';
} else if (!s->length) {
- const char *encoding = s->env->get("HTTP_TRANSFER_ENCODING");
+ const char *encoding = s->info.env->get("HTTP_TRANSFER_ENCODING");
if (!encoding || strcmp(encoding, "chunked") != 0)
return -ERR_LENGTH_REQUIRED;
int RGWCompleteMultipart_ObjStore::get_params()
{
- upload_id = s->args.get("uploadId");
+ upload_id = s->info.args.get("uploadId");
if (upload_id.empty()) {
ret = -ENOTSUP;
int RGWListMultipart_ObjStore::get_params()
{
- upload_id = s->args.get("uploadId");
+ upload_id = s->info.args.get("uploadId");
if (upload_id.empty()) {
ret = -ENOTSUP;
}
- string str = s->args.get("part-number-marker");
+ string str = s->info.args.get("part-number-marker");
if (!str.empty())
marker = atoi(str.c_str());
- str = s->args.get("max-parts");
+ str = s->info.args.get("max-parts");
if (!str.empty())
max_parts = atoi(str.c_str());
int RGWListBucketMultiparts_ObjStore::get_params()
{
- delimiter = s->args.get("delimiter");
- prefix = s->args.get("prefix");
- string str = s->args.get("max-parts");
+ delimiter = s->info.args.get("delimiter");
+ prefix = s->info.args.get("prefix");
+ string str = s->info.args.get("max-parts");
if (!str.empty())
max_uploads = atoi(str.c_str());
else
max_uploads = default_max;
- string key_marker = s->args.get("key-marker");
- string upload_id_marker = s->args.get("upload-id-marker");
+ string key_marker = s->info.args.get("key-marker");
+ string upload_id_marker = s->info.args.get("upload-id-marker");
if (!key_marker.empty())
marker.init(key_marker, upload_id_marker);
{
const char *p;
- s->x_meta_map.clear();
+ s->info.x_meta_map.clear();
const char **envp = s->cio->envp();
line_unfold(eq + 1, val);
map<string, string>::iterator iter;
- iter = s->x_meta_map.find(name_low);
- if (iter != s->x_meta_map.end()) {
+ 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->x_meta_map[name_low] = old;
+ s->info.x_meta_map[name_low] = old;
} else {
- s->x_meta_map[name_low] = val;
+ s->info.x_meta_map[name_low] = val;
}
}
}
}
map<string, string>::iterator iter;
- for (iter = s->x_meta_map.begin(); iter != s->x_meta_map.end(); ++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;
}
{
s->format = default_type;
if (configurable) {
- string format_str = s->args.get("format");
+ string format_str = s->info.args.get("format");
if (format_str.compare("xml") == 0) {
s->format = RGW_FORMAT_XML;
} else if (format_str.compare("json") == 0) {
case OP_PUT:
case OP_POST:
/* is it a 'multi-object delete' request? */
- if (s->request_params == "delete") {
+ if (s->info.request_params == "delete") {
only_bucket = true;
break;
}
int RGWREST::preprocess(struct req_state *s, RGWClientIO *cio)
{
+ req_info& info = s->info;
+
s->cio = cio;
- s->script_uri = s->env->get("SCRIPT_URI", s->cct->_conf->rgw_script_uri.c_str());
- s->request_uri = s->env->get("REQUEST_URI", s->cct->_conf->rgw_request_uri.c_str());
- int pos = s->request_uri.find('?');
- if (pos >= 0) {
- s->request_params = s->request_uri.substr(pos + 1);
- s->request_uri = s->request_uri.substr(0, pos);
- }
- s->host = s->env->get("HTTP_HOST");
- if (g_conf->rgw_dns_name.length() && s->host) {
- string h(s->host);
+ if (g_conf->rgw_dns_name.length() && info.host) {
+ string h(s->info.host);
- ldout(s->cct, 10) << "host=" << s->host << " rgw_dns_name=" << g_conf->rgw_dns_name << dendl;
- pos = h.find(g_conf->rgw_dns_name);
+ ldout(s->cct, 10) << "host=" << s->info.host << " rgw_dns_name=" << g_conf->rgw_dns_name << dendl;
+ int pos = h.find(g_conf->rgw_dns_name);
if (g_conf->rgw_resolve_cname && pos < 0) {
string cname;
if (pos > 0 && h[pos - 1] == '.') {
string encoded_bucket = "/";
encoded_bucket.append(h.substr(0, pos-1));
- if (s->request_uri[0] != '/')
+ if (s->info.request_uri[0] != '/')
encoded_bucket.append("/'");
- encoded_bucket.append(s->request_uri);
- s->request_uri = encoded_bucket;
+ encoded_bucket.append(s->info.request_uri);
+ s->info.request_uri = encoded_bucket;
}
}
- url_decode(s->request_uri, s->decoded_uri);
- s->method = s->env->get("REQUEST_METHOD");
- s->length = s->env->get("CONTENT_LENGTH");
+ url_decode(s->info.request_uri, s->decoded_uri);
+ s->length = info.env->get("CONTENT_LENGTH");
if (s->length) {
if (*s->length == '\0')
s->content_length = 0;
map<string, string>::iterator giter;
for (giter = generic_attrs_map.begin(); giter != generic_attrs_map.end(); ++giter) {
- const char *env = s->env->get(giter->first.c_str());
+ const char *env = info.env->get(giter->first.c_str());
if (env) {
s->generic_attrs[giter->second] = env;
}
}
- s->http_auth = s->env->get("HTTP_AUTHORIZATION");
+ s->http_auth = info.env->get("HTTP_AUTHORIZATION");
if (g_conf->rgw_print_continue) {
- const char *expect = s->env->get("HTTP_EXPECT");
+ const char *expect = info.env->get("HTTP_EXPECT");
s->expect_cont = (expect && !strcasecmp(expect, "100-continue"));
}
- s->op = op_from_method(s->method);
+ s->op = op_from_method(info.method);
init_meta_info(s);
RGWOp *RGWHandler_Bucket::op_get()
{
- if (s->args.sub_resource_exists("policy"))
+ if (s->info.args.sub_resource_exists("policy"))
return new RGWOp_Get_Policy;
- if (s->args.sub_resource_exists("index"))
+ if (s->info.args.sub_resource_exists("index"))
return new RGWOp_Check_Bucket_Index;
return new RGWOp_Bucket_Info;
RGWOp *RGWHandler_Bucket::op_delete()
{
- if (s->args.sub_resource_exists("object"))
+ if (s->info.args.sub_resource_exists("object"))
return new RGWOp_Object_Remove;
return new RGWOp_Bucket_Remove;
static inline void frame_metadata_key(req_state *s, string& out) {
bool exists;
- string key = s->args.get("key", &exists);
+ string key = s->info.args.get("key", &exists);
string metadata_key;
string section;
bl.append(data, read_len);
} else {
int chunk_size = CEPH_PAGE_SIZE;
- const char *enc = s->env->get("HTTP_TRANSFER_ENCODING");
+ const char *enc = s->info.env->get("HTTP_TRANSFER_ENCODING");
if (!enc || strcmp(enc, "chunked")) {
return -ERR_LENGTH_REQUIRED;
}
}
RGWOp *RGWHandler_Metadata::op_get() {
- if (s->args.exists("key"))
+ if (s->info.args.exists("key"))
return new RGWOp_Metadata_Get;
else
return new RGWOp_Metadata_List;
for (struct response_attr_param *p = resp_attr_params; p->param; p++) {
bool exists;
- string val = s->args.get(p->param, &exists);
+ string val = s->info.args.get(p->param, &exists);
if (exists) {
if (strcmp(p->param, "response-content-type") != 0) {
response_attrs[p->http_attr] = val;
int RGWListBucket_ObjStore_S3::get_params()
{
- prefix = s->args.get("prefix");
- marker = s->args.get("marker");
- max_keys = s->args.get("max-keys");
+ prefix = s->info.args.get("prefix");
+ marker = s->info.args.get("marker");
+ max_keys = s->info.args.get("max-keys");
ret = parse_max_keys();
if (ret < 0) {
return ret;
}
- delimiter = s->args.get("delimiter");
+ delimiter = s->info.args.get("delimiter");
return 0;
}
if (!s->canned_acl.empty())
return -ERR_INVALID_REQUEST;
- return s3policy.create_from_headers(store, s->env, s->owner);
+ return s3policy.create_from_headers(store, s->info.env, s->owner);
}
return s3policy.create_canned(s->owner, s->bucket_owner, s->canned_acl);
int RGWPostObj_ObjStore_S3::get_params()
{
// get the part boundary
- string req_content_type_str = s->env->get("CONTENT_TYPE", "");
+ string req_content_type_str = s->info.env->get("CONTENT_TYPE", "");
string req_content_type;
map<string, string> params;
if (ret == STATUS_CREATED) {
s->formatter->open_object_section("PostResponse");
if (g_conf->rgw_dns_name.length())
- s->formatter->dump_format("Location", "%s/%s", s->script_uri.c_str(), s->object_str.c_str());
+ s->formatter->dump_format("Location", "%s/%s", s->info.script_uri.c_str(), s->object_str.c_str());
s->formatter->dump_string("Bucket", s->bucket_name);
s->formatter->dump_string("Key", s->object_str.c_str());
s->formatter->close_section();
int RGWCopyObj_ObjStore_S3::get_params()
{
- if_mod = s->env->get("HTTP_X_AMZ_COPY_IF_MODIFIED_SINCE");
- if_unmod = s->env->get("HTTP_X_AMZ_COPY_IF_UNMODIFIED_SINCE");
- if_match = s->env->get("HTTP_X_AMZ_COPY_IF_MATCH");
- if_nomatch = s->env->get("HTTP_X_AMZ_COPY_IF_NONE_MATCH");
+ if_mod = s->info.env->get("HTTP_X_AMZ_COPY_IF_MODIFIED_SINCE");
+ if_unmod = s->info.env->get("HTTP_X_AMZ_COPY_IF_UNMODIFIED_SINCE");
+ if_match = s->info.env->get("HTTP_X_AMZ_COPY_IF_MATCH");
+ if_nomatch = s->info.env->get("HTTP_X_AMZ_COPY_IF_NONE_MATCH");
const char *req_src = s->copy_source;
if (!req_src)
dest_bucket_name = s->bucket.name;
dest_object = s->object_str;
- const char *md_directive = s->env->get("HTTP_X_AMZ_METADATA_DIRECTIVE");
+ const char *md_directive = s->info.env->get("HTTP_X_AMZ_METADATA_DIRECTIVE");
if (md_directive) {
if (strcasecmp(md_directive, "COPY") == 0) {
replace_attrs = false;
RGWOp *RGWHandler_ObjStore_Bucket_S3::op_get()
{
- if (s->args.sub_resource_exists("logging"))
+ if (s->info.args.sub_resource_exists("logging"))
return new RGWGetBucketLogging_ObjStore_S3;
if (is_acl_op()) {
return new RGWGetACLs_ObjStore_S3;
} else if (is_cors_op()) {
return new RGWGetCORS_ObjStore_S3;
- } else if (s->args.exists("uploads")) {
+ } else if (s->info.args.exists("uploads")) {
return new RGWListBucketMultiparts_ObjStore_S3;
}
return get_obj_op(true);
{
if (is_acl_op()) {
return new RGWGetACLs_ObjStore_S3;
- } else if (s->args.exists("uploads")) {
+ } else if (s->info.args.exists("uploads")) {
return new RGWListBucketMultiparts_ObjStore_S3;
}
return get_obj_op(false);
RGWOp *RGWHandler_ObjStore_Bucket_S3::op_put()
{
- if (s->args.sub_resource_exists("logging"))
+ if (s->info.args.sub_resource_exists("logging"))
return NULL;
if (is_acl_op()) {
return new RGWPutACLs_ObjStore_S3;
RGWOp *RGWHandler_ObjStore_Bucket_S3::op_post()
{
- if ( s->request_params == "delete" ) {
+ if ( s->info.request_params == "delete" ) {
return new RGWDeleteMultiObj_ObjStore_S3;
}
{
if (is_acl_op()) {
return new RGWGetACLs_ObjStore_S3;
- } else if (s->args.exists("uploadId")) {
+ } else if (s->info.args.exists("uploadId")) {
return new RGWListMultipart_ObjStore_S3;
}
return get_obj_op(true);
{
if (is_acl_op()) {
return new RGWGetACLs_ObjStore_S3;
- } else if (s->args.exists("uploadId")) {
+ } else if (s->info.args.exists("uploadId")) {
return new RGWListMultipart_ObjStore_S3;
}
return get_obj_op(false);
RGWOp *RGWHandler_ObjStore_Obj_S3::op_delete()
{
- string upload_id = s->args.get("uploadId");
+ string upload_id = s->info.args.get("uploadId");
if (upload_id.empty())
return new RGWDeleteObj_ObjStore_S3;
RGWOp *RGWHandler_ObjStore_Obj_S3::op_post()
{
- if (s->args.exists("uploadId"))
+ if (s->info.args.exists("uploadId"))
return new RGWCompleteMultipart_ObjStore_S3;
- if (s->args.exists("uploads"))
+ if (s->info.args.exists("uploads"))
return new RGWInitMultipart_ObjStore_S3;
return NULL;
if (*req_name == '?') {
p = req_name;
} else {
- p = s->request_params.c_str();
+ p = s->info.request_params.c_str();
}
- s->args.set(p);
- s->args.parse();
+ s->info.args.set(p);
+ s->info.args.parse();
/* must be called after the args parsing */
int ret = allocate_formatter(s, default_formatter, configurable_format);
if (ret)
return ret;
- const char *cacl = s->env->get("HTTP_X_AMZ_ACL");
+ const char *cacl = s->info.env->get("HTTP_X_AMZ_ACL");
if (cacl)
s->canned_acl = cacl;
- s->has_acl_header = s->env->exists_prefix("HTTP_X_AMZ_GRANT");
+ s->has_acl_header = s->info.env->exists_prefix("HTTP_X_AMZ_GRANT");
- s->copy_source = s->env->get("HTTP_X_AMZ_COPY_SOURCE");
+ s->copy_source = s->info.env->get("HTTP_X_AMZ_COPY_SOURCE");
s->dialect = "s3";
* get the header authentication information required to
* compute a request's signature
*/
-static bool get_auth_header(struct req_state *s, string& dest, bool qsr)
+static bool get_auth_header(req_info& info, utime_t& header_time, string& dest, bool qsr)
{
- const char *content_md5 = s->env->get("HTTP_CONTENT_MD5");
+ const char *content_md5 = info.env->get("HTTP_CONTENT_MD5");
if (content_md5) {
for (const char *p = content_md5; *p; p++) {
if (!is_base64_for_content_md5(*p)) {
}
}
- const char *content_type = s->env->get("CONTENT_TYPE");
+ const char *content_type = info.env->get("CONTENT_TYPE");
string date;
if (qsr) {
- date = s->args.get("Expires");
+ date = info.args.get("Expires");
} else {
- const char *str = s->env->get("HTTP_DATE");
+ const char *str = info.env->get("HTTP_DATE");
const char *req_date = str;
if (str) {
date = str;
} else {
- req_date = s->env->get("HTTP_X_AMZ_DATE");
+ req_date = info.env->get("HTTP_X_AMZ_DATE");
if (!req_date) {
dout(0) << "NOTICE: missing date for auth header" << dendl;
return false;
dout(0) << "NOTICE: bad date (predates epoch): " << req_date << dendl;
return false;
}
- s->header_time = utime_t(timegm(&t), 0);
+ header_time = utime_t(timegm(&t), 0);
}
- map<string, string>& meta_map = s->x_meta_map;
- map<string, string>& sub_resources = s->args.get_sub_resources();
+ map<string, string>& meta_map = info.x_meta_map;
+ map<string, string>& sub_resources = info.args.get_sub_resources();
- rgw_create_s3_auth_header(s->method, content_md5, content_type, date.c_str(),
- meta_map, s->request_uri.c_str(), sub_resources,
+ rgw_create_s3_auth_header(info.method, content_md5, content_type, date.c_str(),
+ meta_map, info.request_uri.c_str(), sub_resources,
dest);
return true;
time(&now);
if (!s->http_auth || !(*s->http_auth)) {
- auth_id = s->args.get("AWSAccessKeyId");
+ auth_id = s->info.args.get("AWSAccessKeyId");
if (auth_id.size()) {
- auth_sign = s->args.get("Signature");
+ auth_sign = s->info.args.get("Signature");
- string date = s->args.get("Expires");
+ string date = s->info.args.get("Expires");
time_t exp = atoll(date.c_str());
if (now >= exp)
return -EPERM;
/* now verify signature */
string auth_hdr;
- if (!get_auth_header(s, auth_hdr, qsr)) {
+ if (!get_auth_header(s->info, s->header_time, auth_hdr, qsr)) {
dout(10) << "failed to create auth header\n" << auth_hdr << dendl;
return -EPERM;
}
return -EPERM;
if (s->user.system) {
- string effective_uid = s->args.get("rgwx-uid");
+ string effective_uid = s->info.args.get("rgwx-uid");
RGWUserInfo effective_user;
if (!effective_uid.empty()) {
ret = rgw_get_user_info_by_uid(store, effective_uid, effective_user);
class RGWHandler_ObjStore_Bucket_S3 : public RGWHandler_ObjStore_S3 {
protected:
bool is_acl_op() {
- return s->args.exists("acl");
+ return s->info.args.exists("acl");
}
bool is_cors_op() {
- return s->args.exists("cors");
+ return s->info.args.exists("cors");
}
bool is_obj_update_op() {
return is_acl_op() || is_cors_op();
class RGWHandler_ObjStore_Obj_S3 : public RGWHandler_ObjStore_S3 {
protected:
bool is_acl_op() {
- return s->args.exists("acl");
+ return s->info.args.exists("acl");
}
bool is_cors_op() {
- return s->args.exists("cors");
+ return s->info.args.exists("cors");
}
bool is_obj_update_op() {
return is_acl_op();
int RGWListBuckets_ObjStore_SWIFT::get_params()
{
- marker = s->args.get("marker");
+ marker = s->info.args.get("marker");
string limit_str;
- limit_str = s->args.get("limit");
+ limit_str = s->info.args.get("limit");
long l = strtol(limit_str.c_str(), NULL, 10);
if (l > (long)limit_max || l < 0)
return -ERR_PRECONDITION_FAILED;
if (need_stats) {
bool stats, exists;
- int r = s->args.get_bool("stats", &stats, &exists);
+ int r = s->info.args.get_bool("stats", &stats, &exists);
if (r < 0)
return r;
int RGWListBucket_ObjStore_SWIFT::get_params()
{
- prefix = s->args.get("prefix");
- marker = s->args.get("marker");
- max_keys = s->args.get("limit");
+ prefix = s->info.args.get("prefix");
+ marker = s->info.args.get("marker");
+ max_keys = s->info.args.get("limit");
ret = parse_max_keys();
if (ret < 0) {
return ret;
if (max > default_max)
return -ERR_PRECONDITION_FAILED;
- delimiter = s->args.get("delimiter");
+ delimiter = s->info.args.get("delimiter");
string path_args;
- if (s->args.exists("path")) { // should handle empty path
- path_args = s->args.get("path");
+ if (s->info.args.exists("path")) { // should handle empty path
+ path_args = s->info.args.get("path");
if (!delimiter.empty() || !prefix.empty()) {
return -EINVAL;
}
return -EINVAL;
if (!s->length) {
- const char *encoding = s->env->get("HTTP_TRANSFER_ENCODING");
+ const char *encoding = s->info.env->get("HTTP_TRANSFER_ENCODING");
if (!encoding || strcmp(encoding, "chunked") != 0)
return -ERR_LENGTH_REQUIRED;
chunked_upload = true;
}
- supplied_etag = s->env->get("HTTP_ETAG");
+ supplied_etag = s->info.env->get("HTTP_ETAG");
if (!s->generic_attrs.count(RGW_ATTR_CONTENT_TYPE)) {
dout(5) << "content type wasn't provided, trying to guess" << dendl;
policy.create_default(s->user.user_id, s->user.display_name);
- obj_manifest = s->env->get("HTTP_X_OBJECT_MANIFEST");
+ obj_manifest = s->info.env->get("HTTP_X_OBJECT_MANIFEST");
return RGWPutObj_ObjStore::get_params();
}
if (!s->object) {
string read_list, write_list;
- const char *read_attr = s->env->get("HTTP_X_CONTAINER_READ");
+ const char *read_attr = s->info.env->get("HTTP_X_CONTAINER_READ");
if (read_attr) {
read_list = read_attr;
}
- const char *write_attr = s->env->get("HTTP_X_CONTAINER_WRITE");
+ const char *write_attr = s->info.env->get("HTTP_X_CONTAINER_WRITE");
if (write_attr) {
write_list = write_attr;
}
}
/*Check and update CORS configuration*/
- const char *allow_origins = s->env->get("HTTP_X_CONTAINER_META_ACCESS_CONTROL_ALLOW_ORIGIN");
- const char *allow_headers = s->env->get("HTTP_X_CONTAINER_META_ACCESS_CONTROL_ALLOW_HEADERS");
- const char *expose_headers = s->env->get("HTTP_X_CONTAINER_META_ACCESS_CONTROL_EXPOSE_HEADERS");
- const char *max_age = s->env->get("HTTP_X_CONTAINER_META_ACCESS_CONTROL_MAX_AGE");
+ const char *allow_origins = s->info.env->get("HTTP_X_CONTAINER_META_ACCESS_CONTROL_ALLOW_ORIGIN");
+ const char *allow_headers = s->info.env->get("HTTP_X_CONTAINER_META_ACCESS_CONTROL_ALLOW_HEADERS");
+ const char *expose_headers = s->info.env->get("HTTP_X_CONTAINER_META_ACCESS_CONTROL_EXPOSE_HEADERS");
+ const char *max_age = s->info.env->get("HTTP_X_CONTAINER_META_ACCESS_CONTROL_MAX_AGE");
if (allow_origins) {
RGWCORSConfiguration_SWIFT *swift_cors = new RGWCORSConfiguration_SWIFT;
int r = swift_cors->create_update(allow_origins, allow_headers, expose_headers, max_age);
int RGWCopyObj_ObjStore_SWIFT::get_params()
{
- if_mod = s->env->get("HTTP_IF_MODIFIED_SINCE");
- if_unmod = s->env->get("HTTP_IF_UNMODIFIED_SINCE");
- if_match = s->env->get("HTTP_COPY_IF_MATCH");
- if_nomatch = s->env->get("HTTP_COPY_IF_NONE_MATCH");
+ if_mod = s->info.env->get("HTTP_IF_MODIFIED_SINCE");
+ if_unmod = s->info.env->get("HTTP_IF_UNMODIFIED_SINCE");
+ if_match = s->info.env->get("HTTP_COPY_IF_MATCH");
+ if_nomatch = s->info.env->get("HTTP_COPY_IF_NONE_MATCH");
if (s->op == OP_COPY) {
- const char *req_dest = s->env->get("HTTP_DESTINATION");
+ const char *req_dest = s->info.env->get("HTTP_DESTINATION");
if (!req_dest)
return -ERR_BAD_URL;
if (*req_name == '?') {
p = req_name;
} else {
- p = s->request_params.c_str();
+ p = s->info.request_params.c_str();
}
- s->args.set(p);
- s->args.parse();
+ s->info.args.set(p);
+ s->info.args.parse();
if (*req_name != '/')
return 0;
string ver;
next_tok(req, ver, '/');
- s->os_auth_token = s->env->get("HTTP_X_AUTH_TOKEN");
+ s->os_auth_token = s->info.env->get("HTTP_X_AUTH_TOKEN");
next_tok(req, first, '/');
dout(10) << "ver=" << ver << " first=" << first << " req=" << req << dendl;
if (ret)
return ret;
- s->copy_source = s->env->get("HTTP_X_COPY_FROM");
+ s->copy_source = s->info.env->get("HTTP_X_COPY_FROM");
s->dialect = "swift";
if (max_buckets != RGW_DEFAULT_MAX_BUCKETS)
op_state.set_max_buckets(max_buckets);
- if (s->args.exists("suspended"))
+ if (s->info.args.exists("suspended"))
op_state.set_suspension(suspended);
- if (s->args.exists("system"))
+ if (s->info.args.exists("system"))
op_state.set_system(system);
if (gen_key)
op_state.set_key_type(key_type);
}
- if (s->args.exists("suspended"))
+ if (s->info.args.exists("suspended"))
op_state.set_suspension(suspended);
- if (s->args.exists("system"))
+ if (s->info.args.exists("system"))
op_state.set_system(system);
http_ret = RGWUserAdminOp_User::modify(store, op_state, flusher);
RGWOp *RGWHandler_User::op_put()
{
- if (s->args.sub_resource_exists("subuser"))
+ if (s->info.args.sub_resource_exists("subuser"))
return new RGWOp_Subuser_Create;
- if (s->args.sub_resource_exists("key"))
+ if (s->info.args.sub_resource_exists("key"))
return new RGWOp_Key_Create;
- if (s->args.sub_resource_exists("caps"))
+ if (s->info.args.sub_resource_exists("caps"))
return new RGWOp_Caps_Add;
return new RGWOp_User_Create;
RGWOp *RGWHandler_User::op_post()
{
- if (s->args.sub_resource_exists("subuser"))
+ if (s->info.args.sub_resource_exists("subuser"))
return new RGWOp_Subuser_Modify;
return new RGWOp_User_Modify;
RGWOp *RGWHandler_User::op_delete()
{
- if (s->args.sub_resource_exists("subuser"))
+ if (s->info.args.sub_resource_exists("subuser"))
return new RGWOp_Subuser_Remove;
- if (s->args.sub_resource_exists("key"))
+ if (s->info.args.sub_resource_exists("key"))
return new RGWOp_Key_Remove;
- if (s->args.sub_resource_exists("caps"))
+ if (s->info.args.sub_resource_exists("caps"))
return new RGWOp_Caps_Remove;
return new RGWOp_User_Remove;
{
int ret = -EPERM;
- const char *key = s->env->get("HTTP_X_AUTH_KEY");
- const char *user = s->env->get("HTTP_X_AUTH_USER");
+ const char *key = s->info.env->get("HTTP_X_AUTH_KEY");
+ const char *user = s->info.env->get("HTTP_X_AUTH_USER");
string user_str;
RGWUserInfo info;
if (swift_url.size() == 0) {
bool add_port = false;
- const char *server_port = s->env->get("SERVER_PORT_SECURE");
+ const char *server_port = s->info.env->get("SERVER_PORT_SECURE");
const char *protocol;
if (server_port) {
add_port = (strcmp(server_port, "443") != 0);
protocol = "https";
} else {
- server_port = s->env->get("SERVER_PORT");
+ server_port = s->info.env->get("SERVER_PORT");
add_port = (strcmp(server_port, "80") != 0);
protocol = "http";
}
- const char *host = s->env->get("HTTP_HOST");
+ const char *host = s->info.env->get("HTTP_HOST");
if (!host) {
dout(0) << "NOTICE: server is misconfigured, missing rgw_swift_url_prefix or rgw_swift_url, HTTP_HOST is not set" << dendl;
ret = -EINVAL;