From 60018d92416a193f3ba8a4745fec6d6a28dde777 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Sun, 25 Oct 2015 15:38:21 +0100 Subject: [PATCH] rgw: improve response code handling for Bulk Delete API. Signed-off-by: Radoslaw Zarzynski --- src/rgw/rgw_rest_swift.cc | 49 ++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index 96afdea86c87b..223060c15713a 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(); } -- 2.39.5