in fc/http_handler.go [74:113]
func NewHttpHandler(handlerFunc interface{}) HttpHandler {
if handlerFunc == nil {
return errorHttpHandler(fmt.Errorf("handler is nil"))
}
handler := reflect.ValueOf(handlerFunc)
handlerType := reflect.TypeOf(handlerFunc)
if handlerType.Kind() != reflect.Func {
return errorHttpHandler(fmt.Errorf("handler kind %s is not %s", handlerType.Kind(), reflect.Func))
}
err := validateHttpArguments(handlerType)
if err != nil {
return errorHttpHandler(err)
}
if err := validateHttpReturns(handlerType); err != nil {
return errorHttpHandler(err)
}
return fcHttpHandler(func(ctx context.Context, rsp http.ResponseWriter, req *http.Request) error {
// construct arguments
args := []reflect.Value{
reflect.ValueOf(ctx),
reflect.ValueOf(rsp),
reflect.ValueOf(req),
}
response := handler.Call(args)
// convert return values into ( error)
var err error
if len(response) > 0 {
if errVal, ok := response[len(response)-1].Interface().(error); ok {
err = errVal
}
}
return err
})
}