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

     1  package cors
     2  
     3  import (
     4  	"strings"
     5  )
     6  
     7  func matchScheme(domain, pattern string) bool {
     8  	didx := strings.Index(domain, ":")
     9  	pidx := strings.Index(pattern, ":")
    10  	return didx != -1 && pidx != -1 && domain[:didx] == pattern[:pidx]
    11  }
    12  
    13  // matchSubdomain compares authority with wildcard
    14  func matchSubdomain(domain, pattern string) bool {
    15  	if !matchScheme(domain, pattern) {
    16  		return false
    17  	}
    18  	didx := strings.Index(domain, "://")
    19  	pidx := strings.Index(pattern, "://")
    20  	if didx == -1 || pidx == -1 {
    21  		return false
    22  	}
    23  	domAuth := domain[didx+3:]
    24  	// to avoid long loop by invalid long domain
    25  	const maxDomainLen = 253
    26  	if len(domAuth) > maxDomainLen {
    27  		return false
    28  	}
    29  	patAuth := pattern[pidx+3:]
    30  
    31  	domComp := strings.Split(domAuth, ".")
    32  	patComp := strings.Split(patAuth, ".")
    33  	const divHalf = 2
    34  	for i := len(domComp)/divHalf - 1; i >= 0; i-- {
    35  		opp := len(domComp) - 1 - i
    36  		domComp[i], domComp[opp] = domComp[opp], domComp[i]
    37  	}
    38  	for i := len(patComp)/divHalf - 1; i >= 0; i-- {
    39  		opp := len(patComp) - 1 - i
    40  		patComp[i], patComp[opp] = patComp[opp], patComp[i]
    41  	}
    42  
    43  	for i, v := range domComp {
    44  		if len(patComp) <= i {
    45  			return false
    46  		}
    47  		p := patComp[i]
    48  		if p == "*" {
    49  			return true
    50  		}
    51  		if p != v {
    52  			return false
    53  		}
    54  	}
    55  	return false
    56  }