aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/rs/cors/utils.go
blob: c7a0aa060190955029c55aae562688abbea7974b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package cors

import "strings"

const toLower = 'a' - 'A'

type converter func(string) string

type wildcard struct {
    prefix string
    suffix string
}

func (w wildcard) match(s string) bool {
    return len(s) >= len(w.prefix+w.suffix) && strings.HasPrefix(s, w.prefix) && strings.HasSuffix(s, w.suffix)
}

// convert converts a list of string using the passed converter function
func convert(s []string, c converter) []string {
    out := []string{}
    for _, i := range s {
        out = append(out, c(i))
    }
    return out
}

// parseHeaderList tokenize + normalize a string containing a list of headers
func parseHeaderList(headerList string) []string {
    l := len(headerList)
    h := make([]byte, 0, l)
    upper := true
    // Estimate the number headers in order to allocate the right splice size
    t := 0
    for i := 0; i < l; i++ {
        if headerList[i] == ',' {
            t++
        }
    }
    headers := make([]string, 0, t)
    for i := 0; i < l; i++ {
        b := headerList[i]
        if b >= 'a' && b <= 'z' {
            if upper {
                h = append(h, b-toLower)
            } else {
                h = append(h, b)
            }
        } else if b >= 'A' && b <= 'Z' {
            if !upper {
                h = append(h, b+toLower)
            } else {
                h = append(h, b)
            }
        } else if b == '-' || b == '_' || (b >= '0' && b <= '9') {
            h = append(h, b)
        }

        if b == ' ' || b == ',' || i == l-1 {
            if len(h) > 0 {
                // Flush the found header
                headers = append(headers, string(h))
                h = h[:0]
                upper = true
            }
        } else {
            upper = b == '-' || b == '_'
        }
    }
    return headers
}