123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- package middleware
- import (
- "regexp"
- "strings"
- "github.com/labstack/echo"
- )
- type (
- // RewriteConfig defines the config for Rewrite middleware.
- RewriteConfig struct {
- // Skipper defines a function to skip middleware.
- Skipper Skipper
- // Rules defines the URL path rewrite rules. The values captured in asterisk can be
- // retrieved by index e.g. $1, $2 and so on.
- // Example:
- // "/old": "/new",
- // "/api/*": "/$1",
- // "/js/*": "/public/javascripts/$1",
- // "/users/*/orders/*": "/user/$1/order/$2",
- // Required.
- Rules map[string]string `yaml:"rules"`
- rulesRegex map[*regexp.Regexp]string
- }
- )
- var (
- // DefaultRewriteConfig is the default Rewrite middleware config.
- DefaultRewriteConfig = RewriteConfig{
- Skipper: DefaultSkipper,
- }
- )
- // Rewrite returns a Rewrite middleware.
- //
- // Rewrite middleware rewrites the URL path based on the provided rules.
- func Rewrite(rules map[string]string) echo.MiddlewareFunc {
- c := DefaultRewriteConfig
- c.Rules = rules
- return RewriteWithConfig(c)
- }
- // RewriteWithConfig returns a Rewrite middleware with config.
- // See: `Rewrite()`.
- func RewriteWithConfig(config RewriteConfig) echo.MiddlewareFunc {
- // Defaults
- if config.Rules == nil {
- panic("echo: rewrite middleware requires url path rewrite rules")
- }
- if config.Skipper == nil {
- config.Skipper = DefaultBodyDumpConfig.Skipper
- }
- config.rulesRegex = map[*regexp.Regexp]string{}
- // Initialize
- for k, v := range config.Rules {
- k = strings.Replace(k, "*", "(.*)", -1)
- k = k + "$"
- config.rulesRegex[regexp.MustCompile(k)] = v
- }
- return func(next echo.HandlerFunc) echo.HandlerFunc {
- return func(c echo.Context) (err error) {
- if config.Skipper(c) {
- return next(c)
- }
- req := c.Request()
- // Rewrite
- for k, v := range config.rulesRegex {
- replacer := captureTokens(k, req.URL.Path)
- if replacer != nil {
- req.URL.Path = replacer.Replace(v)
- break
- }
- }
- return next(c)
- }
- }
- }
|