// 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);
+ if (ret == -ENOENT) {
+ ret = -ERR_NO_SUCH_BUCKET;
+ }
done:
send_response();
send_response();
}
+void RGWListBucketMultiparts::execute()
+{
+ if (!verify_permission(s, RGW_PERM_READ)) {
+ ret = -EACCES;
+ goto done;
+ }
+
+ url_decode(s->args.get("prefix"), prefix);
+ marker = s->args.get("marker");
+ max_keys = s->args.get(limit_opt_name);
+ if (!max_keys.empty()) {
+ max = atoi(max_keys.c_str());
+ } else {
+ max = default_max;
+ }
+ url_decode(s->args.get("delimiter"), delimiter);
+
+ if (s->prot_flags & RGW_REST_OPENSTACK) {
+ string path_args = s->args.get("path");
+ if (!path_args.empty()) {
+ if (!delimiter.empty() || !prefix.empty()) {
+ ret = -EINVAL;
+ goto done;
+ }
+ url_decode(path_args, prefix);
+ delimiter="/";
+ }
+ }
+
+ ret = rgwstore->list_objects(s->user.user_id, s->bucket_str, max, prefix, delimiter, marker, objs, common_prefixes,
+ !!(s->prot_flags & RGW_REST_OPENSTACK), mp_ns);
+done:
+ send_response();
+}
+
void RGWHandler::init_state(struct req_state *s, struct fcgx_state *fcgx)
{
/* Retrieve the loglevel from the CGI envirioment (if set) */
virtual void send_response() = 0;
};
+class RGWListBucketMultiparts : public RGWOp {
+protected:
+ string prefix;
+ string marker;
+ string max_keys;
+ string delimiter;
+ int max;
+ int ret;
+ vector<RGWObjEnt> objs;
+ map<string, bool> common_prefixes;
+
+ string limit_opt_name;
+ int default_max;
+
+public:
+ RGWListBucketMultiparts() {}
+
+ virtual void init(struct req_state *s) {
+ RGWOp::init(s);
+ prefix.clear();
+ marker.clear();
+ max_keys.clear();
+ delimiter.clear();
+ max = 0;
+ ret = 0;
+ objs.clear();
+ common_prefixes.clear();
+ }
+ void execute();
+
+ virtual void send_response() = 0;
+};
+
class RGWHandler {
protected:
struct req_state *s;
int get_params();
};
+class RGWListBucketMultiparts_REST : public RGWListBucketMultiparts {
+public:
+ RGWListBucketMultiparts_REST() {}
+ ~RGWListBucketMultiparts_REST() {}
+};
+
class RGWHandler_REST : public RGWHandler {
protected:
bool is_acl_op(struct req_state *s) {
}
}
+void RGWListBucketMultiparts_REST_S3::send_response()
+{
+ if (ret < 0)
+ set_req_state_err(s, ret);
+ dump_errno(s);
+
+ end_header(s, "application/xml");
+ dump_start(s);
+ if (ret < 0)
+ return;
+
+ s->formatter->open_obj_section("ListMultipartUploadsResult");
+ s->formatter->dump_value_str("Bucket", s->bucket);
+ if (!prefix.empty())
+ s->formatter->dump_value_str("Prefix", prefix.c_str());
+ if (!marker.empty())
+ s->formatter->dump_value_str("KeyMarker", marker.c_str());
+ if (!max_keys.empty()) {
+ s->formatter->dump_value_str("MaxKeys", max_keys.c_str());
+ }
+ if (!delimiter.empty())
+ s->formatter->dump_value_str("Delimiter", delimiter.c_str());
+
+ if (ret >= 0) {
+ vector<RGWObjEnt>::iterator iter;
+ for (iter = objs.begin(); iter != objs.end(); ++iter) {
+ s->formatter->open_array_section("Upload");
+ s->formatter->dump_value_str("Key", iter->name.c_str());
+ dump_time(s, "LastModified", &iter->mtime);
+ s->formatter->dump_value_str("ETag", "\"%s\"", iter->etag);
+ s->formatter->dump_value_int("Size", "%lld", iter->size);
+ s->formatter->dump_value_str("StorageClass", "STANDARD");
+ dump_owner(s, s->user.user_id, s->user.display_name);
+ s->formatter->close_section("Upload");
+ }
+ if (common_prefixes.size() > 0) {
+ s->formatter->open_array_section("CommonPrefixes");
+ map<string, bool>::iterator pref_iter;
+ for (pref_iter = common_prefixes.begin(); pref_iter != common_prefixes.end(); ++pref_iter) {
+ s->formatter->dump_value_str("Prefix", pref_iter->first.c_str());
+ }
+ s->formatter->close_section("CommonPrefixes");
+ }
+ }
+ s->formatter->close_section("ListBucketResult");
+ s->formatter->flush();
+}
+
RGWOp *RGWHandler_REST_S3::get_retrieve_obj_op(struct req_state *s, bool get_data)
{
if (is_acl_op(s)) {
return NULL;
}
+ if (s->args.exists("uploads"))
+ return &list_bucket_multiparts;
+
return &list_bucket_op;
}
void send_response();
};
+class RGWListBucketMultiparts_REST_S3 : public RGWListBucketMultiparts_REST {
+public:
+ RGWListBucketMultiparts_REST_S3() {
+ limit_opt_name ="max-keys";
+ default_max = 1000;
+ }
+ ~RGWListBucketMultiparts_REST_S3() {}
+
+ void send_response();
+};
+
class RGWHandler_REST_S3 : public RGWHandler_REST {
RGWGetObj_REST_S3 get_obj_op;
RGWListBuckets_REST_S3 list_buckets_op;
RGWCompleteMultipart_REST_S3 complete_multipart;
RGWCompleteMultipart_REST_S3 abort_multipart;
RGWListMultipart_REST_S3 list_multipart;
+ RGWListBucketMultiparts_REST_S3 list_bucket_multiparts;
protected: