github.com/gofiber/fiber/v2@v2.47.0/middleware/rewrite/rewrite.go (about)

     1  package rewrite
     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  	// Middleware function
    23  	return func(c *fiber.Ctx) error {
    24  		// Next request to skip middleware
    25  		if cfg.Next != nil && cfg.Next(c) {
    26  			return c.Next()
    27  		}
    28  		// Rewrite
    29  		for k, v := range cfg.rulesRegex {
    30  			replacer := captureTokens(k, c.Path())
    31  			if replacer != nil {
    32  				c.Path(replacer.Replace(v))
    33  				break
    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  	groups := pattern.FindAllStringSubmatch(input, -1)
    43  	if groups == nil {
    44  		return nil
    45  	}
    46  	values := groups[0][1:]
    47  	replace := make([]string, 2*len(values))
    48  	for i, v := range values {
    49  		j := 2 * i
    50  		replace[j] = "$" + strconv.Itoa(i+1)
    51  		replace[j+1] = v
    52  	}
    53  	return strings.NewReplacer(replace...)
    54  }