(Feat): Initial Commit
This commit is contained in:
69
internal/util/cache_control.go
Normal file
69
internal/util/cache_control.go
Normal file
@@ -0,0 +1,69 @@
|
||||
// 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
|
||||
}
|
||||
Reference in New Issue
Block a user