int init_common();
-protected:
- bool parse_copy_location(const char *src, string& bucket_name, string& object);
-
public:
RGWCopyObj() {
if_mod = NULL;
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);
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;
+ dest_object = s->object_str;
return 0;
}
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;
return ret;
s->copy_source = s->info.env->get("HTTP_X_COPY_FROM");
+ if (s->copy_source) {
+ ret = RGWCopyObj::parse_copy_location(s->copy_source, s->src_bucket_name, s->src_object);
+ if (!ret)
+ 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;
+ ret = RGWCopyObj::parse_copy_location(req_dest, dest_bucket_name, dest_object);
+ if (!ret)
+ 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;
+ free(s->bucket_name);
+ s->bucket_name = strdup(s->bucket_name_str.c_str());
+ s->object_str = dest_object;
+ s->op = OP_PUT;
+ }
+
return RGWHandler_ObjStore::init(store, s, cio);
}