89 lines
2.5 KiB
Go
89 lines
2.5 KiB
Go
|
package middleware
|
||
|
|
||
|
import "github.com/labstack/echo"
|
||
|
|
||
|
type (
|
||
|
// MethodOverrideConfig defines the config for MethodOverride middleware.
|
||
|
MethodOverrideConfig struct {
|
||
|
// Skipper defines a function to skip middleware.
|
||
|
Skipper Skipper
|
||
|
|
||
|
// Getter is a function that gets overridden method from the request.
|
||
|
// Optional. Default values MethodFromHeader(echo.HeaderXHTTPMethodOverride).
|
||
|
Getter MethodOverrideGetter
|
||
|
}
|
||
|
|
||
|
// MethodOverrideGetter is a function that gets overridden method from the request
|
||
|
MethodOverrideGetter func(echo.Context) string
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
// DefaultMethodOverrideConfig is the default MethodOverride middleware config.
|
||
|
DefaultMethodOverrideConfig = MethodOverrideConfig{
|
||
|
Skipper: DefaultSkipper,
|
||
|
Getter: MethodFromHeader(echo.HeaderXHTTPMethodOverride),
|
||
|
}
|
||
|
)
|
||
|
|
||
|
// MethodOverride returns a MethodOverride middleware.
|
||
|
// MethodOverride middleware checks for the overridden method from the request and
|
||
|
// uses it instead of the original method.
|
||
|
//
|
||
|
// For security reasons, only `POST` method can be overridden.
|
||
|
func MethodOverride() echo.MiddlewareFunc {
|
||
|
return MethodOverrideWithConfig(DefaultMethodOverrideConfig)
|
||
|
}
|
||
|
|
||
|
// MethodOverrideWithConfig returns a MethodOverride middleware with config.
|
||
|
// See: `MethodOverride()`.
|
||
|
func MethodOverrideWithConfig(config MethodOverrideConfig) echo.MiddlewareFunc {
|
||
|
// Defaults
|
||
|
if config.Skipper == nil {
|
||
|
config.Skipper = DefaultMethodOverrideConfig.Skipper
|
||
|
}
|
||
|
if config.Getter == nil {
|
||
|
config.Getter = DefaultMethodOverrideConfig.Getter
|
||
|
}
|
||
|
|
||
|
return func(next echo.HandlerFunc) echo.HandlerFunc {
|
||
|
return func(c echo.Context) error {
|
||
|
if config.Skipper(c) {
|
||
|
return next(c)
|
||
|
}
|
||
|
|
||
|
req := c.Request()
|
||
|
if req.Method == echo.POST {
|
||
|
m := config.Getter(c)
|
||
|
if m != "" {
|
||
|
req.Method = m
|
||
|
}
|
||
|
}
|
||
|
return next(c)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// MethodFromHeader is a `MethodOverrideGetter` that gets overridden method from
|
||
|
// the request header.
|
||
|
func MethodFromHeader(header string) MethodOverrideGetter {
|
||
|
return func(c echo.Context) string {
|
||
|
return c.Request().Header.Get(header)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// MethodFromForm is a `MethodOverrideGetter` that gets overridden method from the
|
||
|
// form parameter.
|
||
|
func MethodFromForm(param string) MethodOverrideGetter {
|
||
|
return func(c echo.Context) string {
|
||
|
return c.FormValue(param)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// MethodFromQuery is a `MethodOverrideGetter` that gets overridden method from
|
||
|
// the query parameter.
|
||
|
func MethodFromQuery(param string) MethodOverrideGetter {
|
||
|
return func(c echo.Context) string {
|
||
|
return c.QueryParam(param)
|
||
|
}
|
||
|
}
|