diff --git a/audit/collect.go b/audit/collect.go index 6e434c77..f9d38adc 100644 --- a/audit/collect.go +++ b/audit/collect.go @@ -2,13 +2,11 @@ package audit import ( "context" - "errors" "fmt" "github.com/nspcc-dev/neofs-sdk-go/checksum" "github.com/nspcc-dev/neofs-sdk-go/client" cid "github.com/nspcc-dev/neofs-sdk-go/container/id" - "github.com/nspcc-dev/neofs-sdk-go/object" oid "github.com/nspcc-dev/neofs-sdk-go/object/id" "github.com/nspcc-dev/neofs-sdk-go/object/relations" "github.com/nspcc-dev/neofs-sdk-go/storagegroup" @@ -48,16 +46,11 @@ func CollectMembers( var prmHead client.PrmObjectHead for _, phyMember := range phyMembers { addr.SetObject(phyMember) - leaf, err := collector.ObjectHead(ctx, addr.Container(), addr.Object(), signer, prmHead) + hdr, err := collector.ObjectHead(ctx, addr.Container(), addr.Object(), signer, prmHead) if err != nil { return nil, fmt.Errorf("head phy member '%s': %w", phyMember.EncodeToString(), err) } - var hdr object.Object - if !leaf.ReadHeader(&hdr) { - return nil, errors.New("header err") - } - sumPhySize += hdr.PayloadSize() cs, _ := hdr.PayloadHomomorphicHash() diff --git a/client/object_get.go b/client/object_get.go index 86f253a2..31b764a7 100644 --- a/client/object_get.go +++ b/client/object_get.go @@ -338,34 +338,6 @@ type PrmObjectHead struct { prmObjectRead } -// ResObjectHead groups resulting values of ObjectHead operation. -type ResObjectHead struct { - // requested object (response doesn't carry the ID) - idObj oid.ID - - hdr *v2object.HeaderWithSignature -} - -// ReadHeader reads header of the requested object. -// Returns false if header is missing in the response (not read). -func (x *ResObjectHead) ReadHeader(dst *object.Object) bool { - if x.hdr == nil { - return false - } - - var objv2 v2object.Object - - objv2.SetHeader(x.hdr.GetHeader()) - objv2.SetSignature(x.hdr.GetSignature()) - - obj := object.NewFromV2(&objv2) - obj.SetID(x.idObj) - - *dst = *obj - - return true -} - // ObjectHead reads object header through a remote server using NeoFS API protocol. // // Exactly one return value is non-nil. By default, server status is returned in res structure. @@ -386,7 +358,7 @@ func (x *ResObjectHead) ReadHeader(dst *object.Object) bool { // - [apistatus.ErrObjectAccessDenied] // - [apistatus.ErrObjectAlreadyRemoved] // - [apistatus.ErrSessionTokenExpired] -func (c *Client) ObjectHead(ctx context.Context, containerID cid.ID, objectID oid.ID, signer user.Signer, prm PrmObjectHead) (*ResObjectHead, error) { +func (c *Client) ObjectHead(ctx context.Context, containerID cid.ID, objectID oid.ID, signer user.Signer, prm PrmObjectHead) (*object.Object, error) { var ( addr v2refs.Address cidV2 v2refs.ContainerID @@ -429,13 +401,10 @@ func (c *Client) ObjectHead(ctx context.Context, containerID cid.ID, objectID oi return nil, err } - var res ResObjectHead if err = c.processResponse(resp); err != nil { return nil, err } - _ = res.idObj.ReadFromV2(*addr.GetObjectID()) - switch v := resp.GetBody().GetHeaderPart().(type) { default: err = fmt.Errorf("unexpected header type %T", v) @@ -444,10 +413,19 @@ func (c *Client) ObjectHead(ctx context.Context, containerID cid.ID, objectID oi err = object.NewSplitInfoError(object.NewSplitInfoFromV2(v)) return nil, err case *v2object.HeaderWithSignature: - res.hdr = v - } + if v == nil { + return nil, errors.New("empty header") + } + + var objv2 v2object.Object + objv2.SetHeader(v.GetHeader()) + objv2.SetSignature(v.GetSignature()) - return &res, nil + obj := object.NewFromV2(&objv2) + obj.SetID(objectID) + + return obj, nil + } } // PrmObjectRange groups optional parameters of ObjectRange operation. diff --git a/object/relations/relations.go b/object/relations/relations.go index 9fc2891f..b54ec25e 100644 --- a/object/relations/relations.go +++ b/object/relations/relations.go @@ -30,7 +30,7 @@ var ( // HeadExecutor describes methods to get object head. type HeadExecutor interface { - ObjectHead(ctx context.Context, containerID cid.ID, objectID oid.ID, signer user.Signer, prm client.PrmObjectHead) (*client.ResObjectHead, error) + ObjectHead(ctx context.Context, containerID cid.ID, objectID oid.ID, signer user.Signer, prm client.PrmObjectHead) (*object.Object, error) } // SearchExecutor describes methods to search objects. @@ -131,7 +131,7 @@ func getSplitInfo(ctx context.Context, header HeadExecutor, cnrID cid.ID, objID prmHead.WithinSession(*tokens.Session) } prmHead.MarkRaw() - res, err := header.ObjectHead(ctx, cnrID, objID, signer, prmHead) + hdr, err := header.ObjectHead(ctx, cnrID, objID, signer, prmHead) if err != nil { var errSplit *object.SplitInfoError @@ -142,11 +142,6 @@ func getSplitInfo(ctx context.Context, header HeadExecutor, cnrID cid.ID, objID return nil, fmt.Errorf("raw object header: %w", err) } - var hdr object.Object - if !res.ReadHeader(&hdr) { - return nil, errors.New("header") - } - if hdr.SplitID() == nil { return nil, ErrNoSplitInfo } @@ -206,16 +201,11 @@ func listChildrenByLinker(ctx context.Context, header HeadExecutor, cnrID cid.ID prm.WithinSession(*tokens.Session) } - res, err := header.ObjectHead(ctx, cnrID, objID, signer, prm) + hdr, err := header.ObjectHead(ctx, cnrID, objID, signer, prm) if err != nil { return nil, fmt.Errorf("linking object's header: %w", err) } - var hdr object.Object - if !res.ReadHeader(&hdr) { - return nil, errors.New("header") - } - return hdr.Children(), nil } @@ -228,16 +218,11 @@ func getLeftSibling(ctx context.Context, header HeadExecutor, cnrID cid.ID, objI prm.WithinSession(*tokens.Session) } - res, err := header.ObjectHead(ctx, cnrID, objID, signer, prm) + hdr, err := header.ObjectHead(ctx, cnrID, objID, signer, prm) if err != nil { return oid.ID{}, fmt.Errorf("split chain member's header: %w", err) } - var hdr object.Object - if !res.ReadHeader(&hdr) { - return oid.ID{}, errors.New("header") - } - idMember, ok := hdr.PreviousID() if !ok { return oid.ID{}, ErrNoLeftSibling diff --git a/pool/mock_test.go b/pool/mock_test.go index 86a59146..7e227f49 100644 --- a/pool/mock_test.go +++ b/pool/mock_test.go @@ -128,7 +128,7 @@ func (m *mockClient) ObjectGetInit(_ context.Context, _ cid.ID, _ oid.ID, _ user return hdr, &pl, m.errOnGetObject } -func (m *mockClient) ObjectHead(_ context.Context, _ cid.ID, _ oid.ID, _ user.Signer, _ client.PrmObjectHead) (*client.ResObjectHead, error) { +func (m *mockClient) ObjectHead(_ context.Context, _ cid.ID, _ oid.ID, _ user.Signer, _ client.PrmObjectHead) (*object.Object, error) { // TODO implement me panic("implement me") } diff --git a/pool/object.go b/pool/object.go index bd0e4ac9..837a24d7 100644 --- a/pool/object.go +++ b/pool/object.go @@ -91,7 +91,7 @@ func (p *Pool) ObjectGetInit(ctx context.Context, containerID cid.ID, objectID o // Operation is executed within a session automatically created by [Pool] unless parameters explicitly override session settings. // // See details in [client.Client.ObjectHead]. -func (p *Pool) ObjectHead(ctx context.Context, containerID cid.ID, objectID oid.ID, signer user.Signer, prm client.PrmObjectHead) (*client.ResObjectHead, error) { +func (p *Pool) ObjectHead(ctx context.Context, containerID cid.ID, objectID oid.ID, signer user.Signer, prm client.PrmObjectHead) (*object.Object, error) { c, err := p.sdkClient() if err != nil { return nil, err diff --git a/pool/pool.go b/pool/pool.go index a0c18e35..3ab49ea4 100644 --- a/pool/pool.go +++ b/pool/pool.go @@ -44,7 +44,7 @@ type sdkClientInterface interface { ObjectPutInit(ctx context.Context, hdr object.Object, signer user.Signer, prm sdkClient.PrmObjectPutInit) (sdkClient.ObjectWriter, error) ObjectGetInit(ctx context.Context, containerID cid.ID, objectID oid.ID, signer user.Signer, prm sdkClient.PrmObjectGet) (object.Object, *sdkClient.PayloadReader, error) - ObjectHead(ctx context.Context, containerID cid.ID, objectID oid.ID, signer user.Signer, prm sdkClient.PrmObjectHead) (*sdkClient.ResObjectHead, error) + ObjectHead(ctx context.Context, containerID cid.ID, objectID oid.ID, signer user.Signer, prm sdkClient.PrmObjectHead) (*object.Object, error) ObjectRangeInit(ctx context.Context, containerID cid.ID, objectID oid.ID, offset, length uint64, signer user.Signer, prm sdkClient.PrmObjectRange) (*sdkClient.ObjectRangeReader, error) ObjectDelete(ctx context.Context, containerID cid.ID, objectID oid.ID, signer user.Signer, prm sdkClient.PrmObjectDelete) (oid.ID, error) ObjectHash(ctx context.Context, containerID cid.ID, objectID oid.ID, signer user.Signer, prm sdkClient.PrmObjectHash) ([][]byte, error) diff --git a/pool/pool_aio_test.go b/pool/pool_aio_test.go index 2bd1560d..a7c97203 100644 --- a/pool/pool_aio_test.go +++ b/pool/pool_aio_test.go @@ -87,7 +87,7 @@ type ( } objectHeadGetter interface { - ObjectHead(ctx context.Context, containerID cid.ID, objectID oid.ID, signer user.Signer, prm client.PrmObjectHead) (*client.ResObjectHead, error) + ObjectHead(ctx context.Context, containerID cid.ID, objectID oid.ID, signer user.Signer, prm client.PrmObjectHead) (*object.Object, error) } )