2020-08-25 14:44:09 +00:00
|
|
|
package object
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
|
|
|
|
"github.com/nspcc-dev/neofs-api-go/v2/object"
|
|
|
|
"github.com/nspcc-dev/neofs-api-go/v2/session"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
)
|
|
|
|
|
|
|
|
type GetObjectBodyStreamer interface {
|
|
|
|
Recv() (*object.GetResponseBody, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
type PutObjectBodyStreamer interface {
|
|
|
|
Send(*object.PutRequestBody) error
|
|
|
|
CloseAndRecv() (*object.PutResponseBody, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
type SearchObjectBodyStreamer interface {
|
|
|
|
Recv() (*object.SearchResponseBody, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
type GetRangeObjectBodyStreamer interface {
|
|
|
|
Recv() (*object.GetRangeResponseBody, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
type ServiceExecutor interface {
|
|
|
|
Get(context.Context, *object.GetRequestBody) (GetObjectBodyStreamer, error)
|
2020-08-25 15:45:14 +00:00
|
|
|
Put(context.Context) (PutObjectBodyStreamer, error)
|
2020-08-25 14:44:09 +00:00
|
|
|
Head(context.Context, *object.HeadRequestBody) (*object.HeadResponseBody, error)
|
|
|
|
Search(context.Context, *object.SearchRequestBody) (SearchObjectBodyStreamer, error)
|
|
|
|
Delete(context.Context, *object.DeleteRequestBody) (*object.DeleteResponseBody, error)
|
|
|
|
GetRange(context.Context, *object.GetRangeRequestBody) (GetRangeObjectBodyStreamer, error)
|
|
|
|
GetRangeHash(context.Context, *object.GetRangeHashRequestBody) (*object.GetRangeHashResponseBody, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
type executorSvc struct {
|
|
|
|
exec ServiceExecutor
|
|
|
|
|
|
|
|
metaHeader *session.ResponseMetaHeader
|
|
|
|
}
|
|
|
|
|
|
|
|
type searchStreamer struct {
|
|
|
|
bodyStreamer SearchObjectBodyStreamer
|
|
|
|
|
|
|
|
metaHdr *session.ResponseMetaHeader
|
|
|
|
}
|
|
|
|
|
2020-08-25 15:08:17 +00:00
|
|
|
type getStreamer struct {
|
|
|
|
bodyStreamer GetObjectBodyStreamer
|
|
|
|
|
|
|
|
metaHdr *session.ResponseMetaHeader
|
|
|
|
}
|
|
|
|
|
2020-08-25 15:45:14 +00:00
|
|
|
type putStreamer struct {
|
|
|
|
bodyStreamer PutObjectBodyStreamer
|
|
|
|
|
|
|
|
metaHdr *session.ResponseMetaHeader
|
|
|
|
}
|
|
|
|
|
2020-08-25 15:57:57 +00:00
|
|
|
type rangeStreamer struct {
|
|
|
|
bodyStreamer GetRangeObjectBodyStreamer
|
|
|
|
|
|
|
|
metaHdr *session.ResponseMetaHeader
|
|
|
|
}
|
|
|
|
|
2020-08-25 14:44:09 +00:00
|
|
|
// NewExecutionService wraps ServiceExecutor and returns Object Service interface.
|
|
|
|
//
|
|
|
|
// Passed meta header is attached to all responses.
|
|
|
|
func NewExecutionService(exec ServiceExecutor, metaHdr *session.ResponseMetaHeader) object.Service {
|
|
|
|
return &executorSvc{
|
|
|
|
exec: exec,
|
|
|
|
metaHeader: metaHdr,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-25 15:08:17 +00:00
|
|
|
func (s *getStreamer) Recv() (*object.GetResponse, error) {
|
|
|
|
body, err := s.bodyStreamer.Recv()
|
|
|
|
if err != nil {
|
|
|
|
return nil, errors.Wrap(err, "could not receive response body")
|
|
|
|
}
|
|
|
|
|
|
|
|
resp := new(object.GetResponse)
|
|
|
|
resp.SetBody(body)
|
|
|
|
resp.SetMetaHeader(s.metaHdr)
|
|
|
|
|
|
|
|
return resp, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *executorSvc) Get(ctx context.Context, req *object.GetRequest) (object.GetObjectStreamer, error) {
|
|
|
|
bodyStream, err := s.exec.Get(ctx, req.GetBody())
|
|
|
|
if err != nil {
|
2020-08-25 15:45:14 +00:00
|
|
|
return nil, errors.Wrap(err, "could not execute Get request")
|
2020-08-25 15:08:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return &getStreamer{
|
|
|
|
bodyStreamer: bodyStream,
|
|
|
|
metaHdr: s.metaHeader,
|
|
|
|
}, nil
|
2020-08-25 14:44:09 +00:00
|
|
|
}
|
|
|
|
|
2020-08-25 15:45:14 +00:00
|
|
|
func (s *putStreamer) Send(req *object.PutRequest) error {
|
|
|
|
return s.bodyStreamer.Send(req.GetBody())
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *putStreamer) CloseAndRecv() (*object.PutResponse, error) {
|
|
|
|
body, err := s.bodyStreamer.CloseAndRecv()
|
|
|
|
if err != nil {
|
|
|
|
return nil, errors.Wrap(err, "could not receive response body")
|
|
|
|
}
|
|
|
|
|
|
|
|
resp := new(object.PutResponse)
|
|
|
|
resp.SetBody(body)
|
|
|
|
resp.SetMetaHeader(s.metaHdr)
|
|
|
|
|
|
|
|
return resp, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *executorSvc) Put(ctx context.Context) (object.PutObjectStreamer, error) {
|
|
|
|
bodyStream, err := s.exec.Put(ctx)
|
|
|
|
if err != nil {
|
|
|
|
return nil, errors.Wrap(err, "could not execute Put request")
|
|
|
|
}
|
|
|
|
|
|
|
|
return &putStreamer{
|
|
|
|
bodyStreamer: bodyStream,
|
|
|
|
metaHdr: s.metaHeader,
|
|
|
|
}, nil
|
2020-08-25 14:44:09 +00:00
|
|
|
}
|
|
|
|
|
2020-08-25 16:07:53 +00:00
|
|
|
func (s *executorSvc) Head(ctx context.Context, req *object.HeadRequest) (*object.HeadResponse, error) {
|
|
|
|
respBody, err := s.exec.Head(ctx, req.GetBody())
|
|
|
|
if err != nil {
|
|
|
|
return nil, errors.Wrap(err, "could not execute Head request")
|
|
|
|
}
|
|
|
|
|
|
|
|
resp := new(object.HeadResponse)
|
|
|
|
resp.SetBody(respBody)
|
|
|
|
resp.SetMetaHeader(s.metaHeader)
|
|
|
|
|
|
|
|
return resp, nil
|
2020-08-25 14:44:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (s *searchStreamer) Recv() (*object.SearchResponse, error) {
|
|
|
|
body, err := s.bodyStreamer.Recv()
|
|
|
|
if err != nil {
|
|
|
|
return nil, errors.Wrap(err, "could not receive response body")
|
|
|
|
}
|
|
|
|
|
|
|
|
resp := new(object.SearchResponse)
|
|
|
|
resp.SetBody(body)
|
|
|
|
resp.SetMetaHeader(s.metaHdr)
|
|
|
|
|
|
|
|
return resp, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *executorSvc) Search(ctx context.Context, req *object.SearchRequest) (object.SearchObjectStreamer, error) {
|
|
|
|
bodyStream, err := s.exec.Search(ctx, req.GetBody())
|
|
|
|
if err != nil {
|
2020-08-25 15:45:14 +00:00
|
|
|
return nil, errors.Wrap(err, "could not execute Search request")
|
2020-08-25 14:44:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return &searchStreamer{
|
|
|
|
bodyStreamer: bodyStream,
|
|
|
|
metaHdr: s.metaHeader,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
2020-08-25 16:12:36 +00:00
|
|
|
func (s *executorSvc) Delete(ctx context.Context, req *object.DeleteRequest) (*object.DeleteResponse, error) {
|
|
|
|
respBody, err := s.exec.Delete(ctx, req.GetBody())
|
|
|
|
if err != nil {
|
|
|
|
return nil, errors.Wrap(err, "could not execute Delete request")
|
|
|
|
}
|
|
|
|
|
|
|
|
resp := new(object.DeleteResponse)
|
|
|
|
resp.SetBody(respBody)
|
|
|
|
resp.SetMetaHeader(s.metaHeader)
|
|
|
|
|
|
|
|
return resp, nil
|
2020-08-25 14:44:09 +00:00
|
|
|
}
|
|
|
|
|
2020-08-25 15:57:57 +00:00
|
|
|
func (s *rangeStreamer) Recv() (*object.GetRangeResponse, error) {
|
|
|
|
body, err := s.bodyStreamer.Recv()
|
|
|
|
if err != nil {
|
|
|
|
return nil, errors.Wrap(err, "could not receive response body")
|
|
|
|
}
|
|
|
|
|
|
|
|
resp := new(object.GetRangeResponse)
|
|
|
|
resp.SetBody(body)
|
|
|
|
resp.SetMetaHeader(s.metaHdr)
|
|
|
|
|
|
|
|
return resp, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *executorSvc) GetRange(ctx context.Context, req *object.GetRangeRequest) (object.GetRangeObjectStreamer, error) {
|
|
|
|
bodyStream, err := s.exec.GetRange(ctx, req.GetBody())
|
|
|
|
if err != nil {
|
|
|
|
return nil, errors.Wrap(err, "could not execute GetRange request")
|
|
|
|
}
|
|
|
|
|
|
|
|
return &rangeStreamer{
|
|
|
|
bodyStreamer: bodyStream,
|
|
|
|
metaHdr: s.metaHeader,
|
|
|
|
}, nil
|
2020-08-25 14:44:09 +00:00
|
|
|
}
|
|
|
|
|
2020-08-25 16:18:24 +00:00
|
|
|
func (s *executorSvc) GetRangeHash(ctx context.Context, req *object.GetRangeHashRequest) (*object.GetRangeHashResponse, error) {
|
|
|
|
respBody, err := s.exec.GetRangeHash(ctx, req.GetBody())
|
|
|
|
if err != nil {
|
|
|
|
return nil, errors.Wrap(err, "could not execute GetRangeHash request")
|
|
|
|
}
|
|
|
|
|
|
|
|
resp := new(object.GetRangeHashResponse)
|
|
|
|
resp.SetBody(respBody)
|
|
|
|
resp.SetMetaHeader(s.metaHeader)
|
|
|
|
|
|
|
|
return resp, nil
|
2020-08-25 14:44:09 +00:00
|
|
|
}
|