2025-04-28 23:28:37 -07:00
|
|
|
package httpcache
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"net/http"
|
2025-05-01 02:26:20 -07:00
|
|
|
"sort"
|
2025-04-28 23:28:37 -07:00
|
|
|
"strings"
|
|
|
|
|
)
|
|
|
|
|
|
2025-04-28 23:43:10 -07:00
|
|
|
type CacheControl map[string]string
|
2025-04-28 23:28:37 -07:00
|
|
|
|
2025-04-28 23:43:10 -07:00
|
|
|
func ParseCacheControl(headers http.Header) CacheControl {
|
|
|
|
|
cc := CacheControl{}
|
2025-04-28 23:28:37 -07:00
|
|
|
ccHeader := headers.Get("Cache-Control")
|
|
|
|
|
for _, part := range strings.Split(ccHeader, ",") {
|
|
|
|
|
part = strings.Trim(part, " ")
|
|
|
|
|
if part == "" {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
if strings.ContainsRune(part, '=') {
|
|
|
|
|
keyval := strings.Split(part, "=")
|
2025-05-01 02:26:20 -07:00
|
|
|
cc[strings.ToLower(strings.Trim(keyval[0], " "))] = strings.Trim(keyval[1], ",")
|
2025-04-28 23:28:37 -07:00
|
|
|
} else {
|
2025-05-01 02:26:20 -07:00
|
|
|
cc[strings.ToLower(part)] = ""
|
2025-04-28 23:28:37 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return cc
|
|
|
|
|
}
|
2025-04-28 23:43:10 -07:00
|
|
|
|
|
|
|
|
func (cc CacheControl) String() string {
|
|
|
|
|
parts := make([]string, 0, len(cc))
|
|
|
|
|
for k, v := range cc {
|
|
|
|
|
if v == "" {
|
|
|
|
|
parts = append(parts, k)
|
|
|
|
|
} else {
|
|
|
|
|
parts = append(parts, k+"="+v)
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-05-01 02:26:20 -07:00
|
|
|
sort.StringSlice(parts).Sort()
|
2025-04-28 23:43:10 -07:00
|
|
|
return strings.Join(parts, ", ")
|
|
|
|
|
}
|