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 }