github.com/profzone/eden-framework@v1.0.10/pkg/courier/transport_http/decode.go (about) 1 package transport_http 2 3 import ( 4 "net/http" 5 "reflect" 6 7 "github.com/julienschmidt/httprouter" 8 9 "github.com/profzone/eden-framework/pkg/courier" 10 "github.com/profzone/eden-framework/pkg/courier/httpx" 11 "github.com/profzone/eden-framework/pkg/courier/transport_http/transform" 12 "github.com/profzone/eden-framework/pkg/reflectx" 13 ) 14 15 func createHttpRequestDecoder(r *http.Request, params *httprouter.Params) courier.OperatorDecoder { 16 return func(op courier.IOperator, rv reflect.Value) (err error) { 17 if httpRequestTransformer, ok := op.(IHttpRequestTransformer); ok { 18 httpRequestTransformer.TransformHttpRequest(r) 19 } 20 21 requestID := r.Header.Get(httpx.HeaderRequestID) 22 if requestID != "" { 23 _, version, exists := courier.ParseVersionSwitch(requestID) 24 if exists { 25 r.Header.Add(courier.VersionSwitchKey, version) 26 } 27 } 28 29 return transform.MarshalParameters(transform.ParameterGroupFromReflectValue(rv), &ParameterValuesGetter{ 30 ParameterValuesGetter: transform.NewParameterValuesGetter(r), 31 Params: params, 32 }) 33 } 34 } 35 36 type ParameterValuesGetter struct { 37 *transform.ParameterValuesGetter 38 Params *httprouter.Params 39 } 40 41 func (getter *ParameterValuesGetter) Param(name string) string { 42 return getter.Params.ByName(name) 43 } 44 45 func MarshalOperator(r *http.Request, operator courier.IOperator) (err error) { 46 params := httprouter.Params{} 47 48 if canPath, ok := (operator).(IPath); ok { 49 params, err = GetParams(canPath.Path(), r.URL.Path) 50 } 51 52 opDecode := createHttpRequestDecoder(r, ¶ms) 53 op, err := courier.NewOperatorBy(reflectx.IndirectType(reflect.TypeOf(operator)), operator, opDecode) 54 if err != nil { 55 return err 56 } 57 58 reflect.Indirect(reflect.ValueOf(operator)).Set(reflect.ValueOf(op).Elem()) 59 return nil 60 }