diff --git a/api/handler/delete.go b/api/handler/delete.go index 99ec696..7fc081e 100644 --- a/api/handler/delete.go +++ b/api/handler/delete.go @@ -150,15 +150,18 @@ func (h *handler) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *http.Re return } - removed := make(map[string]*layer.VersionedObject) + unique := make(map[string]struct{}) toRemove := make([]*layer.VersionedObject, 0, len(requested.Objects)) for _, obj := range requested.Objects { versionedObj := &layer.VersionedObject{ Name: obj.ObjectName, VersionID: obj.VersionID, } - toRemove = append(toRemove, versionedObj) - removed[versionedObj.String()] = versionedObj + key := versionedObj.String() + if _, ok := unique[key]; !ok { + toRemove = append(toRemove, versionedObj) + unique[key] = struct{}{} + } } response := &DeleteObjectsResponse{ diff --git a/api/handler/delete_test.go b/api/handler/delete_test.go index 55cba0d..48cefd3 100644 --- a/api/handler/delete_test.go +++ b/api/handler/delete_test.go @@ -85,6 +85,19 @@ func TestDeleteBucketOnNotFoundError(t *testing.T) { deleteBucket(t, hc, bktName, http.StatusNoContent) } +func TestDeleteMultipleObjectCheckUniqueness(t *testing.T) { + hc := prepareHandlerContext(t) + + bktName, objName := "bucket", "object" + createTestBucket(hc, bktName) + + putObject(hc, bktName, objName) + + resp := deleteObjects(t, hc, bktName, [][2]string{{objName, emptyVersion}, {objName, emptyVersion}}) + require.Empty(t, resp.Errors) + require.Len(t, resp.DeletedObjects, 1) +} + func TestDeleteObjectsError(t *testing.T) { hc := prepareHandlerContext(t)