From: Radoslaw Zarzynski Date: Sun, 25 Oct 2015 14:38:21 +0000 (+0100) Subject: rgw: improve response code handling for Bulk Delete API. X-Git-Tag: v10.0.2~36^2~14 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=60018d92416a193f3ba8a4745fec6d6a28dde777;p=ceph.git rgw: improve response code handling for Bulk Delete API. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index 96afdea86c8..223060c1571 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -982,22 +982,49 @@ void RGWBulkDelete_ObjStore_SWIFT::send_response() s->formatter->open_object_section("delete"); - s->formatter->dump_int("Number Deleted", deleter->get_num_deleted()); - s->formatter->dump_int("Number Not Found", deleter->get_num_unfound()); - s->formatter->dump_string("Response Body", ""); - s->formatter->dump_string("Response Status", "200 OK"); - s->formatter->open_array_section("Errors"); - for (const auto fail_desc : deleter->get_failures()) { + const auto num_deleted = deleter->get_num_deleted(); + const auto num_unfound = deleter->get_num_unfound(); + const auto& failures = deleter->get_failures(); + + string resp_status; + string resp_body; + + if (!failures.empty()) { + int reason = ERR_INVALID_REQUEST; + for (const auto fail_desc : failures) { + if (-ENOENT != fail_desc.err && -EACCES != fail_desc.err) { + reason = fail_desc.err; + } + } + rgw_err err; - set_req_state_err(err, fail_desc.err, s->prot_flags); - string status; - dump_errno(err, status); + set_req_state_err(err, reason, s->prot_flags); + dump_errno(err, resp_status); + } else if (0 == num_deleted && 0 == num_unfound) { + /* 400 Bad Request */ + dump_errno(400, resp_status); + resp_body = "Invalid bulk delete."; + } else { + /* 200 OK */ + dump_errno(200, resp_status); + } + + s->formatter->dump_int("Number Deleted", num_deleted); + s->formatter->dump_int("Number Not Found", num_unfound); + s->formatter->dump_string("Response Body", resp_body); + s->formatter->dump_string("Response Status", resp_status); + s->formatter->open_array_section("Errors"); + for (const auto fail_desc : failures) { + s->formatter->open_array_section("object"); stringstream ss_name; ss_name << fail_desc.path; - - s->formatter->open_array_section("object"); s->formatter->dump_string("Name", ss_name.str()); + + rgw_err err; + set_req_state_err(err, fail_desc.err, s->prot_flags); + string status; + dump_errno(err, status); s->formatter->dump_string("Status", status); s->formatter->close_section(); }