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  }