| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 | 
							- package middleware
 
- import (
 
- 	"github.com/labstack/echo"
 
- )
 
- type (
 
- 	// TrailingSlashConfig defines the config for TrailingSlash middleware.
 
- 	TrailingSlashConfig struct {
 
- 		// Skipper defines a function to skip middleware.
 
- 		Skipper Skipper
 
- 		// Status code to be used when redirecting the request.
 
- 		// Optional, but when provided the request is redirected using this code.
 
- 		RedirectCode int `yaml:"redirect_code"`
 
- 	}
 
- )
 
- var (
 
- 	// DefaultTrailingSlashConfig is the default TrailingSlash middleware config.
 
- 	DefaultTrailingSlashConfig = TrailingSlashConfig{
 
- 		Skipper: DefaultSkipper,
 
- 	}
 
- )
 
- // AddTrailingSlash returns a root level (before router) middleware which adds a
 
- // trailing slash to the request `URL#Path`.
 
- //
 
- // Usage `Echo#Pre(AddTrailingSlash())`
 
- func AddTrailingSlash() echo.MiddlewareFunc {
 
- 	return AddTrailingSlashWithConfig(DefaultTrailingSlashConfig)
 
- }
 
- // AddTrailingSlashWithConfig returns a AddTrailingSlash middleware with config.
 
- // See `AddTrailingSlash()`.
 
- func AddTrailingSlashWithConfig(config TrailingSlashConfig) echo.MiddlewareFunc {
 
- 	// Defaults
 
- 	if config.Skipper == nil {
 
- 		config.Skipper = DefaultTrailingSlashConfig.Skipper
 
- 	}
 
- 	return func(next echo.HandlerFunc) echo.HandlerFunc {
 
- 		return func(c echo.Context) error {
 
- 			if config.Skipper(c) {
 
- 				return next(c)
 
- 			}
 
- 			req := c.Request()
 
- 			url := req.URL
 
- 			path := url.Path
 
- 			qs := c.QueryString()
 
- 			if path != "/" && path[len(path)-1] != '/' {
 
- 				path += "/"
 
- 				uri := path
 
- 				if qs != "" {
 
- 					uri += "?" + qs
 
- 				}
 
- 				// Redirect
 
- 				if config.RedirectCode != 0 {
 
- 					return c.Redirect(config.RedirectCode, uri)
 
- 				}
 
- 				// Forward
 
- 				req.RequestURI = uri
 
- 				url.Path = path
 
- 			}
 
- 			return next(c)
 
- 		}
 
- 	}
 
- }
 
- // RemoveTrailingSlash returns a root level (before router) middleware which removes
 
- // a trailing slash from the request URI.
 
- //
 
- // Usage `Echo#Pre(RemoveTrailingSlash())`
 
- func RemoveTrailingSlash() echo.MiddlewareFunc {
 
- 	return RemoveTrailingSlashWithConfig(TrailingSlashConfig{})
 
- }
 
- // RemoveTrailingSlashWithConfig returns a RemoveTrailingSlash middleware with config.
 
- // See `RemoveTrailingSlash()`.
 
- func RemoveTrailingSlashWithConfig(config TrailingSlashConfig) echo.MiddlewareFunc {
 
- 	// Defaults
 
- 	if config.Skipper == nil {
 
- 		config.Skipper = DefaultTrailingSlashConfig.Skipper
 
- 	}
 
- 	return func(next echo.HandlerFunc) echo.HandlerFunc {
 
- 		return func(c echo.Context) error {
 
- 			if config.Skipper(c) {
 
- 				return next(c)
 
- 			}
 
- 			req := c.Request()
 
- 			url := req.URL
 
- 			path := url.Path
 
- 			qs := c.QueryString()
 
- 			l := len(path) - 1
 
- 			if l >= 0 && path != "/" && path[l] == '/' {
 
- 				path = path[:l]
 
- 				uri := path
 
- 				if qs != "" {
 
- 					uri += "?" + qs
 
- 				}
 
- 				// Redirect
 
- 				if config.RedirectCode != 0 {
 
- 					return c.Redirect(config.RedirectCode, uri)
 
- 				}
 
- 				// Forward
 
- 				req.RequestURI = uri
 
- 				url.Path = path
 
- 			}
 
- 			return next(c)
 
- 		}
 
- 	}
 
- }
 
 
  |