github.com/gofiber/fiber/v2@v2.47.0/middleware/redirect/redirect.go (about) 1 package redirect 2 3 import ( 4 "regexp" 5 "strconv" 6 "strings" 7 8 "github.com/gofiber/fiber/v2" 9 ) 10 11 // New creates a new middleware handler 12 func New(config ...Config) fiber.Handler { 13 cfg := configDefault(config...) 14 15 // Initialize 16 cfg.rulesRegex = map[*regexp.Regexp]string{} 17 for k, v := range cfg.Rules { 18 k = strings.ReplaceAll(k, "*", "(.*)") 19 k += "$" 20 cfg.rulesRegex[regexp.MustCompile(k)] = v 21 } 22 23 // Middleware function 24 return func(c *fiber.Ctx) error { 25 // Next request to skip middleware 26 if cfg.Next != nil && cfg.Next(c) { 27 return c.Next() 28 } 29 // Rewrite 30 for k, v := range cfg.rulesRegex { 31 replacer := captureTokens(k, c.Path()) 32 if replacer != nil { 33 return c.Redirect(replacer.Replace(v), cfg.StatusCode) 34 } 35 } 36 return c.Next() 37 } 38 } 39 40 // https://github.com/labstack/echo/blob/master/middleware/rewrite.go 41 func captureTokens(pattern *regexp.Regexp, input string) *strings.Replacer { 42 if len(input) > 1 { 43 input = strings.TrimSuffix(input, "/") 44 } 45 groups := pattern.FindAllStringSubmatch(input, -1) 46 if groups == nil { 47 return nil 48 } 49 values := groups[0][1:] 50 replace := make([]string, 2*len(values)) 51 for i, v := range values { 52 j := 2 * i 53 replace[j] = "$" + strconv.Itoa(i+1) 54 replace[j+1] = v 55 } 56 return strings.NewReplacer(replace...) 57 }