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, &params)
    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  }