diff --git a/api/handler/cors_test.go b/api/handler/cors_test.go index ac0f7ff3..01c54795 100644 --- a/api/handler/cors_test.go +++ b/api/handler/cors_test.go @@ -228,33 +228,6 @@ func TestPreflightWildcardOrigin(t *testing.T) { } } -func TestDeleteAllCORSVersions(t *testing.T) { - body := ` - - - GET - PUT - * - * - - -` - hc := prepareHandlerContext(t) - - bktName := "bucket-delete-all-cors-version" - createBucket(hc, bktName) - require.Len(t, hc.tp.Objects(), 0) - - for range 5 { - putBucketCORS(hc, bktName, body) - } - - require.Len(t, hc.tp.Objects(), 5) - - deleteBucketCORS(hc, bktName) - require.Len(t, hc.tp.Objects(), 0) -} - func TestGetLatestCORSVersion(t *testing.T) { bodyTree := ` @@ -295,7 +268,7 @@ func TestGetLatestCORSVersion(t *testing.T) { requireEqualCORS(hc.t, bodyTree, w.Body.String()) } -func TestDeleteTreeCORSVersions(t *testing.T) { +func TestDeleteCORSVersions(t *testing.T) { body := ` @@ -305,6 +278,15 @@ func TestDeleteTreeCORSVersions(t *testing.T) { * +` + newBody := ` + + + HEAD + * + * + + ` hc := prepareHandlerContext(t) @@ -317,10 +299,19 @@ func TestDeleteTreeCORSVersions(t *testing.T) { putBucketCORS(hc, bktName, body) require.Len(t, hc.tp.Objects(), 1) + require.Equal(t, body, string(hc.tp.Objects()[0].Payload())) + + hc.tp.AddCORSObject(info.BktInfo, hc.corsCnrID, body) + require.Len(t, hc.tp.Objects(), 2) + + putBucketCORS(hc, bktName, newBody) + require.Len(t, hc.tp.Objects(), 1) + require.Equal(t, newBody, string(hc.tp.Objects()[0].Payload())) addCORSToTree(hc, body, info.BktInfo, info.BktInfo.CID) addCORSToTree(hc, body, info.BktInfo, hc.corsCnrID) - require.Len(t, hc.tp.Objects(), 3) + hc.tp.AddCORSObject(info.BktInfo, hc.corsCnrID, body) + require.Len(t, hc.tp.Objects(), 4) deleteBucketCORS(hc, bktName) require.Len(t, hc.tp.Objects(), 0) diff --git a/api/layer/cors.go b/api/layer/cors.go index c6b1b7d8..b2a95c4e 100644 --- a/api/layer/cors.go +++ b/api/layer/cors.go @@ -45,6 +45,11 @@ func (n *Layer) PutBucketCORS(ctx context.Context, p *PutCORSParams) error { return err } + corsVersions, err := n.getCORSVersions(ctx, p.BktInfo) + if err != nil { + n.reqLogger(ctx).Error(logs.CouldntGetCORSObjectVersions, zap.Error(err), logs.TagField(logs.TagExternalStorage)) + } + prm := frostfs.PrmObjectCreate{ Container: n.corsCnrInfo.CID, Payload: &buf, @@ -56,7 +61,7 @@ func (n *Layer) PutBucketCORS(ctx context.Context, p *PutCORSParams) error { }, } - _, err := n.objectPutAndHash(ctx, prm, n.corsCnrInfo) + _, err = n.objectPutAndHash(ctx, prm, n.corsCnrInfo) if err != nil { return fmt.Errorf("put cors object: %w", err) } @@ -76,6 +81,15 @@ func (n *Layer) PutBucketCORS(ctx context.Context, p *PutCORSParams) error { } } + if corsVersions != nil { + var addr oid.Address + addr.SetContainer(n.corsCnrInfo.CID) + for _, obj := range corsVersions.GetObjects() { + addr.SetObject(obj.ObjID) + n.deleteCORSObject(ctx, p.BktInfo, addr) + } + } + return nil } diff --git a/internal/frostfs/crdt/gset.go b/internal/frostfs/crdt/gset.go index adc786da..04eaff3b 100644 --- a/internal/frostfs/crdt/gset.go +++ b/internal/frostfs/crdt/gset.go @@ -92,6 +92,10 @@ func (v *ObjectVersions) GetSorted() []*ObjectVersion { return v.objects } +func (v *ObjectVersions) GetObjects() []*ObjectVersion { + return v.objects +} + func (v *ObjectVersions) SetLessFunc(less func(*ObjectVersion, *ObjectVersion) bool) { v.less = less }