mirror of
https://github.com/kataras/iris.git
synced 2025-01-24 03:01:03 +01:00
82 lines
2.1 KiB
Go
82 lines
2.1 KiB
Go
|
package activator
|
||
|
|
||
|
import (
|
||
|
"reflect"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/kataras/iris/context"
|
||
|
"github.com/kataras/iris/core/errors"
|
||
|
)
|
||
|
|
||
|
var availableMethods = [...]string{
|
||
|
"ANY", // will be registered using the `core/router#APIBuilder#Any`
|
||
|
"ALL", // same as ANY
|
||
|
"NONE", // offline route
|
||
|
// valid http methods
|
||
|
"GET",
|
||
|
"POST",
|
||
|
"PUT",
|
||
|
"DELETE",
|
||
|
"CONNECT",
|
||
|
"HEAD",
|
||
|
"PATCH",
|
||
|
"OPTIONS",
|
||
|
"TRACE",
|
||
|
}
|
||
|
|
||
|
type methodControl struct{}
|
||
|
|
||
|
// ErrMissingHTTPMethodFunc fired when the controller doesn't handle any valid HTTP method.
|
||
|
var ErrMissingHTTPMethodFunc = errors.New(`controller can not be activated,
|
||
|
missing a compatible HTTP method function, i.e Get()`)
|
||
|
|
||
|
func (mc *methodControl) Load(t *TController) error {
|
||
|
// search the entire controller
|
||
|
// for any compatible method function
|
||
|
// and register that.
|
||
|
for _, method := range availableMethods {
|
||
|
if m, ok := t.Type.MethodByName(getMethodName(method)); ok {
|
||
|
|
||
|
t.Methods = append(t.Methods, MethodFunc{
|
||
|
HTTPMethod: method,
|
||
|
Index: m.Index,
|
||
|
})
|
||
|
|
||
|
// check if method was Any() or All()
|
||
|
// if yes, then break to skip any conflict with the rest of the method functions.
|
||
|
// (this will be registered to all valid http methods by the APIBuilder)
|
||
|
if method == "ANY" || method == "ALL" {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if len(t.Methods) == 0 {
|
||
|
// no compatible method found, fire an error and stop everything.
|
||
|
return ErrMissingHTTPMethodFunc
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func getMethodName(httpMethod string) string {
|
||
|
httpMethodFuncName := strings.Title(strings.ToLower(httpMethod))
|
||
|
return httpMethodFuncName
|
||
|
}
|
||
|
|
||
|
func (mc *methodControl) Handle(ctx context.Context, c reflect.Value, methodFunc func()) {
|
||
|
// execute the responsible method for that handler.
|
||
|
// Remember:
|
||
|
// To improve the performance
|
||
|
// we don't compare the ctx.Method()[HTTP Method]
|
||
|
// to the instance's Method, each handler is registered
|
||
|
// to a specific http method.
|
||
|
methodFunc()
|
||
|
}
|
||
|
|
||
|
// MethodControl loads and serve the main functionality of the controllers,
|
||
|
// which is to run a function based on the http method (pre-computed).
|
||
|
func MethodControl() TControl {
|
||
|
return &methodControl{}
|
||
|
}
|