From 37ebc0c8de6c2c706f4c0966f0be81989242a236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9=20=D0=A0=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D0=BD=D0=BE=D0=B2=D1=81=D0=BA=D0=B8=D0=B9?= Date: Wed, 29 Jan 2020 20:04:09 +0500 Subject: [PATCH 1/2] Add method metadata to context --- context.go | 11 +++++++++++ context_test.go | 12 ++++++++++++ handler.go | 7 ++++--- method.go | 18 ++++++++++++++---- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/context.go b/context.go index 9c1eda8..f511ff1 100644 --- a/context.go +++ b/context.go @@ -7,6 +7,7 @@ import ( ) type requestIDKey struct{} +type metadataIDKey struct{} type methodNameKey struct{} // RequestID takes request id from context. @@ -19,6 +20,16 @@ func WithRequestID(c context.Context, id *fastjson.RawMessage) context.Context { return context.WithValue(c, requestIDKey{}, id) } +// RequestID takes request id from context. +func GetMetadata(c context.Context) Metadata { + return c.Value(metadataIDKey{}).(Metadata) +} + +// WithRequestID adds request id to context. +func WithMetadata(c context.Context, md Metadata) context.Context { + return context.WithValue(c, metadataIDKey{}, md) +} + // MethodName takes method name from context. func MethodName(c context.Context) string { return c.Value(methodNameKey{}).(string) diff --git a/context_test.go b/context_test.go index 3ae869e..0a3653b 100644 --- a/context_test.go +++ b/context_test.go @@ -20,6 +20,18 @@ func TestRequestID(t *testing.T) { require.Equal(t, &id, pick) } +func TestMetadata(t *testing.T) { + + c := context.Background() + md := Metadata{Params: Metadata{}} + c = WithMetadata(c, md) + var pick Metadata + require.NotPanics(t, func() { + pick = GetMetadata(c) + }) + require.Equal(t, md, pick) +} + func TestMethodName(t *testing.T) { c := context.Background() diff --git a/handler.go b/handler.go index adfe778..621a0f1 100644 --- a/handler.go +++ b/handler.go @@ -55,16 +55,17 @@ func (mr *MethodRepository) ServeHTTP(w http.ResponseWriter, r *http.Request) { // InvokeMethod invokes JSON-RPC method. func (mr *MethodRepository) InvokeMethod(c context.Context, r *Request) *Response { - var h Handler + var md Metadata res := NewResponse(r) - h, res.Error = mr.TakeMethod(r) + md, res.Error = mr.TakeMethodMetadata(r) if res.Error != nil { return res } wrappedContext := WithRequestID(c, r.ID) wrappedContext = WithMethodName(wrappedContext, r.Method) - res.Result, res.Error = h.ServeJSONRPC(wrappedContext, r.Params) + wrappedContext = WithMetadata(wrappedContext, md) + res.Result, res.Error = md.Handler.ServeJSONRPC(wrappedContext, r.Params) if res.Error != nil { res.Result = nil } diff --git a/method.go b/method.go index fcc8961..fe0125a 100644 --- a/method.go +++ b/method.go @@ -27,19 +27,29 @@ func NewMethodRepository() *MethodRepository { } } -// TakeMethod takes jsonrpc.Func in MethodRepository. -func (mr *MethodRepository) TakeMethod(r *Request) (Handler, *Error) { +// TakeMethodMetadata takes metadata in MethodRepository for request. +func (mr *MethodRepository) TakeMethodMetadata(r *Request) (Metadata, *Error) { + if r.Method == "" || r.Version != Version { - return nil, ErrInvalidParams() + return Metadata{}, ErrInvalidParams() } mr.m.RLock() md, ok := mr.r[r.Method] mr.m.RUnlock() if !ok { - return nil, ErrMethodNotFound() + return Metadata{}, ErrMethodNotFound() } + return md, nil +} + +// TakeMethod takes jsonrpc.Func in MethodRepository. +func (mr *MethodRepository) TakeMethod(r *Request) (Handler, *Error) { + md, err := mr.TakeMethodMetadata(r) + if err != nil { + return nil, err + } return md.Handler, nil } From f1d089ab2ac09927dd03779ffe60c7cd00f1b907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9=20=D0=A0=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D0=BD=D0=BE=D0=B2=D1=81=D0=BA=D0=B8=D0=B9?= Date: Wed, 29 Jan 2020 20:09:27 +0500 Subject: [PATCH 2/2] Fix invalid comments in context.go --- context.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/context.go b/context.go index f511ff1..baae996 100644 --- a/context.go +++ b/context.go @@ -20,12 +20,12 @@ func WithRequestID(c context.Context, id *fastjson.RawMessage) context.Context { return context.WithValue(c, requestIDKey{}, id) } -// RequestID takes request id from context. +// GetMetadata takes jsonrpc metadata from context. func GetMetadata(c context.Context) Metadata { return c.Value(metadataIDKey{}).(Metadata) } -// WithRequestID adds request id to context. +// WithMetadata adds jsonrpc metadata to context. func WithMetadata(c context.Context, md Metadata) context.Context { return context.WithValue(c, metadataIDKey{}, md) }