mirror of
https://github.com/labstack/echo.git
synced 2024-11-28 08:38:39 +02:00
6d9e043284
This reintroduces support for Go modules, as v4. CloseNotifier() is removed as it has been obsoleted, see https://golang.org/doc/go1.11#net/http It was already NOT working (not sending signals) as of 1.11 the functionality was gone, we merely deleted the functions that exposed it. If anyone still relies on it they should migrate to using `c.Request().Context().Done()` instead. Closes #1268, #1255
93 lines
2.5 KiB
Go
93 lines
2.5 KiB
Go
package middleware
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/labstack/echo/v4"
|
|
)
|
|
|
|
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 == http.MethodPost {
|
|
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)
|
|
}
|
|
}
|