send_response();
}
+void RGWAbortMultipart::execute()
+{
+ ret = -EINVAL;
+ string upload_id = s->args.get("uploadId");
+ string oid, meta_oid;
+ string prefix;
+ map<uint32_t, RGWUploadPartInfo> obj_parts;
+ map<uint32_t, RGWUploadPartInfo>::iterator obj_iter;
+ RGWAccessControlPolicy policy;
+ map<string, bufferlist> attrs;
+ rgw_obj meta_obj;
+
+ if (upload_id.empty() || s->object_str.empty())
+ goto done;
+
+ ret = get_multiparts_info(s, oid, obj_parts, policy, attrs);
+ if (ret < 0)
+ goto done;
+
+ oid = s->object;
+ oid.append(".");
+ oid.append(upload_id);
+ meta_oid = oid;
+ prefix = oid;
+ prefix.append(".");
+
+ for (obj_iter = obj_parts.begin(); obj_iter != obj_parts.end(); ++obj_iter) {
+ oid = prefix;
+ char buf[16];
+ snprintf(buf, sizeof(buf), "%d", obj_iter->second.num);
+ oid.append(buf);
+ rgw_obj obj(s->bucket_str, oid, s->object_str, mp_ns);
+ ret = rgwstore->delete_obj(s->user.user_id, obj);
+ if (ret < 0 && ret != -ENOENT)
+ goto done;
+ }
+ // and also remove the metadata obj
+ meta_obj.init(s->bucket_str, meta_oid, s->object_str, mp_ns);
+ ret = rgwstore->delete_obj(s->user.user_id, meta_obj);
+done:
+
+ send_response();
+}
+
void RGWListMultipart::execute()
{
map<string, bufferlist> xattrs;
virtual void send_response() = 0;
};
+class RGWAbortMultipart : public RGWOp {
+protected:
+ int ret;
+
+public:
+ RGWAbortMultipart() {}
+
+ virtual void init(struct req_state *s) {
+ RGWOp::init(s);
+ ret = 0;
+ }
+ void execute();
+
+ virtual void send_response() = 0;
+};
+
class RGWListMultipart : public RGWOp {
protected:
int ret;
int get_params();
};
+class RGWAbortMultipart_REST : public RGWAbortMultipart {
+public:
+ RGWAbortMultipart_REST() {}
+ ~RGWAbortMultipart_REST() {}
+};
+
class RGWListMultipart_REST : public RGWListMultipart {
public:
RGWListMultipart_REST() {}
}
}
+void RGWAbortMultipart_REST_S3::send_response()
+{
+ int r = ret;
+ if (!r)
+ r = 204;
+
+ set_req_state_err(s, r);
+ dump_errno(s);
+ end_header(s);
+}
+
void RGWListMultipart_REST_S3::send_response()
{
if (ret)
RGWOp *RGWHandler_REST_S3::get_delete_op(struct req_state *s)
{
- if (s->object)
- return &delete_obj_op;
- else if (s->bucket)
+ string upload_id = s->args.get("uploadId");
+
+ if (s->object) {
+ if (upload_id.empty())
+ return &delete_obj_op;
+ else
+ return &abort_multipart;
+ } else if (s->bucket)
return &delete_bucket_op;
return NULL;
void send_response();
};
+class RGWAbortMultipart_REST_S3 : public RGWAbortMultipart_REST {
+public:
+ RGWAbortMultipart_REST_S3() {}
+ ~RGWAbortMultipart_REST_S3() {}
+
+ void send_response();
+};
+
class RGWListMultipart_REST_S3 : public RGWListMultipart_REST {
public:
RGWListMultipart_REST_S3() {}
RGWPutACLs_REST_S3 put_acls_op;
RGWInitMultipart_REST_S3 init_multipart;
RGWCompleteMultipart_REST_S3 complete_multipart;
+ RGWCompleteMultipart_REST_S3 abort_multipart;
RGWListMultipart_REST_S3 list_multipart;
protected: