summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-10-22 12:27:51 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-10-22 12:27:51 -0700
commit5cf31bf9e7a0a031fa853274dfd3ef376b27db56 (patch)
tree69c6e5f35ab87525bbf494c93b60641b1cae75a9
parent3445810f1f2254b707879f32842a40d279888c49 (diff)
parent771b0c58d5581cd56c0952be627f33b632eb7ae3 (diff)
downloadceph-5cf31bf9e7a0a031fa853274dfd3ef376b27db56.tar.gz
Merge branch 'wip-6606' into next
Reviewed-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/rgw/rgw_common.cc3
-rw-r--r--src/rgw/rgw_common.h3
-rw-r--r--src/rgw/rgw_log.cc8
-rw-r--r--src/rgw/rgw_op.cc6
-rw-r--r--src/rgw/rgw_op.h5
-rw-r--r--src/rgw/rgw_rest.cc5
-rw-r--r--src/rgw/rgw_rest_metadata.cc4
-rw-r--r--src/rgw/rgw_rest_s3.cc46
-rw-r--r--src/rgw/rgw_rest_swift.cc64
9 files changed, 72 insertions, 72 deletions
diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc
index c872314fe4e..0b2d0035992 100644
--- a/src/rgw/rgw_common.cc
+++ b/src/rgw/rgw_common.cc
@@ -135,7 +135,6 @@ req_state::req_state(CephContext *_cct, class RGWEnv *e) : cct(_cct), cio(NULL),
object_acl = NULL;
expect_cont = false;
- bucket_name = NULL;
object = NULL;
header_ended = false;
@@ -149,7 +148,6 @@ req_state::req_state(CephContext *_cct, class RGWEnv *e) : cct(_cct), cio(NULL),
perm_mask = 0;
content_length = 0;
object = NULL;
- bucket_name = NULL;
has_bad_meta = false;
length = NULL;
copy_source = NULL;
@@ -164,7 +162,6 @@ req_state::~req_state() {
delete bucket_acl;
delete object_acl;
free((void *)object);
- free((void *)bucket_name);
}
struct str_len {
diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h
index baf60001a8b..b3d39e57c2d 100644
--- a/src/rgw/rgw_common.h
+++ b/src/rgw/rgw_common.h
@@ -819,12 +819,13 @@ struct req_state {
uint32_t perm_mask;
utime_t header_time;
- const char *bucket_name;
const char *object;
rgw_bucket bucket;
string bucket_name_str;
string object_str;
+ string src_bucket_name;
+ string src_object;
ACLOwner bucket_owner;
ACLOwner owner;
diff --git a/src/rgw/rgw_log.cc b/src/rgw/rgw_log.cc
index 7b75441efce..9398dd04d73 100644
--- a/src/rgw/rgw_log.cc
+++ b/src/rgw/rgw_log.cc
@@ -171,7 +171,7 @@ static void log_usage(struct req_state *s, const string& op_name)
string user;
- if (s->bucket_name)
+ if (!s->bucket_name_str.empty())
user = s->bucket_owner.get_id();
else
user = s->user.user_id;
@@ -267,7 +267,7 @@ int rgw_log_op(RGWRados *store, struct req_state *s, const string& op_name, OpsL
if (!s->enable_ops_log)
return 0;
- if (!s->bucket_name) {
+ if (s->bucket_name_str.empty()) {
ldout(s->cct, 5) << "nothing to log for operation" << dendl;
return -EINVAL;
}
@@ -280,9 +280,9 @@ int rgw_log_op(RGWRados *store, struct req_state *s, const string& op_name, OpsL
} else {
bucket_id = s->bucket.bucket_id;
}
- entry.bucket = s->bucket_name;
+ entry.bucket = s->bucket_name_str;
- if (check_utf8(s->bucket_name, entry.bucket.size()) != 0) {
+ if (check_utf8(s->bucket_name_str.c_str(), entry.bucket.size()) != 0) {
ldout(s->cct, 5) << "not logging op on bucket with non-utf8 name" << dendl;
return 0;
}
diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc
index 2e07e3fcde6..aa7ff9bb3f5 100644
--- a/src/rgw/rgw_op.cc
+++ b/src/rgw/rgw_op.cc
@@ -339,7 +339,7 @@ static int rgw_build_policies(RGWRados *store, struct req_state *s, bool only_bu
s->local_source = store->region.equals(region);
}
}
-
+
if (s->bucket_name_str.size()) {
s->bucket_exists = true;
if (s->bucket_instance_id.empty()) {
@@ -1212,7 +1212,7 @@ void RGWDeleteBucket::execute()
{
ret = -EINVAL;
- if (!s->bucket_name)
+ if (s->bucket_name_str.empty())
return;
RGWObjVersionTracker ot;
@@ -1706,8 +1706,6 @@ bool RGWCopyObj::parse_copy_location(const char *src, string& bucket_name, strin
url_decode(url_src, dec_src);
src = dec_src.c_str();
- ldout(s->cct, 15) << "decoded obj=" << src << dendl;
-
if (*src == '/') ++src;
string str(src);
diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h
index eee5ea99065..41ee2e88f9b 100644
--- a/src/rgw/rgw_op.h
+++ b/src/rgw/rgw_op.h
@@ -460,9 +460,6 @@ protected:
int init_common();
-protected:
- bool parse_copy_location(const char *src, string& bucket_name, string& object);
-
public:
RGWCopyObj() {
if_mod = NULL;
@@ -482,6 +479,8 @@ public:
last_ofs = 0;
}
+ static bool parse_copy_location(const char *src, string& bucket_name, string& object);
+
virtual void init(RGWRados *store, struct req_state *s, RGWHandler *h) {
RGWOp::init(store, s, h);
dest_policy.set_ctx(s->cct);
diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc
index 4aa1d401211..30cb0d9b66e 100644
--- a/src/rgw/rgw_rest.cc
+++ b/src/rgw/rgw_rest.cc
@@ -906,7 +906,7 @@ int RGWListBucketMultiparts_ObjStore::get_params()
int RGWDeleteMultiObj_ObjStore::get_params()
{
- bucket_name = s->bucket_name;
+ bucket_name = s->bucket_name_str;
if (bucket_name.empty()) {
ret = -EINVAL;
@@ -1060,6 +1060,7 @@ int RGWHandler_ObjStore::read_permissions(RGWOp *op_obj)
break;
case OP_PUT:
case OP_POST:
+ case OP_COPY:
/* is it a 'multi-object delete' request? */
if (s->info.request_params == "delete") {
only_bucket = true;
@@ -1077,8 +1078,6 @@ int RGWHandler_ObjStore::read_permissions(RGWOp *op_obj)
case OP_DELETE:
only_bucket = true;
break;
- case OP_COPY: // op itself will read and verify the permissions
- return 0;
case OP_OPTIONS:
only_bucket = true;
break;
diff --git a/src/rgw/rgw_rest_metadata.cc b/src/rgw/rgw_rest_metadata.cc
index fc1d6ded166..5036235ebd2 100644
--- a/src/rgw/rgw_rest_metadata.cc
+++ b/src/rgw/rgw_rest_metadata.cc
@@ -33,8 +33,8 @@ static inline void frame_metadata_key(req_state *s, string& out) {
string metadata_key;
string section;
- if (s->bucket_name) {
- section = s->bucket_name;
+ if (!s->bucket_name_str.empty()) {
+ section = s->bucket_name_str;
} else {
section = key;
key.clear();
diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc
index 83874dd42c4..8ea21d452e6 100644
--- a/src/rgw/rgw_rest_s3.cc
+++ b/src/rgw/rgw_rest_s3.cc
@@ -250,7 +250,7 @@ void RGWListBucket_ObjStore_S3::send_response()
s->formatter->open_object_section_in_ns("ListBucketResult",
"http://s3.amazonaws.com/doc/2006-03-01/");
- s->formatter->dump_string("Name", s->bucket_name);
+ s->formatter->dump_string("Name", s->bucket_name_str);
if (!prefix.empty())
s->formatter->dump_string("Prefix", prefix);
s->formatter->dump_string("Marker", marker);
@@ -1154,7 +1154,7 @@ void RGWPostObj_ObjStore_S3::send_response()
string etag_url;
- url_escape(s->bucket_name, bucket);
+ url_escape(s->bucket_name_str, bucket);
url_escape(s->object_str, key);
url_escape(etag_str, etag_url);
@@ -1204,8 +1204,8 @@ done:
s->formatter->open_object_section("PostResponse");
if (g_conf->rgw_dns_name.length())
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->dump_string("Bucket", s->bucket_name_str);
+ s->formatter->dump_string("Key", s->object_str);
s->formatter->close_section();
}
s->err.message = err_msg;
@@ -1254,18 +1254,8 @@ int RGWCopyObj_ObjStore_S3::get_params()
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) {
- ldout(s->cct, 0) << "copy source is NULL" << dendl;
- return -EINVAL;
- }
-
- ret = parse_copy_location(req_src, src_bucket_name, src_object);
- if (!ret) {
- ldout(s->cct, 0) << "failed to parse copy location" << dendl;
- return -EINVAL;
- }
-
+ src_bucket_name = s->src_bucket_name;
+ src_object = s->src_object;
dest_bucket_name = s->bucket.name;
dest_object = s->object_str;
@@ -1529,7 +1519,7 @@ void RGWInitMultipart_ObjStore_S3::send_response()
dump_start(s);
s->formatter->open_object_section_in_ns("InitiateMultipartUploadResult",
"http://s3.amazonaws.com/doc/2006-03-01/");
- s->formatter->dump_string("Bucket", s->bucket_name);
+ s->formatter->dump_string("Bucket", s->bucket_name_str);
s->formatter->dump_string("Key", s->object);
s->formatter->dump_string("UploadId", upload_id);
s->formatter->close_section();
@@ -1548,8 +1538,8 @@ void RGWCompleteMultipart_ObjStore_S3::send_response()
s->formatter->open_object_section_in_ns("CompleteMultipartUploadResult",
"http://s3.amazonaws.com/doc/2006-03-01/");
if (g_conf->rgw_dns_name.length())
- s->formatter->dump_format("Location", "%s.%s", s->bucket_name, g_conf->rgw_dns_name.c_str());
- s->formatter->dump_string("Bucket", s->bucket_name);
+ s->formatter->dump_format("Location", "%s.%s", s->bucket_name_str.c_str(), g_conf->rgw_dns_name.c_str());
+ s->formatter->dump_string("Bucket", s->bucket_name_str);
s->formatter->dump_string("Key", s->object);
s->formatter->dump_string("ETag", etag);
s->formatter->close_section();
@@ -1586,7 +1576,7 @@ void RGWListMultipart_ObjStore_S3::send_response()
for (i = 0, test_iter = iter; test_iter != parts.end() && i < max_parts; ++test_iter, ++i) {
cur_max = test_iter->first;
}
- s->formatter->dump_string("Bucket", s->bucket_name);
+ s->formatter->dump_string("Bucket", s->bucket_name_str);
s->formatter->dump_string("Key", s->object);
s->formatter->dump_string("UploadId", upload_id);
s->formatter->dump_string("StorageClass", "STANDARD");
@@ -1634,7 +1624,7 @@ void RGWListBucketMultiparts_ObjStore_S3::send_response()
return;
s->formatter->open_object_section("ListMultipartUploadsResult");
- s->formatter->dump_string("Bucket", s->bucket_name);
+ s->formatter->dump_string("Bucket", s->bucket_name_str);
if (!prefix.empty())
s->formatter->dump_string("ListMultipartUploadsResult.Prefix", prefix);
string& key_marker = marker.get_key();
@@ -1920,9 +1910,8 @@ int RGWHandler_ObjStore_S3::init_from_header(struct req_state *s, int default_fo
first = req;
}
- if (!s->bucket_name) {
+ if (s->bucket_name_str.empty()) {
s->bucket_name_str = first;
- s->bucket_name = strdup(s->bucket_name_str.c_str());
if (pos >= 0) {
string encoded_obj_str = req.substr(pos+1);
@@ -1999,7 +1988,7 @@ int RGWHandler_ObjStore_S3::validate_bucket_name(const string& bucket, bool rela
int RGWHandler_ObjStore_S3::init(RGWRados *store, struct req_state *s, RGWClientIO *cio)
{
- dout(10) << "s->object=" << (s->object ? s->object : "<NULL>") << " s->bucket=" << (s->bucket_name ? s->bucket_name : "<NULL>") << dendl;
+ dout(10) << "s->object=" << (s->object ? s->object : "<NULL>") << " s->bucket=" << (!s->bucket_name_str.empty() ? s->bucket_name_str : "<NULL>") << dendl;
bool relaxed_names = s->cct->_conf->rgw_relaxed_s3_bucket_names;
int ret = validate_bucket_name(s->bucket_name_str, relaxed_names);
@@ -2016,6 +2005,13 @@ int RGWHandler_ObjStore_S3::init(RGWRados *store, struct req_state *s, RGWClient
s->has_acl_header = s->info.env->exists_prefix("HTTP_X_AMZ_GRANT");
s->copy_source = s->info.env->get("HTTP_X_AMZ_COPY_SOURCE");
+ if (s->copy_source) {
+ ret = RGWCopyObj::parse_copy_location(s->copy_source, s->src_bucket_name, s->src_object);
+ if (!ret) {
+ ldout(s->cct, 0) << "failed to parse copy location" << dendl;
+ return -EINVAL;
+ }
+ }
s->dialect = "s3";
@@ -2269,7 +2265,7 @@ RGWHandler *RGWRESTMgr_S3::get_handler(struct req_state *s)
if (ret < 0)
return NULL;
- if (!s->bucket_name)
+ if (s->bucket_name_str.empty())
return new RGWHandler_ObjStore_Service_S3;
if (!s->object)
diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc
index 651c4635d37..95d54aef3f9 100644
--- a/src/rgw/rgw_rest_swift.cc
+++ b/src/rgw/rgw_rest_swift.cc
@@ -451,28 +451,10 @@ int RGWCopyObj_ObjStore_SWIFT::get_params()
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->info.env->get("HTTP_DESTINATION");
- if (!req_dest)
- return -ERR_BAD_URL;
-
- ret = parse_copy_location(req_dest, dest_bucket_name, dest_object);
- if (!ret)
- return -ERR_BAD_URL;
- src_bucket_name = s->bucket_name;
- src_object = s->object_str;
- } else {
- const char *req_src = s->copy_source;
- if (!req_src)
- return -ERR_BAD_URL;
-
- ret = parse_copy_location(req_src, src_bucket_name, src_object);
- if (!ret)
- return -ERR_BAD_URL;
-
- dest_bucket_name = s->bucket_name;
- dest_object = s->object_str;
- }
+ src_bucket_name = s->src_bucket_name;
+ src_object = s->src_object;
+ dest_bucket_name = s->bucket_name_str;
+ dest_object = s->object_str;
return 0;
}
@@ -701,7 +683,7 @@ RGWOp *RGWHandler_ObjStore_Obj_SWIFT::op_put()
if (is_acl_op()) {
return new RGWPutACLs_ObjStore_SWIFT;
}
- if (!s->copy_source)
+ if (s->src_bucket_name.empty())
return new RGWPutObj_ObjStore_SWIFT;
else
return new RGWCopyObj_ObjStore_SWIFT;
@@ -857,8 +839,6 @@ int RGWHandler_ObjStore_SWIFT::init_from_header(struct req_state *s)
return 0;
s->bucket_name_str = first;
- s->bucket_name = strdup(s->bucket_name_str.c_str());
-
s->info.effective_uri = "/" + s->bucket_name_str;
@@ -873,7 +853,7 @@ int RGWHandler_ObjStore_SWIFT::init_from_header(struct req_state *s)
int RGWHandler_ObjStore_SWIFT::init(RGWRados *store, struct req_state *s, RGWClientIO *cio)
{
- dout(10) << "s->object=" << (s->object ? s->object : "<NULL>") << " s->bucket=" << (s->bucket_name ? s->bucket_name : "<NULL>") << dendl;
+ dout(10) << "s->object=" << (s->object ? s->object : "<NULL>") << " s->bucket=" << (!s->bucket_name_str.empty() ? s->bucket_name_str : "<NULL>") << dendl;
int ret = validate_bucket_name(s->bucket_name_str.c_str());
if (ret)
@@ -883,9 +863,39 @@ int RGWHandler_ObjStore_SWIFT::init(RGWRados *store, struct req_state *s, RGWCli
return ret;
s->copy_source = s->info.env->get("HTTP_X_COPY_FROM");
+ if (s->copy_source) {
+ bool result = RGWCopyObj::parse_copy_location(s->copy_source, s->src_bucket_name, s->src_object);
+ if (!result)
+ return -ERR_BAD_URL;
+ }
s->dialect = "swift";
+ if (s->op == OP_COPY) {
+ const char *req_dest = s->info.env->get("HTTP_DESTINATION");
+ if (!req_dest)
+ return -ERR_BAD_URL;
+
+ string dest_bucket_name;
+ string dest_object;
+ bool result = RGWCopyObj::parse_copy_location(req_dest, dest_bucket_name, dest_object);
+ if (!result)
+ return -ERR_BAD_URL;
+
+ if (dest_bucket_name != s->bucket_name_str) {
+ ret = validate_bucket_name(dest_bucket_name.c_str());
+ if (ret < 0)
+ return ret;
+ }
+
+ /* convert COPY operation into PUT */
+ s->src_bucket_name = s->bucket_name_str;
+ s->src_object = s->object_str;
+ s->bucket_name_str = dest_bucket_name;
+ s->object_str = dest_object;
+ s->op = OP_PUT;
+ }
+
return RGWHandler_ObjStore::init(store, s, cio);
}
@@ -896,7 +906,7 @@ RGWHandler *RGWRESTMgr_SWIFT::get_handler(struct req_state *s)
if (ret < 0)
return NULL;
- if (!s->bucket_name)
+ if (s->bucket_name_str.empty())
return new RGWHandler_ObjStore_Service_SWIFT;
if (!s->object)
return new RGWHandler_ObjStore_Bucket_SWIFT;