From b18465083b40cd764e7a0470ea06a2ec6fd0a965 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Fri, 30 Apr 2021 00:40:08 +0300 Subject: [PATCH] fill metadata early Signed-off-by: Vasiliy Tolstov --- handler.go | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/handler.go b/handler.go index fec9e3e..0c8d85b 100644 --- a/handler.go +++ b/handler.go @@ -81,7 +81,15 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { } } - ctx := metadata.NewIncomingContext(r.Context(), nil) + ctx := context.WithValue(r.Context(), rspCodeKey{}, &rspCodeVal{}) + md, ok := metadata.FromIncomingContext(ctx) + if !ok { + md = metadata.New(len(r.Header)) + } + for k, v := range r.Header { + md.Set(k, strings.Join(v, ", ")) + } + ctx = metadata.NewIncomingContext(ctx, md) defer r.Body.Close() @@ -136,15 +144,6 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - md, ok := metadata.FromIncomingContext(ctx) - if !ok { - md = metadata.New(0) - } - - for k, v := range r.Header { - md.Set(k, strings.Join(v, ", ")) - } - // get fields from url values if len(r.URL.RawQuery) > 0 { umd, cerr := rflutil.URLMap(r.URL.RawQuery) @@ -203,13 +202,12 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { method: fmt.Sprintf("%s.%s", hldr.name, hldr.mtype.method.Name), body: b, payload: argv.Interface(), + header: md, } var scode int // define the handler func fn := func(fctx context.Context, req server.Request, rsp interface{}) (err error) { - fctx = context.WithValue(fctx, rspCodeKey{}, &rspCodeVal{}) - fctx = metadata.NewIncomingContext(fctx, md) returnValues = function.Call([]reflect.Value{hldr.rcvr, hldr.mtype.prepareContext(fctx), reflect.ValueOf(argv.Interface()), reflect.ValueOf(rsp)}) scode = GetRspCode(fctx)