From 4abd71f99b1830b4f58f45e10daddf9f3538a1ad Mon Sep 17 00:00:00 2001 From: alexvanin Date: Thu, 2 Apr 2020 14:38:34 +0300 Subject: [PATCH 1/3] object: Define RequestType for object service requests --- object/types.go | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/object/types.go b/object/types.go index de909a8..cde1f25 100644 --- a/object/types.go +++ b/object/types.go @@ -28,7 +28,10 @@ type ( PRead(ctx context.Context, addr refs.Address, rng Range) ([]byte, error) } - headerType int + // RequestType of the object service requests. + RequestType int + + headerType int ) const ( @@ -71,12 +74,52 @@ const ( PublicKeyHdr ) +const ( + _ RequestType = iota + // RequestPut is a type for object put request. + RequestPut + // RequestGet is a type for object get request. + RequestGet + // RequestHead is a type for object head request. + RequestHead + // RequestSearch is a type for object search request. + RequestSearch + // RequestRange is a type for object range request. + RequestRange + // RequestRangeHash is a type for object hash range request. + RequestRangeHash + // RequestDelete is a type for object delete request. + RequestDelete +) + var ( _ internal.Custom = (*Object)(nil) emptyObject = new(Object).Bytes() ) +// String returns printable name of the request type. +func (s RequestType) String() string { + switch s { + case RequestPut: + return "PUT" + case RequestGet: + return "GET" + case RequestHead: + return "HEAD" + case RequestSearch: + return "SEARCH" + case RequestRange: + return "RANGE" + case RequestRangeHash: + return "RANGE_HASH" + case RequestDelete: + return "DELETE" + default: + return "UNKNOWN" + } +} + // Bytes returns marshaled object in a binary format. func (m Object) Bytes() []byte { data, _ := m.Marshal(); return data } From 1e513625f1564c1c0d21878057cabcd46b154207 Mon Sep 17 00:00:00 2001 From: alexvanin Date: Thu, 2 Apr 2020 14:52:08 +0300 Subject: [PATCH 2/3] object: Add `Type()` in `Request` interface BasicACL have set of rules for every request type. ACL will be processed before any request specific handlers. Therefore we need to determine request type in generic request interface, which is used in pre-processors of object service implementation. --- object/service.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/object/service.go b/object/service.go index 589bd95..3a2ca08 100644 --- a/object/service.go +++ b/object/service.go @@ -28,12 +28,13 @@ type ( Token = session.Token // Request defines object rpc requests. - // All object operations must have TTL, Epoch, Container ID and + // All object operations must have TTL, Epoch, Type, Container ID and // permission of usage previous network map. Request interface { service.MetaHeader CID() CID + Type() RequestType AllowPreviousNetMap() bool } ) @@ -169,3 +170,24 @@ func (m *GetRangeRequest) AllowPreviousNetMap() bool { return false } // AllowPreviousNetMap returns permission to use previous network map in object get range hash request. func (m *GetRangeHashRequest) AllowPreviousNetMap() bool { return false } + +// Type returns type of the object put request. +func (m *PutRequest) Type() RequestType { return RequestPut } + +// Type returns type of the object get request. +func (m *GetRequest) Type() RequestType { return RequestGet } + +// Type returns type of the object head request. +func (m *HeadRequest) Type() RequestType { return RequestHead } + +// Type returns type of the object search request. +func (m *SearchRequest) Type() RequestType { return RequestSearch } + +// Type returns type of the object delete request. +func (m *DeleteRequest) Type() RequestType { return RequestDelete } + +// Type returns type of the object get range request. +func (m *GetRangeRequest) Type() RequestType { return RequestRange } + +// Type returns type of the object get range hash request. +func (m *GetRangeHashRequest) Type() RequestType { return RequestRangeHash } From 55b75a0dae7dfa1ab610b1f9af70d5ec0db8d324 Mon Sep 17 00:00:00 2001 From: alexvanin Date: Thu, 2 Apr 2020 15:05:48 +0300 Subject: [PATCH 3/3] object: Add test for object request type --- object/service_test.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/object/service_test.go b/object/service_test.go index f06e557..46213e2 100644 --- a/object/service_test.go +++ b/object/service_test.go @@ -18,11 +18,22 @@ func TestRequest(t *testing.T) { &GetRangeHashRequest{}, } + types := []RequestType{ + RequestPut, + RequestGet, + RequestHead, + RequestSearch, + RequestDelete, + RequestRange, + RequestRangeHash, + } + for i := range cases { v := cases[i] t.Run(fmt.Sprintf("%T", v), func(t *testing.T) { require.NotPanics(t, func() { v.CID() }) + require.Equal(t, types[i], v.Type()) }) } }