70 lines
1.6 KiB
Go
70 lines
1.6 KiB
Go
// nolint:revive
|
|
package util
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
)
|
|
|
|
type CacheControlDirective uint8
|
|
|
|
const (
|
|
CacheControlDirectiveNoCache CacheControlDirective = 1 << iota
|
|
CacheControlDirectiveNoStore
|
|
)
|
|
|
|
func (d *CacheControlDirective) HasDirective(dir CacheControlDirective) bool { return *d&dir != 0 }
|
|
func (d *CacheControlDirective) AddDirective(dir CacheControlDirective) { *d |= dir }
|
|
func (d *CacheControlDirective) ClearDirective(dir CacheControlDirective) { *d &= ^dir }
|
|
func (d *CacheControlDirective) ToggleDirective(dir CacheControlDirective) { *d ^= dir }
|
|
|
|
func (d *CacheControlDirective) String() string {
|
|
res := make([]string, 0)
|
|
|
|
if d.HasDirective(CacheControlDirectiveNoCache) {
|
|
res = append(res, "no-cache")
|
|
}
|
|
if d.HasDirective(CacheControlDirectiveNoStore) {
|
|
res = append(res, "no-store")
|
|
}
|
|
|
|
return strings.Join(res, "|")
|
|
}
|
|
|
|
func ParseCacheControlDirective(d string) CacheControlDirective {
|
|
parts := strings.Split(d, "=")
|
|
switch strings.ToLower(parts[0]) {
|
|
case "no-cache":
|
|
return CacheControlDirectiveNoCache
|
|
case "no-store":
|
|
return CacheControlDirectiveNoStore
|
|
default:
|
|
return 0
|
|
}
|
|
}
|
|
|
|
func ParseCacheControlHeader(val string) CacheControlDirective {
|
|
res := CacheControlDirective(0)
|
|
|
|
directives := strings.Split(val, ",")
|
|
for _, dir := range directives {
|
|
res |= ParseCacheControlDirective(dir)
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
func CacheControlDirectiveFromContext(ctx context.Context) CacheControlDirective {
|
|
d := ctx.Value(CTXKeyCacheControl)
|
|
if d == nil {
|
|
return CacheControlDirective(0)
|
|
}
|
|
|
|
directive, ok := d.(CacheControlDirective)
|
|
if !ok {
|
|
return CacheControlDirective(0)
|
|
}
|
|
|
|
return directive
|
|
}
|