From 283ea9b5bf192ff9c98f0b848c7117367655893f Mon Sep 17 00:00:00 2001 From: darkweak Date: Wed, 11 Sep 2024 17:59:18 +0200 Subject: [PATCH] feat(dependencies): bump to Souin v1.7.0 (#99) * feat(dependencies): bump to Souin v1.7.0 * fix(app): remove useless provision --- .github/workflows/ci.yml | 2 +- README.md | 21 +- app.go | 2 + cleaner.go | 4 +- configuration.go | 67 +- configuration.json | 2639 ++++++++++++++++++++++++++++---------- dispatch.go | 175 +++ go.mod | 63 +- go.sum | 333 +---- httpcache.go | 80 +- httpcache_test.go | 166 ++- 11 files changed, 2397 insertions(+), 1155 deletions(-) create mode 100644 dispatch.go diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e18bae1..8f6dc22 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -63,7 +63,7 @@ jobs: - name: Run tests run: | - go test -v -coverprofile="cover-profile.out" -short -race ./... + go test -v -coverprofile="cover-profile.out" -race ./... golangci: name: Lint diff --git a/README.md b/README.md index 304924e..dc68022 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,11 @@ Caddy Module: http.handlers.cache This is a distributed HTTP cache module for Caddy based on [Souin](https://github.com/darkweak/souin) cache. +> [!WARNING] +> Since `v1.7.0` Souin (the development repository that cache-handler is based on) implements only one storage. If you need a specific storage you have to take it from [the storages repository](https://github.com/darkweak/storages) and add it either in your code, during the build otherwise. +(e.g. with otter using caddy) You have to build your caddy module with the desired storage `xcaddy build --with github.com/caddyserver/cache-handler --with github.com/darkweak/storages/otter/caddy` and configure otter in your Caddyfile/JSON configuration file. +See the [documentation about the storages](https://docs.souin.io/docs/storages). + ## Features * [RFC 7234](https://httpwg.org/specs/rfc7234.html) compliant HTTP Cache. @@ -318,22 +323,6 @@ redis-url.com { You can also use the configuration. Refer to the [Souin docs](https://docs.souin.io/docs/storages/redis/) or [rueidis client options](https://github.com/redis/rueidis/blob/main/rueidis.go#L56) to define your config as key value. -``` -redis-configuration.com { - cache { - redis { - configuration { - InitAddress 127.0.0.1:6379 - Username user - Password password - SelectDB 1 - ConnWriteTimeout 5s - BlockingPoolSize 99999 - } - } - } -} -``` What does these directives mean? | Key | Description | Value example | diff --git a/app.go b/app.go index c8cd412..2c2bae2 100644 --- a/app.go +++ b/app.go @@ -7,6 +7,7 @@ import ( "github.com/darkweak/souin/configurationtypes" "github.com/darkweak/souin/pkg/storage/types" "github.com/darkweak/souin/pkg/surrogate/providers" + "github.com/darkweak/storages/core" ) // SouinApp contains the whole Souin necessary items @@ -30,6 +31,7 @@ func init() { // Start will start the App func (s SouinApp) Start() error { + core.ResetRegisteredStorages() _, _ = up.Delete(stored_providers_key) _, _ = up.LoadOrStore(stored_providers_key, newStorageProvider()) if s.DefaultCache.GetTTL() == 0 { diff --git a/cleaner.go b/cleaner.go index da9db8e..d736ffa 100644 --- a/cleaner.go +++ b/cleaner.go @@ -28,7 +28,7 @@ func (s *storage_providers) Add(key interface{}) { } func (s *SouinCaddyMiddleware) Cleanup() error { - s.logger.Sugar().Debug("Cleanup...") + s.logger.Debug("Cleanup...") td := []interface{}{} sp, _ := up.LoadOrStore(stored_providers_key, newStorageProvider()) stored_providers := sp.(*storage_providers) @@ -43,7 +43,7 @@ func (s *SouinCaddyMiddleware) Cleanup() error { }) for _, v := range td { - s.logger.Sugar().Debugf("Cleaning %v\n", v) + s.logger.Debugf("Cleaning %v\n", v) _, _ = up.Delete(v) } diff --git a/configuration.go b/configuration.go index 3d403b4..6a149c2 100644 --- a/configuration.go +++ b/configuration.go @@ -8,7 +8,7 @@ import ( "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile" "github.com/darkweak/souin/configurationtypes" - "go.uber.org/zap" + "github.com/darkweak/storages/core" ) // DefaultCache the struct @@ -38,6 +38,8 @@ type DefaultCache struct { Redis configurationtypes.CacheProvider `json:"redis"` // Etcd provider configuration. Etcd configurationtypes.CacheProvider `json:"etcd"` + // Nats provider configuration. + Nats configurationtypes.CacheProvider `json:"nats"` // NutsDB provider configuration. Nuts configurationtypes.CacheProvider `json:"nuts"` // Otter provider configuration. @@ -52,6 +54,8 @@ type DefaultCache struct { TTL configurationtypes.Duration `json:"ttl"` // Stale time to live. Stale configurationtypes.Duration `json:"stale"` + // Disable the coalescing system. + DisableCoalescing bool `json:"disable_coalescing"` } // GetAllowedHTTPVerbs returns the allowed verbs to cache @@ -99,6 +103,11 @@ func (d *DefaultCache) GetMode() string { return d.Mode } +// GetNats returns nuts configuration +func (d *DefaultCache) GetNats() configurationtypes.CacheProvider { + return d.Nats +} + // GetNuts returns nuts configuration func (d *DefaultCache) GetNuts() configurationtypes.CacheProvider { return d.Nuts @@ -154,6 +163,11 @@ func (d *DefaultCache) GetMaxBodyBytes() uint64 { return d.MaxBodyBytes } +// IsCoalescingDisable returns if the coalescing is disabled +func (d *DefaultCache) IsCoalescingDisable() bool { + return d.DisableCoalescing +} + // Configuration holder type Configuration struct { // Default cache to fallback on when none are redefined. @@ -168,7 +182,7 @@ type Configuration struct { LogLevel string // SurrogateKeys contains the surrogate keys to use with a predefined mapping SurrogateKeys map[string]configurationtypes.SurrogateKeys - logger *zap.Logger + logger core.Logger } // GetUrls get the urls list in the configuration @@ -197,12 +211,12 @@ func (c *Configuration) GetLogLevel() string { } // GetLogger get the logger -func (c *Configuration) GetLogger() *zap.Logger { +func (c *Configuration) GetLogger() core.Logger { return c.logger } // SetLogger set the logger -func (c *Configuration) SetLogger(l *zap.Logger) { +func (c *Configuration) SetLogger(l core.Logger) { c.logger = l } @@ -269,19 +283,25 @@ func parseBadgerConfiguration(c map[string]interface{}) map[string]interface{} { func parseRedisConfiguration(c map[string]interface{}) map[string]interface{} { for k, v := range c { switch k { - case "InitAddress": + case "Addrs", "InitAddress": if s, ok := v.(string); ok { c[k] = []string{s} } else { c[k] = v } - case "Username", "Password", "ClientName", "ClientSetInfo", "ClientTrackingOptions": + case "Username", "Password", "ClientName", "ClientSetInfo", "ClientTrackingOptions", "SentinelUsername", "SentinelPassword", "MasterName", "IdentitySuffix": c[k] = v case "SendToReplicas", "ShuffleInit", "ClientNoTouch", "DisableRetry", "DisableCache", "AlwaysPipelining", "AlwaysRESP2", "ForceSingleClient", "ReplicaOnly", "ClientNoEvict": c[k] = true - case "SelectDB", "CacheSizeEachConn", "RingScaleEachConn", "ReadBufferEachConn", "WriteBufferEachConn", "BlockingPoolSize", "PipelineMultiplex": - c[k], _ = strconv.Atoi(v.(string)) - case "ConnWriteTimeout", "MaxFlushDelay": + case "SelectDB", "CacheSizeEachConn", "RingScaleEachConn", "ReadBufferEachConn", "WriteBufferEachConn", "BlockingPoolSize", "PipelineMultiplex", "DB", "Protocol", "MaxRetries", "PoolSize", "MinIdleConns", "MaxIdleConns", "MaxActiveConns", "MaxRedirects": + if v == false { + c[k] = 0 + } else if v == true { + c[k] = 1 + } else { + c[k], _ = strconv.Atoi(v.(string)) + } + case "ConnWriteTimeout", "MaxFlushDelay", "MinRetryBackoff", "MaxRetryBackoff", "DialTimeout", "ReadTimeout", "WriteTimeout", "PoolTimeout", "ConnMaxIdleTime", "ConnMaxLifetime": c[k], _ = time.ParseDuration(v.(string)) } } @@ -350,7 +370,7 @@ func parseConfiguration(cfg *Configuration, h *caddyfile.Dispenser, isGlobal boo } cfg.API = apiConfiguration case "badger": - provider := configurationtypes.CacheProvider{} + provider := configurationtypes.CacheProvider{Found: true} for nesting := h.Nesting(); h.NextBlock(nesting); { directive := h.Val() switch directive { @@ -447,7 +467,7 @@ func parseConfiguration(cfg *Configuration, h *caddyfile.Dispenser, isGlobal boo } case "etcd": cfg.DefaultCache.Distributed = true - provider := configurationtypes.CacheProvider{} + provider := configurationtypes.CacheProvider{Found: true} for nesting := h.Nesting(); h.NextBlock(nesting); { directive := h.Val() switch directive { @@ -497,8 +517,23 @@ func parseConfiguration(cfg *Configuration, h *caddyfile.Dispenser, isGlobal boo return h.Errf("mode must contains only one arg: %s given", args) } cfg.DefaultCache.Mode = args[0] + case "nats": + provider := configurationtypes.CacheProvider{Found: true} + for nesting := h.Nesting(); h.NextBlock(nesting); { + directive := h.Val() + switch directive { + case "url": + urlArgs := h.RemainingArgs() + provider.URL = urlArgs[0] + case "configuration": + provider.Configuration = parseCaddyfileRecursively(h) + default: + return h.Errf("unsupported nats directive: %s", directive) + } + } + cfg.DefaultCache.Nuts = provider case "nuts": - provider := configurationtypes.CacheProvider{} + provider := configurationtypes.CacheProvider{Found: true} for nesting := h.Nesting(); h.NextBlock(nesting); { directive := h.Val() switch directive { @@ -516,7 +551,7 @@ func parseConfiguration(cfg *Configuration, h *caddyfile.Dispenser, isGlobal boo } cfg.DefaultCache.Nuts = provider case "otter": - provider := configurationtypes.CacheProvider{} + provider := configurationtypes.CacheProvider{Found: true} for nesting := h.Nesting(); h.NextBlock(nesting); { directive := h.Val() switch directive { @@ -529,7 +564,7 @@ func parseConfiguration(cfg *Configuration, h *caddyfile.Dispenser, isGlobal boo cfg.DefaultCache.Otter = provider case "olric": cfg.DefaultCache.Distributed = true - provider := configurationtypes.CacheProvider{} + provider := configurationtypes.CacheProvider{Found: true} for nesting := h.Nesting(); h.NextBlock(nesting); { directive := h.Val() switch directive { @@ -548,7 +583,7 @@ func parseConfiguration(cfg *Configuration, h *caddyfile.Dispenser, isGlobal boo cfg.DefaultCache.Olric = provider case "redis": cfg.DefaultCache.Distributed = true - provider := configurationtypes.CacheProvider{} + provider := configurationtypes.CacheProvider{Found: true} for nesting := h.Nesting(); h.NextBlock(nesting); { directive := h.Val() switch directive { @@ -615,6 +650,8 @@ func parseConfiguration(cfg *Configuration, h *caddyfile.Dispenser, isGlobal boo if err == nil { cfg.DefaultCache.TTL.Duration = ttl } + case "disable_coalescing": + cfg.DefaultCache.DisableCoalescing = true default: return h.Errf("unsupported root directive: %s", rootOption) } diff --git a/configuration.json b/configuration.json index 44f5df2..1f1bb31 100644 --- a/configuration.json +++ b/configuration.json @@ -1,6 +1,8 @@ { "apps": { "cache": { + "Storers": null, + "SurrogateStorage": null, "allowed_http_verbs": [ "GET", "POST" @@ -40,6 +42,7 @@ "strategy": "hard" }, "default_cache_control": "public", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -47,13 +50,12 @@ "url": "" }, "headers": [], - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -65,6 +67,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -74,6 +81,7 @@ "exclude": "/test2.*" }, "stale": "0s", + "storers": null, "timeout": { "backend": "10s", "cache": "100ms" @@ -115,7 +123,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -126,6 +133,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -133,13 +141,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -151,6 +158,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -160,6 +172,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -168,7 +181,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -181,14 +195,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -199,6 +206,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -248,7 +260,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -259,6 +270,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -266,13 +278,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -284,6 +295,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -293,6 +309,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -301,7 +318,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -314,14 +332,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -332,6 +343,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -381,7 +397,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -392,6 +407,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -399,13 +415,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -417,6 +432,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -426,6 +446,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -434,7 +455,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -447,14 +469,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -465,6 +480,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -514,7 +534,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -525,6 +544,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -532,13 +552,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -550,6 +569,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -559,6 +583,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -567,7 +592,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -580,14 +606,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -598,6 +617,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -652,7 +676,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -663,6 +686,7 @@ "cache_name": "Another", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -670,13 +694,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -688,6 +711,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -697,6 +725,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -705,7 +734,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -718,14 +748,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -736,6 +759,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -794,7 +822,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -811,6 +838,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -818,13 +846,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -836,6 +863,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -845,6 +877,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -853,7 +886,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -866,14 +900,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -884,6 +911,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -946,40 +978,6 @@ "security": false } }, - "CfgCacheKeys": { - "body": { - "disable_body": true, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, - "everything-with-content-type": { - "disable_body": false, - "disable_host": false, - "disable_method": true, - "headers": [ - "Content-Type" - ], - "hide": false - }, - "host": { - "disable_body": false, - "disable_host": true, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, - "method": { - "disable_body": false, - "disable_host": false, - "disable_method": true, - "headers": null, - "hide": false - } - }, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -990,6 +988,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -997,13 +996,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -1015,6 +1013,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -1024,6 +1027,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -1032,7 +1036,24 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": { + "body": { + "disable_body": true + }, + "everything-with-content-type": { + "disable_method": true, + "headers": [ + "Content-Type" + ] + }, + "host": { + "disable_host": true + }, + "method": { + "disable_method": true + } + } }, "badger": { "configuration": null, @@ -1045,14 +1066,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -1063,6 +1077,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -1125,7 +1144,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -1136,6 +1154,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": true, "etcd": { "configuration": null, @@ -1143,13 +1162,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -1161,23 +1179,18 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": { - "Addr": "127.0.0.1:6379", - "ConnMaxIdleTime": 5000000000, - "ConnMaxLifetime": 5000000000, - "DB": 0, - "DialTimeout": 5000000000, - "MaxIdleConns": 100, - "MaxRetries": 1, - "MaxRetryBackoff": 5000000000, - "MinIdleConns": 100, - "MinRetryBackoff": 5000000000, - "PoolFIFO": true, - "PoolSize": 99999, - "PoolTimeout": 10000000000, - "ReadTimeout": 5000000000, - "WriteTimeout": 5000000000 + "ClientName": "souin-redis", + "InitAddress": [ + "127.0.0.1:6379" + ], + "SelectDB": 0 }, "path": "", "url": "" @@ -1186,6 +1199,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -1194,7 +1208,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -1207,14 +1222,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -1225,6 +1233,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -1287,18 +1300,6 @@ "security": false } }, - "CfgCacheKeys": { - "/.+": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": [ - "Authorization" - ], - "hide": false - } - }, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -1309,6 +1310,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -1316,13 +1318,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -1334,6 +1335,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -1343,6 +1349,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -1351,7 +1358,14 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": { + "/.+": { + "headers": [ + "Authorization" + ] + } + } }, "badger": { "configuration": null, @@ -1364,14 +1378,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -1382,6 +1389,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -1454,7 +1466,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -1465,6 +1476,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": true, "etcd": { "configuration": { @@ -1485,13 +1497,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -1503,6 +1514,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -1512,6 +1528,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -1520,7 +1537,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -1533,14 +1551,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -1551,6 +1562,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -1613,7 +1629,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -1624,6 +1639,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -1631,23 +1647,16 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": { - "Dir": "/tmp/nuts-configuration", - "EntryIdxMode": "1", - "NodeNum": "42", - "RWMode": "0", - "SegmentSize": "1024", - "StartFileLoadingMode": "1", - "SyncEnable": "true" + "Servers": "nats://127.0.0.1:4222" }, "path": "", "url": "" @@ -1657,6 +1666,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -1666,15 +1680,17 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" }, - "ttl": "15s" + "ttl": "5s" }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -1687,14 +1703,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -1705,6 +1714,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -1718,7 +1732,7 @@ "ttl": "0s" }, { - "body": "Hello nuts", + "body": "Hello nats", "handler": "static_response" } ] @@ -1729,7 +1743,7 @@ "match": [ { "path": [ - "/nuts-configuration" + "/nats-configuration" ] } ] @@ -1767,7 +1781,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -1778,6 +1791,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -1785,16 +1799,23 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { - "configuration": null, + "configuration": { + "Dir": "/tmp/nuts-configuration", + "EntryIdxMode": "1", + "NodeNum": "42", + "RWMode": "0", + "SegmentSize": "1024", + "StartFileLoadingMode": "1", + "SyncEnable": "true" + }, "path": "", "url": "" }, @@ -1803,6 +1824,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -1812,15 +1838,17 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" }, - "ttl": "0s" + "ttl": "15s" }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -1833,14 +1861,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -1851,6 +1872,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -1864,12 +1890,8 @@ "ttl": "0s" }, { - "handler": "reverse_proxy", - "upstreams": [ - { - "dial": "127.0.0.1:9000" - } - ] + "body": "Hello nuts", + "handler": "static_response" } ] } @@ -1879,7 +1901,7 @@ "match": [ { "path": [ - "/no-reverse-proxy" + "/nuts-configuration" ] } ] @@ -1917,7 +1939,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -1928,6 +1949,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -1935,13 +1957,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -1953,6 +1974,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -1962,15 +1988,17 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { - "backend": "1s", - "cache": "1ms" + "backend": "0s", + "cache": "0s" }, "ttl": "0s" }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -1983,14 +2011,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -2001,6 +2022,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -2017,7 +2043,7 @@ "handler": "reverse_proxy", "upstreams": [ { - "dial": "127.0.0.1:8081" + "dial": "127.0.0.1:9000" } ] } @@ -2029,7 +2055,7 @@ "match": [ { "path": [ - "/backend-timeout" + "/no-reverse-proxy" ] } ] @@ -2067,7 +2093,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -2078,6 +2103,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -2085,13 +2111,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -2103,6 +2128,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -2112,15 +2142,17 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { - "backend": "0s", - "cache": "0s" + "backend": "1s", + "cache": "1ms" }, "ttl": "0s" }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -2133,14 +2165,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -2151,6 +2176,165 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "stale": "0s", + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "0s" + }, + { + "handler": "reverse_proxy", + "upstreams": [ + { + "dial": "127.0.0.1:8081" + } + ] + } + ] + } + ] + } + ], + "match": [ + { + "path": [ + "/backend-timeout" + ] + } + ] + }, + { + "handle": [ + { + "handler": "subroute", + "routes": [ + { + "handle": [ + { + "Configuration": { + "API": { + "basepath": "", + "debug": { + "basepath": "", + "enable": false, + "security": false + }, + "prometheus": { + "basepath": "", + "enable": false, + "security": false + }, + "security": { + "basepath": "", + "enable": false, + "secret": "", + "users": null + }, + "souin": { + "basepath": "", + "enable": false, + "security": false + } + }, + "DefaultCache": { + "allowed_http_verbs": [], + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "cache_name": "", + "cdn": {}, + "default_cache_control": "", + "disable_coalescing": false, + "distributed": false, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "headers": null, + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" + }, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "regex": { + "exclude": "" + }, + "stale": "5s", + "storers": null, + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "5s" + }, + "LogLevel": "", + "SurrogateKeys": null, + "URLs": null, + "cache_keys": {} + }, + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "handler": "cache", + "key": {}, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -2167,15 +2351,19 @@ "handler": "headers", "response": { "set": { - "Content-Type": [ - "text/html" + "Cache-Control": [ + "must-revalidate" ] } } }, { - "body": "\u003ch1\u003eALTERNATE ESI INCLUDE\u003c/h1\u003e", - "handler": "static_response" + "handler": "reverse_proxy", + "upstreams": [ + { + "dial": "127.0.0.1:81" + } + ] } ] } @@ -2185,7 +2373,7 @@ "match": [ { "path": [ - "/alt-esi-include" + "/must-revalidate" ] } ] @@ -2223,7 +2411,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -2234,6 +2421,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -2241,13 +2429,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "bypass_response", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -2259,6 +2446,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -2268,6 +2460,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -2276,7 +2469,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -2289,14 +2483,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -2307,6 +2494,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -2324,13 +2516,13 @@ "response": { "set": { "Cache-Control": [ - "s-maxage=10" + "no-cache, no-store" ] } } }, { - "body": "Hello, s-maxage!", + "body": "Hello bypass_response", "handler": "static_response" } ] @@ -2341,7 +2533,7 @@ "match": [ { "path": [ - "/cache-s-maxage" + "/bypass_response" ] } ] @@ -2379,7 +2571,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -2390,6 +2581,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -2397,13 +2589,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "strict", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -2415,6 +2606,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -2423,16 +2619,18 @@ "regex": { "exclude": "" }, - "stale": "5s", + "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" }, - "ttl": "3s" + "ttl": "0s" }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -2445,14 +2643,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -2463,6 +2654,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -2480,13 +2676,13 @@ "response": { "set": { "Cache-Control": [ - "max-age=5" + "no-cache, no-store" ] } } }, { - "body": "Hello, max-age!", + "body": "Hello strict", "handler": "static_response" } ] @@ -2497,7 +2693,7 @@ "match": [ { "path": [ - "/cache-maxstale" + "/strict_response" ] } ] @@ -2535,7 +2731,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -2546,6 +2741,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -2553,13 +2749,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -2571,6 +2766,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -2580,6 +2780,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -2588,7 +2789,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -2601,14 +2803,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -2619,6 +2814,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -2635,25 +2835,1119 @@ "handler": "headers", "response": { "set": { - "Surrogate-Key": [ - "KEY-{http.request.header.X-Surrogate-Key-Suffix}" + "Content-Type": [ + "text/html" ] } } }, { - "handler": "headers", - "response": { - "set": { - "Vary": [ - "X-Surrogate-Key-Suffix,Accept-Encoding" - ] - } - } + "body": "\u003ch1\u003eALTERNATE ESI INCLUDE\u003c/h1\u003e", + "handler": "static_response" + } + ] + } + ] + } + ], + "match": [ + { + "path": [ + "/alt-esi-include" + ] + } + ] + }, + { + "handle": [ + { + "handler": "subroute", + "routes": [ + { + "handle": [ + { + "Configuration": { + "API": { + "basepath": "", + "debug": { + "basepath": "", + "enable": false, + "security": false + }, + "prometheus": { + "basepath": "", + "enable": false, + "security": false + }, + "security": { + "basepath": "", + "enable": false, + "secret": "", + "users": null + }, + "souin": { + "basepath": "", + "enable": false, + "security": false + } + }, + "DefaultCache": { + "allowed_http_verbs": [], + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "cache_name": "", + "cdn": {}, + "default_cache_control": "", + "disable_coalescing": false, + "distributed": false, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "headers": null, + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" + }, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "regex": { + "exclude": "" + }, + "stale": "0s", + "storers": null, + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "0s" + }, + "LogLevel": "", + "SurrogateKeys": null, + "URLs": null, + "cache_keys": {} + }, + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "handler": "cache", + "key": {}, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "stale": "0s", + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "0s" + }, + { + "handler": "headers", + "response": { + "set": { + "Cache-Control": [ + "s-maxage=10" + ] + } + } + }, + { + "body": "Hello, s-maxage!", + "handler": "static_response" + } + ] + } + ] + } + ], + "match": [ + { + "path": [ + "/cache-s-maxage" + ] + } + ] + }, + { + "handle": [ + { + "handler": "subroute", + "routes": [ + { + "handle": [ + { + "Configuration": { + "API": { + "basepath": "", + "debug": { + "basepath": "", + "enable": false, + "security": false + }, + "prometheus": { + "basepath": "", + "enable": false, + "security": false + }, + "security": { + "basepath": "", + "enable": false, + "secret": "", + "users": null + }, + "souin": { + "basepath": "", + "enable": false, + "security": false + } + }, + "DefaultCache": { + "allowed_http_verbs": [], + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "cache_name": "", + "cdn": {}, + "default_cache_control": "", + "disable_coalescing": false, + "distributed": false, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "headers": null, + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" + }, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "regex": { + "exclude": "" + }, + "stale": "5s", + "storers": null, + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "3s" + }, + "LogLevel": "", + "SurrogateKeys": null, + "URLs": null, + "cache_keys": {} + }, + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "handler": "cache", + "key": {}, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "stale": "0s", + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "0s" + }, + { + "handler": "headers", + "response": { + "set": { + "Cache-Control": [ + "max-age=5" + ] + } + } + }, + { + "body": "Hello, max-age!", + "handler": "static_response" + } + ] + } + ] + } + ], + "match": [ + { + "path": [ + "/cache-maxstale" + ] + } + ] + }, + { + "handle": [ + { + "handler": "subroute", + "routes": [ + { + "handle": [ + { + "Configuration": { + "API": { + "basepath": "", + "debug": { + "basepath": "", + "enable": false, + "security": false + }, + "prometheus": { + "basepath": "", + "enable": false, + "security": false + }, + "security": { + "basepath": "", + "enable": false, + "secret": "", + "users": null + }, + "souin": { + "basepath": "", + "enable": false, + "security": false + } + }, + "DefaultCache": { + "allowed_http_verbs": [], + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "cache_name": "", + "cdn": {}, + "default_cache_control": "", + "disable_coalescing": false, + "distributed": false, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "headers": null, + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" + }, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "regex": { + "exclude": "" + }, + "stale": "0s", + "storers": null, + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "0s" + }, + "LogLevel": "", + "SurrogateKeys": null, + "URLs": null, + "cache_keys": {} + }, + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "handler": "cache", + "key": {}, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "stale": "0s", + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "0s" + }, + { + "handler": "headers", + "response": { + "set": { + "Surrogate-Key": [ + "KEY-{http.request.header.X-Surrogate-Key-Suffix}" + ] + } + } + }, + { + "handler": "headers", + "response": { + "set": { + "Vary": [ + "X-Surrogate-Key-Suffix,Accept-Encoding" + ] + } + } + }, + { + "body": "Hello {http.request.header.X-Surrogate-Key-Suffix}", + "handler": "static_response" + } + ] + } + ] + } + ], + "match": [ + { + "path": [ + "/surrogate-keys" + ] + } + ] + }, + { + "handle": [ + { + "handler": "subroute", + "routes": [ + { + "handle": [ + { + "Configuration": { + "API": { + "basepath": "", + "debug": { + "basepath": "", + "enable": false, + "security": false + }, + "prometheus": { + "basepath": "", + "enable": false, + "security": false + }, + "security": { + "basepath": "", + "enable": false, + "secret": "", + "users": null + }, + "souin": { + "basepath": "", + "enable": false, + "security": false + } + }, + "DefaultCache": { + "allowed_http_verbs": [], + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "cache_name": "", + "cdn": {}, + "default_cache_control": "", + "disable_coalescing": false, + "distributed": false, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "headers": null, + "key": {}, + "mode": "bypass_request", + "nats": { + "configuration": null, + "path": "", + "url": "" + }, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "regex": { + "exclude": "" + }, + "stale": "0s", + "storers": null, + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "0s" + }, + "LogLevel": "", + "SurrogateKeys": null, + "URLs": null, + "cache_keys": {} + }, + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "handler": "cache", + "key": {}, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "stale": "0s", + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "0s" + }, + { + "body": "Hello bypass_request", + "handler": "static_response" + } + ] + } + ] + } + ], + "match": [ + { + "path": [ + "/bypass_request" + ] + } + ] + }, + { + "handle": [ + { + "handler": "subroute", + "routes": [ + { + "handle": [ + { + "Configuration": { + "API": { + "basepath": "", + "debug": { + "basepath": "", + "enable": false, + "security": false + }, + "prometheus": { + "basepath": "", + "enable": false, + "security": false + }, + "security": { + "basepath": "", + "enable": false, + "secret": "", + "users": null + }, + "souin": { + "basepath": "", + "enable": false, + "security": false + } + }, + "DefaultCache": { + "allowed_http_verbs": [], + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "cache_name": "", + "cdn": {}, + "default_cache_control": "", + "disable_coalescing": false, + "distributed": false, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "headers": null, + "key": {}, + "mode": "strict", + "nats": { + "configuration": null, + "path": "", + "url": "" + }, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "regex": { + "exclude": "" + }, + "stale": "0s", + "storers": null, + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "0s" + }, + "LogLevel": "", + "SurrogateKeys": null, + "URLs": null, + "cache_keys": {} + }, + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "handler": "cache", + "key": {}, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "stale": "0s", + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "0s" + }, + { + "body": "Hello strict", + "handler": "static_response" + } + ] + } + ] + } + ], + "match": [ + { + "path": [ + "/strict_request" + ] + } + ] + }, + { + "handle": [ + { + "handler": "subroute", + "routes": [ + { + "handle": [ + { + "Configuration": { + "API": { + "basepath": "", + "debug": { + "basepath": "", + "enable": false, + "security": false + }, + "prometheus": { + "basepath": "", + "enable": false, + "security": false + }, + "security": { + "basepath": "", + "enable": false, + "secret": "", + "users": null + }, + "souin": { + "basepath": "", + "enable": false, + "security": false + } + }, + "DefaultCache": { + "allowed_http_verbs": [], + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "cache_name": "", + "cdn": {}, + "default_cache_control": "", + "disable_coalescing": false, + "distributed": false, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "headers": null, + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" + }, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "regex": { + "exclude": "" + }, + "stale": "0s", + "storers": null, + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "0s" + }, + "LogLevel": "", + "SurrogateKeys": null, + "URLs": null, + "cache_keys": {} + }, + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "handler": "cache", + "key": {}, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "stale": "0s", + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "0s" + }, + { + "handler": "headers", + "response": { + "set": { + "Cache-Control": [ + "max-age=5" + ] + } + } + }, + { + "body": "Hello, max-age!", + "handler": "static_response" + } + ] + } + ] + } + ], + "match": [ + { + "path": [ + "/cache-maxage" + ] + } + ] + }, + { + "handle": [ + { + "handler": "subroute", + "routes": [ + { + "handle": [ + { + "Configuration": { + "API": { + "basepath": "", + "debug": { + "basepath": "", + "enable": false, + "security": false + }, + "prometheus": { + "basepath": "", + "enable": false, + "security": false + }, + "security": { + "basepath": "", + "enable": false, + "secret": "", + "users": null + }, + "souin": { + "basepath": "", + "enable": false, + "security": false + } + }, + "DefaultCache": { + "allowed_http_verbs": [], + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "cache_name": "", + "cdn": {}, + "default_cache_control": "", + "disable_coalescing": false, + "distributed": false, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "headers": null, + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" + }, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "regex": { + "exclude": "" + }, + "stale": "0s", + "storers": null, + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "5s" + }, + "LogLevel": "", + "SurrogateKeys": null, + "URLs": null, + "cache_keys": {} + }, + "badger": { + "configuration": null, + "path": "", + "url": "" + }, + "etcd": { + "configuration": null, + "path": "", + "url": "" + }, + "handler": "cache", + "key": {}, + "nuts": { + "configuration": null, + "path": "", + "url": "" + }, + "olric": { + "configuration": null, + "path": "", + "url": "" + }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, + "redis": { + "configuration": null, + "path": "", + "url": "" + }, + "stale": "0s", + "timeout": { + "backend": "0s", + "cache": "0s" + }, + "ttl": "0s" }, { - "body": "Hello {http.request.header.X-Surrogate-Key-Suffix}", - "handler": "static_response" + "handler": "reverse_proxy", + "upstreams": [ + { + "dial": "127.0.0.1:9000" + } + ] } ] } @@ -2663,7 +3957,7 @@ "match": [ { "path": [ - "/surrogate-keys" + "/not-modified" ] } ] @@ -2701,7 +3995,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -2712,6 +4005,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -2719,13 +4013,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -2737,6 +4030,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -2746,6 +4044,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -2754,7 +4053,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -2767,14 +4067,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -2785,6 +4078,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -2801,14 +4099,14 @@ "handler": "headers", "response": { "set": { - "Cache-Control": [ - "max-age=5" + "Content-Type": [ + "text/html" ] } } }, { - "body": "Hello, max-age!", + "body": "\u003ch1\u003eESI INCLUDE\u003c/h1\u003e", "handler": "static_response" } ] @@ -2819,7 +4117,7 @@ "match": [ { "path": [ - "/cache-maxage" + "/esi-include" ] } ] @@ -2857,7 +4155,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -2868,20 +4165,20 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", - "distributed": false, + "disable_coalescing": false, + "distributed": true, "etcd": { "configuration": null, "path": "", "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -2893,15 +4190,21 @@ "path": "", "url": "" }, - "redis": { + "otter": { "configuration": null, "path": "", "url": "" }, + "redis": { + "configuration": null, + "path": "", + "url": "127.0.0.1:6379" + }, "regex": { "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -2910,7 +4213,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -2923,14 +4227,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -2941,6 +4238,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -2954,12 +4256,8 @@ "ttl": "0s" }, { - "handler": "reverse_proxy", - "upstreams": [ - { - "dial": "127.0.0.1:9000" - } - ] + "body": "Hello redis url", + "handler": "static_response" } ] } @@ -2969,7 +4267,7 @@ "match": [ { "path": [ - "/not-modified" + "/redis-url" ] } ] @@ -3007,7 +4305,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -3018,6 +4315,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -3025,13 +4323,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -3043,6 +4340,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -3052,6 +4354,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -3060,7 +4363,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -3073,14 +4377,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -3091,6 +4388,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -3104,18 +4406,12 @@ "ttl": "0s" }, { - "handler": "headers", - "response": { - "set": { - "Content-Type": [ - "text/html" - ] + "handler": "reverse_proxy", + "upstreams": [ + { + "dial": "127.0.0.1:81" } - } - }, - { - "body": "\u003ch1\u003eESI INCLUDE\u003c/h1\u003e", - "handler": "static_response" + ] } ] } @@ -3125,7 +4421,7 @@ "match": [ { "path": [ - "/esi-include" + "/stream" ] } ] @@ -3163,7 +4459,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -3174,20 +4469,20 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", - "distributed": true, + "disable_coalescing": false, + "distributed": false, "etcd": { "configuration": null, "path": "", "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "bypass", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -3199,24 +4494,31 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", - "url": "127.0.0.1:6379" + "url": "" }, "regex": { "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" }, - "ttl": "5s" + "ttl": "0s" }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -3229,14 +4531,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -3247,6 +4542,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -3260,7 +4560,17 @@ "ttl": "0s" }, { - "body": "Hello redis url", + "handler": "headers", + "response": { + "set": { + "Cache-Control": [ + "no-store" + ] + } + } + }, + { + "body": "Hello bypass", "handler": "static_response" } ] @@ -3271,7 +4581,7 @@ "match": [ { "path": [ - "/redis-url" + "/bypass" ] } ] @@ -3309,7 +4619,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -3320,20 +4629,20 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", - "distributed": false, + "disable_coalescing": false, + "distributed": true, "etcd": { "configuration": null, "path": "", "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -3345,24 +4654,37 @@ "path": "", "url": "" }, - "redis": { + "otter": { "configuration": null, "path": "", "url": "" }, + "redis": { + "configuration": { + "ClientName": "souin-redis", + "InitAddress": [ + "127.0.0.1:6379" + ], + "SelectDB": 0 + }, + "path": "", + "url": "" + }, "regex": { "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" }, - "ttl": "0s" + "ttl": "5s" }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -3375,14 +4697,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -3393,6 +4708,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -3406,12 +4726,8 @@ "ttl": "0s" }, { - "handler": "reverse_proxy", - "upstreams": [ - { - "dial": "127.0.0.1:81" - } - ] + "body": "Hello redis", + "handler": "static_response" } ] } @@ -3421,7 +4737,7 @@ "match": [ { "path": [ - "/stream" + "/redis" ] } ] @@ -3459,7 +4775,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -3470,20 +4785,36 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": true, "etcd": { - "configuration": null, + "configuration": { + "AutoSyncInterval": "1s", + "DialKeepAliveTime": "1s", + "DialKeepAliveTimeout": "1s", + "DialTimeout": "1s", + "Endpoints": [ + "etcd1:2379", + "etcd2:2379", + "etcd3:2379" + ], + "MaxCallRecvMsgSize": "10000000", + "MaxCallSendMsgSize": "10000000", + "Password": "doe", + "PermitWithoutStream": "false", + "RejectOldCluster": "false", + "Username": "john" + }, "path": "", "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -3495,27 +4826,13 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { - "configuration": { - "Addr": "127.0.0.1:6379", - "ConnMaxIdleTime": 5000000000, - "ConnMaxLifetime": 5000000000, - "DB": 1, - "DialTimeout": 5000000000, - "MaxIdleConns": 100, - "MaxRetries": 1, - "MaxRetryBackoff": 5000000000, - "MinIdleConns": 100, - "MinRetryBackoff": 5000000000, - "Network": "my-network", - "Password": "password", - "PoolFIFO": true, - "PoolSize": 99999, - "PoolTimeout": 10000000000, - "ReadTimeout": 5000000000, - "Username": "user", - "WriteTimeout": 5000000000 - }, + "configuration": null, "path": "", "url": "" }, @@ -3523,6 +4840,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -3531,7 +4849,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -3544,14 +4863,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -3562,6 +4874,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -3575,7 +4892,7 @@ "ttl": "0s" }, { - "body": "Hello redis", + "body": "Hello etcd", "handler": "static_response" } ] @@ -3586,7 +4903,7 @@ "match": [ { "path": [ - "/redis" + "/etcd" ] } ] @@ -3624,7 +4941,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -3635,47 +4951,36 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", - "distributed": true, + "disable_coalescing": false, + "distributed": false, "etcd": { - "configuration": { - "AutoSyncInterval": "1s", - "DialKeepAliveTime": "1s", - "DialKeepAliveTimeout": "1s", - "DialTimeout": "1s", - "Endpoints": [ - "etcd1:2379", - "etcd2:2379", - "etcd3:2379" - ], - "MaxCallRecvMsgSize": "10000000", - "MaxCallSendMsgSize": "10000000", - "Password": "doe", - "PermitWithoutStream": "false", - "RejectOldCluster": "false", - "Username": "john" - }, + "configuration": null, "path": "", "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, "path": "", - "url": "" + "url": "nats://127.0.0.1:4222" }, "olric": { "configuration": null, "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -3685,6 +4990,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -3693,7 +4999,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -3706,14 +5013,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -3724,6 +5024,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -3737,7 +5042,7 @@ "ttl": "0s" }, { - "body": "Hello etcd", + "body": "Hello nats", "handler": "static_response" } ] @@ -3748,7 +5053,7 @@ "match": [ { "path": [ - "/etcd" + "/nats" ] } ] @@ -3786,7 +5091,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -3797,6 +5101,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -3804,13 +5109,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -3822,6 +5126,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -3831,6 +5140,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -3839,7 +5149,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -3852,14 +5163,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -3870,6 +5174,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -3942,7 +5251,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -3953,6 +5261,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -3960,13 +5269,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -3978,6 +5286,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -3987,6 +5300,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -3995,7 +5309,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -4008,14 +5323,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -4026,6 +5334,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -4108,7 +5421,6 @@ "security": false } }, - "CfgCacheKeys": null, "DefaultCache": { "allowed_http_verbs": [], "badger": { @@ -4119,6 +5431,7 @@ "cache_name": "", "cdn": {}, "default_cache_control": "", + "disable_coalescing": false, "distributed": false, "etcd": { "configuration": null, @@ -4126,13 +5439,12 @@ "url": "" }, "headers": null, - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false + "key": {}, + "mode": "", + "nats": { + "configuration": null, + "path": "", + "url": "" }, "nuts": { "configuration": null, @@ -4144,6 +5456,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -4153,6 +5470,7 @@ "exclude": "" }, "stale": "0s", + "storers": null, "timeout": { "backend": "0s", "cache": "0s" @@ -4161,7 +5479,8 @@ }, "LogLevel": "", "SurrogateKeys": null, - "URLs": null + "URLs": null, + "cache_keys": {} }, "badger": { "configuration": null, @@ -4174,14 +5493,7 @@ "url": "" }, "handler": "cache", - "key": { - "disable_body": false, - "disable_host": false, - "disable_method": false, - "disable_query": false, - "headers": null, - "hide": false - }, + "key": {}, "nuts": { "configuration": null, "path": "", @@ -4192,6 +5504,11 @@ "path": "", "url": "" }, + "otter": { + "configuration": null, + "path": "", + "url": "" + }, "redis": { "configuration": null, "path": "", @@ -4215,7 +5532,7 @@ } }, { - "body": "", + "body": "\u003cesi:include src=\"http://localhost:4443/esi-include\" alt=http://localhost:4443/alt-esi-include /\u003e", "handler": "static_response" } ] diff --git a/dispatch.go b/dispatch.go new file mode 100644 index 0000000..2866921 --- /dev/null +++ b/dispatch.go @@ -0,0 +1,175 @@ +package httpcache + +import ( + "fmt" + "strings" + + "github.com/caddyserver/caddy/v2" +) + +func (s *SouinCaddyMiddleware) parseStorages(ctx caddy.Context) { + if s.Configuration.DefaultCache.Badger.Found { + e := dispatchStorage(ctx, "badger", s.Configuration.DefaultCache.Badger, s.Configuration.DefaultCache.GetStale()) + if e != nil { + s.logger.Errorf("Error during Badger init, did you include the Badger storage (--with github.com/darkweak/storages/badger/caddy)? %v", e) + } else { + badger := s.Configuration.DefaultCache.Badger + dir := "" + vdir := "" + if c := badger.Configuration; c != nil { + p, ok := c.(map[string]interface{}) + if ok { + if d, ok := p["Dir"]; ok { + dir = fmt.Sprint(d) + vdir = fmt.Sprint(d) + } + if d, ok := p["ValueDir"]; ok { + vdir = fmt.Sprint(d) + } + } + } + s.Configuration.DefaultCache.Badger.Uuid = fmt.Sprintf( + "BADGER-%s-%s-%s", + dir, + vdir, + s.Configuration.DefaultCache.GetStale(), + ) + } + } + if s.Configuration.DefaultCache.Etcd.Found { + e := dispatchStorage(ctx, "etcd", s.Configuration.DefaultCache.Etcd, s.Configuration.DefaultCache.GetStale()) + if e != nil { + s.logger.Errorf("Error during Etcd init, did you include the Etcd storage (--with github.com/darkweak/storages/etcd/caddy)? %v", e) + } else { + etcd := s.Configuration.DefaultCache.Etcd + endpoints := etcd.URL + username := "" + password := "" + if c := etcd.Configuration; c != nil { + p, ok := c.(map[string]interface{}) + if ok { + if d, ok := p["Endpoints"]; ok { + endpoints = fmt.Sprint(d) + } + if d, ok := p["Username"]; ok { + username = fmt.Sprint(d) + } + if d, ok := p["Password"]; ok { + password = fmt.Sprint(d) + } + } + } + s.Configuration.DefaultCache.Etcd.Uuid = fmt.Sprintf( + "ETCD-%s-%s-%s-%s", + endpoints, + username, + password, + s.Configuration.DefaultCache.GetStale(), + ) + } + } + if s.Configuration.DefaultCache.Nats.Found { + e := dispatchStorage(ctx, "nats", s.Configuration.DefaultCache.Nats, s.Configuration.DefaultCache.GetStale()) + if e != nil { + s.logger.Errorf("Error during Nats init, did you include the Nats storage (--with github.com/darkweak/storages/nats/caddy)? %v", e) + } else { + s.Configuration.DefaultCache.Nuts.Uuid = fmt.Sprintf("NATS-%s-%s", s.Configuration.DefaultCache.Nats.URL, s.Configuration.DefaultCache.GetStale()) + } + } + if s.Configuration.DefaultCache.Nuts.Found { + e := dispatchStorage(ctx, "nuts", s.Configuration.DefaultCache.Nuts, s.Configuration.DefaultCache.GetStale()) + if e != nil { + s.logger.Errorf("Error during Nuts init, did you include the Nuts storage (--with github.com/darkweak/storages/nuts/caddy)? %v", e) + } else { + nuts := s.Configuration.DefaultCache.Nuts + dir := "/tmp/souin-nuts" + if c := nuts.Configuration; c != nil { + p, ok := c.(map[string]interface{}) + if ok { + if d, ok := p["Dir"]; ok { + dir = fmt.Sprint(d) + } + } + } else if nuts.Path != "" { + dir = nuts.Path + } + s.Configuration.DefaultCache.Nuts.Uuid = fmt.Sprintf("NUTS-%s-%s", dir, s.Configuration.DefaultCache.GetStale()) + } + } + if s.Configuration.DefaultCache.Olric.Found { + e := dispatchStorage(ctx, "olric", s.Configuration.DefaultCache.Olric, s.Configuration.DefaultCache.GetStale()) + if e != nil { + s.logger.Errorf("Error during Olric init, did you include the Olric storage (--with github.com/darkweak/storages/olric/caddy)? %v", e) + } else { + s.Configuration.DefaultCache.Nuts.Uuid = fmt.Sprintf("OLRIC-%s-%s", s.Configuration.DefaultCache.Olric.URL, s.Configuration.DefaultCache.GetStale()) + } + } + if s.Configuration.DefaultCache.Otter.Found { + e := dispatchStorage(ctx, "otter", s.Configuration.DefaultCache.Otter, s.Configuration.DefaultCache.GetStale()) + if e != nil { + s.logger.Errorf("Error during Otter init, did you include the Otter storage (--with github.com/darkweak/storages/otter/caddy)? %v", e) + } else { + s.Configuration.DefaultCache.Otter.Uuid = fmt.Sprintf("OTTER-%s", s.Configuration.DefaultCache.GetStale()) + } + } + if s.Configuration.DefaultCache.Redis.Found { + e := dispatchStorage(ctx, "redis", s.Configuration.DefaultCache.Redis, s.Configuration.DefaultCache.GetStale()) + if e != nil { + s.logger.Errorf("Error during Redis init, did you include the Redis storage (--with github.com/darkweak/storages/redis/caddy or github.com/darkweak/storages/go-redis/caddy)? %v", e) + } else { + redis := s.Configuration.DefaultCache.Redis + address := redis.URL + username := "" + dbname := "0" + cname := "" + if c := redis.Configuration; c != nil { + p, ok := c.(map[string]interface{}) + if ok { + // shared between go-redis and rueidis + if d, ok := p["Username"]; ok { + username = fmt.Sprint(d) + } + if d, ok := p["ClientName"]; ok { + cname = fmt.Sprint(d) + } + + // rueidis + if d, ok := p["InitAddress"]; ok { + elements := make([]string, 0) + + for _, elt := range d.([]interface{}) { + elements = append(elements, elt.(string)) + } + + address = strings.Join(elements, ",") + } + if d, ok := p["SelectDB"]; ok { + dbname = fmt.Sprint(d) + } + + // go-redis + if d, ok := p["Addrs"]; ok { + elements := make([]string, 0) + + for _, elt := range d.([]interface{}) { + elements = append(elements, elt.(string)) + } + + address = strings.Join(elements, ",") + } + if d, ok := p["DB"]; ok { + dbname = fmt.Sprint(d) + } + } + } + s.Configuration.DefaultCache.Redis.Uuid = fmt.Sprintf( + "REDIS-%s-%s-%s-%s-%s", + address, + username, + dbname, + cname, + s.Configuration.DefaultCache.GetStale(), + ) + } + } +} diff --git a/go.mod b/go.mod index 84b2026..b6e324e 100644 --- a/go.mod +++ b/go.mod @@ -1,14 +1,11 @@ module github.com/caddyserver/cache-handler -go 1.21.0 - -toolchain go1.21.2 +go 1.22.1 require ( - github.com/buraksezer/olric v0.5.4 - github.com/caddyserver/caddy/v2 v2.8.1 - github.com/darkweak/souin v1.6.49 - go.uber.org/zap v1.27.0 + github.com/caddyserver/caddy/v2 v2.8.4 + github.com/darkweak/souin v1.7.0 + github.com/darkweak/storages/core v0.0.8 ) require ( @@ -19,40 +16,26 @@ require ( github.com/Masterminds/semver/v3 v3.2.0 // indirect github.com/Masterminds/sprig/v3 v3.2.3 // indirect github.com/Microsoft/go-winio v0.6.0 // indirect - github.com/RoaringBitmap/roaring v1.2.3 // indirect github.com/alecthomas/chroma/v2 v2.13.0 // indirect - github.com/antlabs/stl v0.0.1 // indirect - github.com/antlabs/timer v0.0.11 // indirect github.com/antlr4-go/antlr/v4 v4.13.0 // indirect - github.com/armon/go-metrics v0.4.1 // indirect github.com/aryann/difflib v0.0.0-20210328193216-ff5ff6dc229b // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.5.0 // indirect - github.com/buraksezer/consistent v0.10.0 // indirect - github.com/bwmarrin/snowflake v0.3.0 // indirect - github.com/caddyserver/certmagic v0.21.2 // indirect + github.com/caddyserver/certmagic v0.21.3 // indirect github.com/caddyserver/zerossl v0.1.3 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chzyer/readline v1.5.1 // indirect - github.com/coreos/go-semver v0.3.1 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/darkweak/go-esi v0.0.5 // indirect github.com/dgraph-io/badger v1.6.2 // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect - github.com/dgraph-io/badger/v3 v3.2103.5 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dlclark/regexp2 v1.11.0 // indirect - github.com/dolthub/maphash v0.1.0 // indirect - github.com/dolthub/swiss v0.2.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fxamacker/cbor/v2 v2.6.0 // indirect - github.com/gammazero/deque v0.2.1 // indirect github.com/go-chi/chi/v5 v5.0.12 // indirect github.com/go-jose/go-jose/v3 v3.0.3 // indirect github.com/go-kit/kit v0.13.0 // indirect @@ -60,32 +43,18 @@ require ( github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/go-sql-driver/mysql v1.7.1 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v1.2.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/btree v1.1.2 // indirect github.com/google/cel-go v0.20.1 // indirect github.com/google/certificate-transparency-go v1.1.8-0.20240110162603-74a5dd331745 // indirect - github.com/google/flatbuffers v23.1.21+incompatible // indirect github.com/google/go-tpm v0.9.0 // indirect github.com/google/go-tspi v0.3.0 // indirect github.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-msgpack v0.5.5 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-sockaddr v1.0.2 // indirect - github.com/hashicorp/golang-lru v0.5.5-0.20200511160909-eb529947af53 // indirect - github.com/hashicorp/logutils v1.0.0 // indirect - github.com/hashicorp/memberlist v0.5.0 // indirect github.com/huandu/xstrings v1.3.3 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -103,16 +72,13 @@ require ( github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/maypok86/otter v1.1.1 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/mholt/acmez/v2 v2.0.1 // indirect github.com/miekg/dns v1.1.59 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-ps v1.0.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/mschoch/smat v0.2.0 // indirect - github.com/nutsdb/nutsdb v0.14.3 // indirect - github.com/onsi/ginkgo/v2 v2.13.2 // indirect + github.com/onsi/ginkgo/v2 v2.15.0 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pires/go-proxyproto v0.7.0 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -123,10 +89,8 @@ require ( github.com/prometheus/procfs v0.12.0 // indirect github.com/quic-go/qpack v0.4.0 // indirect github.com/quic-go/quic-go v0.44.0 // indirect - github.com/redis/rueidis v1.0.31 // indirect github.com/rs/xid v1.5.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect github.com/shopspring/decimal v1.2.0 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect @@ -142,23 +106,12 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/stoewer/go-strcase v1.2.0 // indirect github.com/tailscale/tscert v0.0.0-20240517230440-bbccfbf48933 // indirect - github.com/tidwall/btree v1.6.0 // indirect - github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/redcon v1.6.2 // indirect github.com/urfave/cli v1.22.14 // indirect - github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect - github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/x448/float16 v0.8.4 // indirect - github.com/xujiajun/mmap-go v1.0.1 // indirect - github.com/xujiajun/utils v0.0.0-20220904132955-5f7c5b914235 // indirect github.com/yuin/goldmark v1.7.1 // indirect github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc // indirect github.com/zeebo/blake3 v0.2.3 // indirect go.etcd.io/bbolt v1.3.9 // indirect - go.etcd.io/etcd/api/v3 v3.5.12 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.12 // indirect - go.etcd.io/etcd/client/v3 v3.5.12 // indirect - go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect go.opentelemetry.io/contrib/propagators/autoprop v0.42.0 // indirect go.opentelemetry.io/contrib/propagators/aws v1.17.0 // indirect @@ -178,6 +131,7 @@ require ( go.uber.org/automaxprocs v1.5.3 // indirect go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect go.uber.org/zap/exp v0.2.0 // indirect golang.org/x/crypto v0.23.0 // indirect golang.org/x/crypto/x509roots/fallback v0.0.0-20240507223354-67b13616a595 // indirect @@ -193,9 +147,8 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20240506185236-b8a5c65736ae // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 // indirect google.golang.org/grpc v1.63.2 // indirect - google.golang.org/protobuf v1.34.1 // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect howett.net/plist v1.0.0 // indirect ) diff --git a/go.sum b/go.sum index 62dcdc3..5d86c4e 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= cloud.google.com/go/auth v0.4.1 h1:Z7YNIhlWRtrnKlZke7z3GMqzvuYzdc2z98F9D1NV5Hg= cloud.google.com/go/auth v0.4.1/go.mod h1:QVBuVEKpCn4Zp58hzRGvL0tjRGU0YqdRTdCHM1IHnro= @@ -20,7 +19,6 @@ github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOv github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= @@ -32,9 +30,6 @@ github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2y github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/RoaringBitmap/roaring v1.2.1/go.mod h1:icnadbWcNyfEHlYdr+tDlOTih1Bf/h+rzPpv4sbomAA= -github.com/RoaringBitmap/roaring v1.2.3 h1:yqreLINqIrX22ErkKI0vY47/ivtJr6n+kMhVOVmhWBY= -github.com/RoaringBitmap/roaring v1.2.3/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/3y6cubLI4/1yE= github.com/alecthomas/assert/v2 v2.6.0 h1:o3WJwILtexrEUk3cUVal3oiQY2tfgr/FHWiz/v2n4FU= github.com/alecthomas/assert/v2 v2.6.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= @@ -43,21 +38,9 @@ github.com/alecthomas/chroma/v2 v2.13.0/go.mod h1:BUGjjsD+ndS6eX37YgTchSEG+Jg9Jv github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/antlabs/stl v0.0.1 h1:TRD3csCrjREeLhLoQ/supaoCvFhNLBTNIwuRGrDIs6Q= -github.com/antlabs/stl v0.0.1/go.mod h1:wvVwP1loadLG3cRjxUxK8RL4Co5xujGaZlhbztmUEqQ= -github.com/antlabs/timer v0.0.11 h1:z75oGFLeTqJHMOcWzUPBKsBbQAz4Ske3AfqJ7bsdcwU= -github.com/antlabs/timer v0.0.11/go.mod h1:JNV8J3yGvMKhCavGXgj9HXrVZkfdQyKCcqXBT8RdyuU= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20210328193216-ff5ff6dc229b h1:uUXgbcPDK3KpW29o4iy7GtuappbWT0l5NaMo9H9pJDw= github.com/aryann/difflib v0.0.0-20210328193216-ff5ff6dc229b/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= @@ -88,33 +71,19 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.28.7 h1:et3Ta53gotFR4ERLXXHIHl/Uuk1q github.com/aws/aws-sdk-go-v2/service/sts v1.28.7/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw= github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= -github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/buraksezer/consistent v0.10.0 h1:hqBgz1PvNLC5rkWcEBVAL9dFMBWz6I0VgUCW25rrZlU= -github.com/buraksezer/consistent v0.10.0/go.mod h1:6BrVajWq7wbKZlTOUPs/XVfR8c0maujuPowduSpZqmw= -github.com/buraksezer/olric v0.5.4 h1:LDgLIfVoyol4qzdNirrrDUKqzFw0yDsa7ukvLrpP4cU= -github.com/buraksezer/olric v0.5.4/go.mod h1:ndjlnRvJfFrE8eJlQNBJsDJa11tIsb5BXSfPmTi7qjE= -github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0= -github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= -github.com/caddyserver/caddy/v2 v2.8.1 h1:UVWB6J5f/GwHPyvdTrm0uM7YhfaWb4Ztdrp/z6ROHsM= -github.com/caddyserver/caddy/v2 v2.8.1/go.mod h1:fb5FjJLu9ii9ojskkUk8kSYDYy4DBxR0GMKLA/4WaME= -github.com/caddyserver/certmagic v0.21.2 h1:O18LtaYBGDooyy257cYePnhp4lPfz6TaJELil6Q1fDg= -github.com/caddyserver/certmagic v0.21.2/go.mod h1:Zq6pklO9nVRl3DIFUw9gVUfXKdpc/0qwTUAQMBlfgtI= +github.com/caddyserver/caddy/v2 v2.8.4 h1:q3pe0wpBj1OcHFZ3n/1nl4V4bxBrYoSoab7rL9BMYNk= +github.com/caddyserver/caddy/v2 v2.8.4/go.mod h1:vmDAHp3d05JIvuhc24LmnxVlsZmWnUwbP5WMjzcMPWw= +github.com/caddyserver/certmagic v0.21.3 h1:pqRRry3yuB4CWBVq9+cUqu+Y6E2z8TswbhNx1AZeYm0= +github.com/caddyserver/certmagic v0.21.3/go.mod h1:Zq6pklO9nVRl3DIFUw9gVUfXKdpc/0qwTUAQMBlfgtI= github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA= github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -126,21 +95,13 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= -github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= @@ -148,8 +109,10 @@ github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/darkweak/go-esi v0.0.5 h1:b9LHI8Tz46R+i6p8avKPHAIBRQUCZDebNmKm5w/Zrns= github.com/darkweak/go-esi v0.0.5/go.mod h1:koCJqwum1u6mslyZuq/Phm6hfG1K3ZK5Y7jrUBTH654= -github.com/darkweak/souin v1.6.49 h1:omKJtQZuqU9loG3pgPHuVb1EQrcNBfqzf2VX19sID3g= -github.com/darkweak/souin v1.6.49/go.mod h1:7i+R1UmeKPPQY+NqW2U1m4ZmCAS9vYxAj32torCn1zk= +github.com/darkweak/souin v1.7.0 h1:QeSxwHECzZPlYHTGYDw4xQ6EBJY94f/nfqW4BLc3YQ0= +github.com/darkweak/souin v1.7.0/go.mod h1:XXmhB+QIiZ/lkESd1izzqCI7QWxmX0of01QA+xxgogc= +github.com/darkweak/storages/core v0.0.8 h1:9e7rOxHiJwnvADDVCZ7LFRnUnOHGT+UMpNOFlR8BOiw= +github.com/darkweak/storages/core v0.0.8/go.mod h1:ajTpB9IFLRIRY0EEFLjM5vtsrcNTh+TJK9yRxgG5/wY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -157,8 +120,6 @@ github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgraph-io/badger/v3 v3.2103.5 h1:ylPa6qzbjYRQMU6jokoj4wzcaweHylt//CH0AKt0akg= -github.com/dgraph-io/badger/v3 v3.2103.5/go.mod h1:4MPiseMeDQ3FNCYwRbbcBOGJLf5jsE0PPFzRiKjtcdw= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= @@ -166,48 +127,28 @@ github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkz github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dolthub/maphash v0.1.0 h1:bsQ7JsF4FkkWyrP3oCnFJgrCUAFbFf3kOl4L/QxPDyQ= -github.com/dolthub/maphash v0.1.0/go.mod h1:gkg4Ch4CdCDu5h6PMriVLawB7koZ+5ijb9puGMV50a4= -github.com/dolthub/swiss v0.2.1 h1:gs2osYs5SJkAaH5/ggVJqXQxRXtWshF6uE0lgR/Y3Gw= -github.com/dolthub/swiss v0.2.1/go.mod h1:8AhKZZ1HK7g18j7v7k6c5cYIGEZJcPn0ARsai8cUrh0= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fxamacker/cbor/v2 v2.6.0 h1:sU6J2usfADwWlYDAFhZBQ6TnLFBHxgesMrQfQgk1tWA= github.com/fxamacker/cbor/v2 v2.6.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/gammazero/deque v0.2.1 h1:qSdsbG6pgp6nL7A0+K/B7s12mcCY/5l5SIUpMOl+dC0= -github.com/gammazero/deque v0.2.1/go.mod h1:LFroj8x4cMYCukHJDbxFCkT+r9AndaJnFMuZDV34tuU= github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= github.com/go-kit/kit v0.4.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= @@ -217,50 +158,25 @@ github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= -github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.6.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/cel-go v0.20.1 h1:nDx9r8S3L4pE61eDdt8igGj8rf5kjYR3ILxWIpWNi84= @@ -268,17 +184,6 @@ github.com/google/cel-go v0.20.1/go.mod h1:kWcIzTsPX0zmQ+H3TirHstLLf9ep5QTsZBN9u github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= github.com/google/certificate-transparency-go v1.1.8-0.20240110162603-74a5dd331745 h1:heyoXNxkRT155x4jTAiSv5BVSVkueifPUm+Q8LUXMRo= github.com/google/certificate-transparency-go v1.1.8-0.20240110162603-74a5dd331745/go.mod h1:zN0wUQgV9LjwLZeFHnrAbQi8hzMVvEWePyk+MhPOk7k= -github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v23.1.21+incompatible h1:bUqzx/MXCDxuS0hRJL2EfjyZL3uQrPbMocUa8zGqsTA= -github.com/google/flatbuffers v23.1.21+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -288,15 +193,12 @@ github.com/google/go-tpm-tools v0.4.4 h1:oiQfAIkc6xTy9Fl5NKTeTJkBTlXdHsxAofmQyxB github.com/google/go-tpm-tools v0.4.4/go.mod h1:T8jXkp2s+eltnCDIsXR84/MTcVU9Ja7bh3Mit0pa4AY= github.com/google/go-tspi v0.3.0 h1:ADtq8RKfP+jrTyIWIZDIYcKOMecRqNJFOew2IT0Inus= github.com/google/go-tspi v0.3.0/go.mod h1:xfMGI3G0PhxCdNVcYr1C4C+EizojDg/TXuX5by8CiHI= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU= github.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= @@ -305,39 +207,11 @@ github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-uuid v1.0.0 h1:RS8zrF7PhGwyNPOtxSClXXj9HA8feRnJzgnI1RJCSnM= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.5-0.20200511160909-eb529947af53 h1:mcyf48FjrlX8JRXvy5v3LPeXBv+Um6WvoKS+kknfgIk= -github.com/hashicorp/golang-lru v0.5.5-0.20200511160909-eb529947af53/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= -github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= @@ -392,10 +266,6 @@ github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0f github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= @@ -405,7 +275,6 @@ github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuV github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -426,70 +295,36 @@ github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfs github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/maypok86/otter v1.1.1 h1:1WyOfBz2m8bjc4dAmJeUSuyUshoTP8ViiYmvRWO+53w= -github.com/maypok86/otter v1.1.1/go.mod h1:IuSnpxeUyjKPPjqGzhGKOO26tedMNl45vwGcdXsEi8U= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mholt/acmez/v2 v2.0.1 h1:3/3N0u1pLjMK4sNEAFSI+bcvzbPhRpY383sy1kLHJ6k= github.com/mholt/acmez/v2 v2.0.1/go.mod h1:fX4c9r5jYwMyMsC+7tkYRxHibkOTgta5DIFGoe67e1U= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.45/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM= -github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nutsdb/nutsdb v0.14.3 h1:IcHyiAtVXgaYvqnjugiVl2+9tjhK5ElBI+KtaXwKdwY= -github.com/nutsdb/nutsdb v0.14.3/go.mod h1:6inOji9rFBporXeHDjJny4g50RpQbkjSK5jI1hht0j8= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.13.2 h1:Bi2gGVkfn6gQcjNjZJVO8Gf0FHzMPf2phUei9tejVMs= -github.com/onsi/ginkgo/v2 v2.13.2/go.mod h1:XStQ8QcGwLyF4HdfcZB8SFOS/MWCgDuXMSBe6zrvLgM= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= +github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv/v3 v3.0.1 h1:x06SQA46+PKIUftmEujdwSEpIx8kR+M9eLYsUxeYveU= github.com/peterbourgon/diskv/v3 v3.0.1/go.mod h1:kJ5Ny7vLdARGU3WUuy6uzO6T0nb/2gWcT1JiBvRmb5o= @@ -497,43 +332,27 @@ github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pires/go-proxyproto v0.7.0 h1:IukmRewDQFWC7kfnb66CSomk2q/seBuilHBYFwyq0Hs= github.com/pires/go-proxyproto v0.7.0/go.mod h1:Vz/1JPY/OACxWGQNIRY2BeyDmpoaWmEP40O9LbuiFR4= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/pquerna/cachecontrol v0.2.0 h1:vBXSNuE5MYP9IJ5kjsdo8uq+w41jSPgvba2DEnkRx9k= github.com/pquerna/cachecontrol v0.2.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= github.com/quic-go/quic-go v0.44.0 h1:So5wOr7jyO4vzL2sd8/pD9Kesciv91zSk8BoFngItQ0= github.com/quic-go/quic-go v0.44.0/go.mod h1:z4cx/9Ny9UtGITIPzmPTXh1ULfOyWh4qGQlpnPcWmek= -github.com/redis/rueidis v1.0.31 h1:S2NlrMB1N+yB+QEKD4o0lV+5GNIeLo/ZMpN42ONcwg0= -github.com/redis/rueidis v1.0.31/go.mod h1:g8nPmgR4C68N3abFiOc/gUOSEKw3Tom6/teYMehg4RE= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= @@ -545,18 +364,14 @@ github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThC github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/jsonstore v1.1.0 h1:WZBDjgezFS34CHI+myb4s8GGpir3UMpy7vWoCeO0n6E= github.com/schollz/jsonstore v1.1.0/go.mod h1:15c6+9guw8vDRyozGjN3FoILt0wpruJk9Pi66vjaZfg= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -609,37 +424,17 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tailscale/tscert v0.0.0-20240517230440-bbccfbf48933 h1:pV0H+XIvFoP7pl1MRtyPXh5hqoxB5I7snOtTHgrn6HU= github.com/tailscale/tscert v0.0.0-20240517230440-bbccfbf48933/go.mod h1:kNGUQ3VESx3VZwRwA9MSCUegIl6+saPL8Noq82ozCaU= -github.com/tidwall/btree v1.1.0/go.mod h1:TzIRzen6yHbibdSfK6t8QimqbUnoxUSrZfeW7Uob0q4= -github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= -github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/redcon v1.6.2 h1:5qfvrrybgtO85jnhSravmkZyC0D+7WstbfCs3MmPhow= -github.com/tidwall/redcon v1.6.2/go.mod h1:p5Wbsgeyi2VSTBWOcA5vRXrOb9arFTcU2+ZzFjqV75Y= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= -github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/xujiajun/mmap-go v1.0.1 h1:7Se7ss1fLPPRW+ePgqGpCkfGIZzJV6JPq9Wq9iv/WHc= -github.com/xujiajun/mmap-go v1.0.1/go.mod h1:CNN6Sw4SL69Sui00p0zEzcZKbt+5HtEnYUsc6BKKRMg= -github.com/xujiajun/utils v0.0.0-20220904132955-5f7c5b914235 h1:w0si+uee0iAaCJO9q86T6yrhdadgcsoNuh47LrUykzg= -github.com/xujiajun/utils v0.0.0-20220904132955-5f7c5b914235/go.mod h1:MR4+0R6A9NS5IABnIM3384FfOq8QFVnm7WDrBOhIaMU= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.4.15/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.7.1 h1:3bajkSilaCbjdKVsKdZjZCLBNPL9pYzrCakKaf4U49U= @@ -655,13 +450,6 @@ github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= -go.etcd.io/etcd/api/v3 v3.5.12 h1:W4sw5ZoU2Juc9gBWuLk5U6fHfNVyY1WC5g9uiXZio/c= -go.etcd.io/etcd/api/v3 v3.5.12/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4= -go.etcd.io/etcd/client/pkg/v3 v3.5.12 h1:EYDL6pWwyOsylrQyLp2w+HkQ46ATiOvoEdMarindU2A= -go.etcd.io/etcd/client/pkg/v3 v3.5.12/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4= -go.etcd.io/etcd/client/v3 v3.5.12 h1:v5lCPXn1pf1Uu3M4laUE2hp/geOTc5uPcYYsNe1lDxg= -go.etcd.io/etcd/client/v3 v3.5.12/go.mod h1:tSbBCakoWmmddL+BKVAJHa9km+O/E+bumDe9mSbPiqw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= @@ -721,13 +509,11 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.uber.org/zap/exp v0.2.0 h1:FtGenNNeCATRB3CmB/yEUnjEFeJWpB/pMcy7e2bKPYs= go.uber.org/zap/exp v0.2.0/go.mod h1:t0gqAIdh1MfKv9EwN/dLwfZnJxe9ITAZN78HEWPFWDQ= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= @@ -740,103 +526,52 @@ golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto/x509roots/fallback v0.0.0-20240507223354-67b13616a595 h1:TgSqweA595vD0Zt86JzLv3Pb/syKg8gd5KMGGbJPYFw= golang.org/x/crypto/x509roots/fallback v0.0.0-20240507223354-67b13616a595/go.mod h1:kNa9WdvYnzFwC79zRpLRMJbdEFlhyM5RPFBBZp/wWH8= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181221143128-b4a75ba826a6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -870,22 +605,14 @@ golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= @@ -894,72 +621,36 @@ golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.180.0 h1:M2D87Yo0rGBPWpo1orwfCLehUUL6E7/TYe5gvMQWDh4= google.golang.org/api v0.180.0/go.mod h1:51AiyoEg1MJPSZ9zvklA8VnRILPXxn1iVen9v25XHAE= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda h1:wu/KJm9KJwpfHWhkkZGohVC6KRrc1oJNr4jwtQMOQXw= google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda/go.mod h1:g2LLCvCeCSir/JJSWosk19BR4NVxGqHUC6rxIRsd7Aw= google.golang.org/genproto/googleapis/api v0.0.0-20240506185236-b8a5c65736ae h1:AH34z6WAGVNkllnKs5raNq3yRq93VnjBG6rpfub/jYk= google.golang.org/genproto/googleapis/api v0.0.0-20240506185236-b8a5c65736ae/go.mod h1:FfiGhwUm6CJviekPrc0oJ+7h29e+DmWU6UtjX0ZvI7Y= google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 h1:DujSIu+2tC9Ht0aPNA7jgj23Iq8Ewi5sgkQ++wdvonE= google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= diff --git a/httpcache.go b/httpcache.go index 21330a1..079d785 100644 --- a/httpcache.go +++ b/httpcache.go @@ -1,11 +1,10 @@ package httpcache import ( - "fmt" + "encoding/json" "net/http" "time" - "github.com/buraksezer/olric/config" "github.com/caddyserver/caddy/v2" "github.com/caddyserver/caddy/v2/caddyconfig" "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile" @@ -13,10 +12,8 @@ import ( "github.com/caddyserver/caddy/v2/modules/caddyhttp" "github.com/darkweak/souin/configurationtypes" "github.com/darkweak/souin/pkg/middleware" - "github.com/darkweak/souin/pkg/storage" - "github.com/darkweak/souin/pkg/storage/types" surrogates_providers "github.com/darkweak/souin/pkg/surrogate/providers" - "go.uber.org/zap" + "github.com/darkweak/storages/core" ) const moduleName = "cache" @@ -35,7 +32,7 @@ func init() { // distributed and not-distributed storage, key generation tweaking. type SouinCaddyMiddleware struct { *middleware.SouinBaseHandler - logger *zap.Logger + logger core.Logger cacheKeys configurationtypes.CacheKeys Configuration Configuration // Logger level, fallback on caddy's one when not redefined. @@ -145,7 +142,7 @@ func (s *SouinCaddyMiddleware) FromApp(app *SouinApp) error { } return nil } - if s.Configuration.CacheKeys == nil || len(s.Configuration.CacheKeys) == 0 { + if len(s.Configuration.CacheKeys) == 0 { s.Configuration.CacheKeys = configurationtypes.CacheKeys{} } if s.CacheKeys == nil { @@ -201,25 +198,13 @@ func (s *SouinCaddyMiddleware) FromApp(app *SouinApp) error { if dc.CacheName == "" { s.Configuration.DefaultCache.CacheName = appDc.CacheName } - if dc.Etcd.Configuration == nil && dc.Redis.URL == "" && dc.Redis.Path == "" && dc.Redis.Configuration == nil && dc.Olric.URL == "" && dc.Olric.Path == "" && dc.Olric.Configuration == nil { + if !s.Configuration.DefaultCache.Distributed && !dc.Olric.Found && !dc.Redis.Found && !dc.Etcd.Found && !dc.Badger.Found && !dc.Nuts.Found && !dc.Otter.Found { s.Configuration.DefaultCache.Distributed = appDc.Distributed - } - if dc.Olric.URL == "" && dc.Olric.Path == "" && dc.Olric.Configuration == nil { s.Configuration.DefaultCache.Olric = appDc.Olric - } - if dc.Redis.URL == "" && dc.Redis.Path == "" && dc.Redis.Configuration == nil { s.Configuration.DefaultCache.Redis = appDc.Redis - } - if dc.Etcd.Configuration == nil { s.Configuration.DefaultCache.Etcd = appDc.Etcd - } - if dc.Badger.Path == "" || dc.Badger.Configuration == nil { s.Configuration.DefaultCache.Badger = appDc.Badger - } - if dc.Nuts.Path == "" && dc.Nuts.Configuration == nil { s.Configuration.DefaultCache.Nuts = appDc.Nuts - } - if dc.Otter.Configuration == nil { s.Configuration.DefaultCache.Otter = appDc.Otter } if dc.Regex.Exclude == "" { @@ -229,9 +214,23 @@ func (s *SouinCaddyMiddleware) FromApp(app *SouinApp) error { return nil } +func dispatchStorage(ctx caddy.Context, name string, provider configurationtypes.CacheProvider, stale time.Duration) error { + b, _ := json.Marshal(core.Configuration{ + Provider: core.CacheProvider{ + Path: provider.Path, + Configuration: provider.Configuration, + URL: provider.URL, + }, + Stale: stale, + }) + _, e := ctx.LoadModuleByID("storages.cache."+name, b) + + return e +} + // Provision to do the provisioning part. func (s *SouinCaddyMiddleware) Provision(ctx caddy.Context) error { - s.logger = ctx.Logger(s) + s.logger = ctx.Logger(s).Sugar() if err := s.configurationPropertyMapper(); err != nil { return err @@ -245,6 +244,8 @@ func (s *SouinCaddyMiddleware) Provision(ctx caddy.Context) error { return err } + s.parseStorages(ctx) + bh := middleware.NewHTTPCacheHandler(&s.Configuration) surrogates, ok := up.LoadOrStore(surrogate_key, bh.SurrogateKeyStorer) if ok { @@ -252,43 +253,6 @@ func (s *SouinCaddyMiddleware) Provision(ctx caddy.Context) error { } s.SouinBaseHandler = bh - dc := s.SouinBaseHandler.Configuration.GetDefaultCache() - if dc.GetDistributed() { - for _, currentStorer := range s.SouinBaseHandler.Storers { - if eo, ok := currentStorer.(*storage.EmbeddedOlric); ok { - name := fmt.Sprintf("0.0.0.0:%d", config.DefaultPort) - if dc.GetOlric().Configuration != nil { - oc := dc.GetOlric().Configuration.(*config.Config) - name = fmt.Sprintf("%s:%d", oc.BindAddr, oc.BindPort) - } else if dc.GetOlric().Path != "" { - name = dc.GetOlric().Path - } - - key := "Embedded-" + name - v, _ := up.LoadOrStore(stored_providers_key, newStorageProvider()) - v.(*storage_providers).Add(key) - - if eo.GetDM() == nil { - v, l, e := up.LoadOrNew(key, func() (caddy.Destructor, error) { - s.logger.Sugar().Debug("Create a new olric instance.") - eo, err := storage.EmbeddedOlricConnectionFactory(&s.Configuration) - if eo != nil { - return eo.(*storage.EmbeddedOlric), err - } - return nil, err - }) - - if l && e == nil { - s.SouinBaseHandler.Storers = append(s.SouinBaseHandler.Storers, v.(types.Storer)) - } - } else { - s.logger.Sugar().Debug("Store the olric instance.") - _, _ = up.LoadOrStore(key, s.SouinBaseHandler.SurrogateKeyStorer) - } - } - } - } - if len(app.Storers) == 0 { app.Storers = s.SouinBaseHandler.Storers } diff --git a/httpcache_test.go b/httpcache_test.go index 2b8e29f..c5eed1f 100644 --- a/httpcache_test.go +++ b/httpcache_test.go @@ -34,13 +34,13 @@ func TestMinimal(t *testing.T) { } resp2, _ := tester.AssertGetResponse(`http://localhost:9080/cache-default`, 200, "Hello, default!") - if resp2.Header.Get("Cache-Status") != "Souin; hit; ttl=119; key=GET-http-localhost:9080-/cache-default" { + if resp2.Header.Get("Cache-Status") != "Souin; hit; ttl=119; key=GET-http-localhost:9080-/cache-default; detail=DEFAULT" { t.Errorf("unexpected Cache-Status header %v", resp2.Header.Get("Cache-Status")) } time.Sleep(2 * time.Second) resp3, _ := tester.AssertGetResponse(`http://localhost:9080/cache-default`, 200, "Hello, default!") - if resp3.Header.Get("Cache-Status") != "Souin; hit; ttl=117; key=GET-http-localhost:9080-/cache-default" { + if resp3.Header.Get("Cache-Status") != "Souin; hit; ttl=117; key=GET-http-localhost:9080-/cache-default; detail=DEFAULT" { t.Errorf("unexpected Cache-Status header %v", resp3.Header.Get("Cache-Status")) } } @@ -71,7 +71,7 @@ func TestHead(t *testing.T) { } resp2, _ := tester.AssertResponse(headReq, 200, "") - if resp2.Header.Get("Cache-Status") != "Souin; hit; ttl=119; key=HEAD-http-localhost:9080-/cache-head" { + if resp2.Header.Get("Cache-Status") != "Souin; hit; ttl=119; key=HEAD-http-localhost:9080-/cache-head; detail=DEFAULT" { t.Errorf("unexpected Cache-Status header %v", resp2.Header) } if resp2.Header.Get("Content-Length") != "12" { @@ -132,13 +132,13 @@ func TestMaxAge(t *testing.T) { } resp2, _ := tester.AssertGetResponse(`http://localhost:9080/cache-max-age`, 200, "Hello, max-age!") - if resp2.Header.Get("Cache-Status") != "Souin; hit; ttl=59; key=GET-http-localhost:9080-/cache-max-age" { + if resp2.Header.Get("Cache-Status") != "Souin; hit; ttl=59; key=GET-http-localhost:9080-/cache-max-age; detail=DEFAULT" { t.Errorf("unexpected Cache-Status header %v", resp2.Header.Get("Cache-Status")) } time.Sleep(2 * time.Second) resp3, _ := tester.AssertGetResponse(`http://localhost:9080/cache-max-age`, 200, "Hello, max-age!") - if resp3.Header.Get("Cache-Status") != "Souin; hit; ttl=57; key=GET-http-localhost:9080-/cache-max-age" { + if resp3.Header.Get("Cache-Status") != "Souin; hit; ttl=57; key=GET-http-localhost:9080-/cache-max-age; detail=DEFAULT" { t.Errorf("unexpected Cache-Status header %v", resp3.Header.Get("Cache-Status")) } } @@ -170,7 +170,7 @@ func TestMaxStale(t *testing.T) { } resp2, _ := tester.AssertGetResponse(maxStaleURL, 200, "Hello, max-stale!") - if resp2.Header.Get("Cache-Status") != "Souin; hit; ttl=2; key=GET-http-localhost:9080-/cache-max-stale" { + if resp2.Header.Get("Cache-Status") != "Souin; hit; ttl=2; key=GET-http-localhost:9080-/cache-max-stale; detail=DEFAULT" { t.Errorf("unexpected Cache-Status header %v", resp2.Header.Get("Cache-Status")) } @@ -178,7 +178,7 @@ func TestMaxStale(t *testing.T) { reqMaxStale, _ := http.NewRequest(http.MethodGet, maxStaleURL, nil) reqMaxStale.Header = http.Header{"Cache-Control": []string{"max-stale=3"}} resp3, _ := tester.AssertResponse(reqMaxStale, 200, "Hello, max-stale!") - if resp3.Header.Get("Cache-Status") != "Souin; hit; ttl=-1; key=GET-http-localhost:9080-/cache-max-stale; fwd=stale" { + if resp3.Header.Get("Cache-Status") != "Souin; hit; ttl=-1; key=GET-http-localhost:9080-/cache-max-stale; detail=DEFAULT; fwd=stale" { t.Errorf("unexpected Cache-Status header %v", resp3.Header.Get("Cache-Status")) } @@ -214,7 +214,7 @@ func TestSMaxAge(t *testing.T) { } resp2, _ := tester.AssertGetResponse(`http://localhost:9080/cache-s-maxage`, 200, "Hello, s-maxage!") - if resp2.Header.Get("Cache-Status") != "Souin; hit; ttl=4; key=GET-http-localhost:9080-/cache-s-maxage" { + if resp2.Header.Get("Cache-Status") != "Souin; hit; ttl=4; key=GET-http-localhost:9080-/cache-s-maxage; detail=DEFAULT" { t.Errorf("unexpected Cache-Status header with %v", resp2.Header.Get("Cache-Status")) } } @@ -401,7 +401,7 @@ func TestMaxBodyByte(t *testing.T) { t.Errorf("unexpected Age header %v", respStored1.Header.Get("Age")) } - if respStored2.Header.Get("Cache-Status") != "Souin; hit; ttl=4; key=GET-http-localhost:9080-/max-body-bytes-stored" { + if respStored2.Header.Get("Cache-Status") != "Souin; hit; ttl=4; key=GET-http-localhost:9080-/max-body-bytes-stored; detail=DEFAULT" { t.Errorf("unexpected Cache-Status header value %v", respStored2.Header.Get("Cache-Status")) } if respStored2.Header.Get("Age") == "" { @@ -479,7 +479,7 @@ func TestAuthenticatedRoute(t *testing.T) { t.Errorf("unexpected Cache-Status header %v", respAuthBypassAlice1.Header.Get("Cache-Status")) } respAuthBypassAlice2, _ := tester.AssertResponse(getRequestFor("/auth-bypass", "Alice"), 200, "Hello, auth bypass Bearer Alice!") - if respAuthBypassAlice2.Header.Get("Cache-Status") != "Souin; hit; ttl=4; key=GET-http-localhost:9080-/auth-bypass-Bearer Alice-text/plain" { + if respAuthBypassAlice2.Header.Get("Cache-Status") != "Souin; hit; ttl=4; key=GET-http-localhost:9080-/auth-bypass-Bearer Alice-text/plain; detail=DEFAULT" { t.Errorf("unexpected Cache-Status header %v", respAuthBypassAlice2.Header.Get("Cache-Status")) } @@ -488,7 +488,7 @@ func TestAuthenticatedRoute(t *testing.T) { t.Errorf("unexpected Cache-Status header %v", respAuthBypassBob1.Header.Get("Cache-Status")) } respAuthBypassBob2, _ := tester.AssertResponse(getRequestFor("/auth-bypass", "Bob"), 200, "Hello, auth bypass Bearer Bob!") - if respAuthBypassBob2.Header.Get("Cache-Status") != "Souin; hit; ttl=4; key=GET-http-localhost:9080-/auth-bypass-Bearer Bob-text/plain" { + if respAuthBypassBob2.Header.Get("Cache-Status") != "Souin; hit; ttl=4; key=GET-http-localhost:9080-/auth-bypass-Bearer Bob-text/plain; detail=DEFAULT" { t.Errorf("unexpected Cache-Status header %v", respAuthBypassBob2.Header.Get("Cache-Status")) } @@ -497,7 +497,7 @@ func TestAuthenticatedRoute(t *testing.T) { t.Errorf("unexpected Cache-Status header %v", respAuthVaryBypassAlice1.Header.Get("Cache-Status")) } respAuthVaryBypassAlice2, _ := tester.AssertResponse(getRequestFor("/auth-bypass-vary", "Alice"), 200, "Hello, auth vary bypass Bearer Alice!") - if respAuthVaryBypassAlice2.Header.Get("Cache-Status") != "Souin; hit; ttl=4; key=GET-http-localhost:9080-/auth-bypass-vary-Bearer Alice-text/plain" { + if respAuthVaryBypassAlice2.Header.Get("Cache-Status") != "Souin; hit; ttl=4; key=GET-http-localhost:9080-/auth-bypass-vary-Bearer Alice-text/plain; detail=DEFAULT" { t.Errorf("unexpected Cache-Status header %v", respAuthVaryBypassAlice2.Header.Get("Cache-Status")) } } @@ -536,10 +536,10 @@ func TestMustRevalidate(t *testing.T) { } }`, "caddyfile") - errorHandler := testErrorHandler{} - go func(teh *testErrorHandler) { - _ = http.ListenAndServe(":9081", teh) - }(&errorHandler) + go func() { + errorHandler := testErrorHandler{} + _ = http.ListenAndServe(":9081", &errorHandler) + }() time.Sleep(time.Second) resp1, _ := tester.AssertGetResponse(`http://localhost:9080/cache-default`, http.StatusOK, "Hello must-revalidate!") resp2, _ := tester.AssertGetResponse(`http://localhost:9080/cache-default`, http.StatusOK, "Hello must-revalidate!") @@ -561,7 +561,7 @@ func TestMustRevalidate(t *testing.T) { if resp2.Header.Get("Cache-Control") != "must-revalidate" { t.Errorf("unexpected resp2 Cache-Control header %v", resp2.Header.Get("Cache-Control")) } - if resp2.Header.Get("Cache-Status") != "Souin; hit; ttl=4; key=GET-http-localhost:9080-/cache-default" { + if resp2.Header.Get("Cache-Status") != "Souin; hit; ttl=4; key=GET-http-localhost:9080-/cache-default; detail=DEFAULT" { t.Errorf("unexpected resp2 Cache-Status header %v", resp2.Header.Get("Cache-Status")) } if resp2.Header.Get("Age") != "1" { @@ -571,7 +571,7 @@ func TestMustRevalidate(t *testing.T) { if resp3.Header.Get("Cache-Control") != "must-revalidate" { t.Errorf("unexpected resp3 Cache-Control header %v", resp3.Header.Get("Cache-Control")) } - if resp3.Header.Get("Cache-Status") != "Souin; hit; ttl=-2; key=GET-http-localhost:9080-/cache-default; fwd=stale; fwd-status=500" { + if resp3.Header.Get("Cache-Status") != "Souin; hit; ttl=-2; key=GET-http-localhost:9080-/cache-default; detail=DEFAULT; fwd=stale; fwd-status=500" { t.Errorf("unexpected resp3 Cache-Status header %v", resp3.Header.Get("Cache-Status")) } if resp3.Header.Get("Age") != "7" { @@ -635,10 +635,10 @@ func Test_ETags(t *testing.T) { } }`, "caddyfile") - etagsHandler := testETagsHandler{} - go func(eh *testETagsHandler) { - _ = http.ListenAndServe(":9082", eh) - }(&etagsHandler) + go func() { + etagsHandler := testETagsHandler{} + _ = http.ListenAndServe(":9082", &etagsHandler) + }() _, _ = tester.AssertGetResponse(`http://localhost:9080/etags`, http.StatusOK, "Hello etag!") staleReq, _ := http.NewRequest(http.MethodGet, "http://localhost:9080/etags", nil) staleReq.Header = http.Header{"If-None-Match": []string{etagValue}} @@ -696,7 +696,7 @@ func TestHugeMaxAgeHandler(t *testing.T) { if resp2.Header.Get("Age") != "1" { t.Error("Age header should be present") } - if resp2.Header.Get("Cache-Status") != "Souin; hit; ttl=599; key=GET-http-localhost:9080-/huge-max-age" { + if resp2.Header.Get("Cache-Status") != "Souin; hit; ttl=599; key=GET-http-localhost:9080-/huge-max-age; detail=DEFAULT" { t.Error("Cache-Status header should be present") } @@ -705,7 +705,7 @@ func TestHugeMaxAgeHandler(t *testing.T) { if resp3.Header.Get("Age") != "3" { t.Error("Age header should be present") } - if resp3.Header.Get("Cache-Status") != "Souin; hit; ttl=597; key=GET-http-localhost:9080-/huge-max-age" { + if resp3.Header.Get("Cache-Status") != "Souin; hit; ttl=597; key=GET-http-localhost:9080-/huge-max-age; detail=DEFAULT" { t.Error("Cache-Status header should be present") } } @@ -810,7 +810,9 @@ func TestVaryHandler(t *testing.T) { t.Error("The object is not type of *http.Response") } - if rs.Header.Get("Cache-Status") != fmt.Sprintf("Souin; hit; ttl=%d; key=GET-http-localhost:9080-/vary-multiple", ttl) || rs.Header.Get("Age") != fmt.Sprint(120-ttl) { + nextTTL := ttl - 1 + if (rs.Header.Get("Cache-Status") != fmt.Sprintf("Souin; hit; ttl=%d; key=GET-http-localhost:9080-/vary-multiple; detail=DEFAULT", ttl) || rs.Header.Get("Age") != fmt.Sprint(120-ttl)) && + (rs.Header.Get("Cache-Status") != fmt.Sprintf("Souin; hit; ttl=%d; key=GET-http-localhost:9080-/vary-multiple; detail=DEFAULT", nextTTL) || rs.Header.Get("Age") != fmt.Sprint(120-nextTTL)) { t.Errorf("The response doesn't match the expected header or age: %s => %s", rs.Header.Get("Cache-Status"), rs.Header.Get("Age")) } } @@ -952,15 +954,17 @@ func TestCacheableStatusCode(t *testing.T) { resp1, _ = tester.AssertGetResponse("http://localhost:9080"+path, expectedStatusCode, "") cacheStatus = "Souin; " + detail := "" if expectedCached { if resp1.Header.Get("Age") != "1" { t.Errorf("unexpected Age header %v", resp1.Header.Get("Age")) } cacheStatus += "hit; ttl=9; " + detail = "; detail=DEFAULT" } else { cacheStatus += "fwd=uri-miss; detail=UPSTREAM-ERROR-OR-EMPTY-RESPONSE; " } - cacheStatus += "key=GET-http-localhost:9080-" + path + cacheStatus += "key=GET-http-localhost:9080-" + path + detail if resp1.Header.Get("Cache-Status") != cacheStatus { t.Errorf("unexpected second Cache-Status header %v", resp1.Header.Get("Cache-Status")) @@ -972,3 +976,113 @@ func TestCacheableStatusCode(t *testing.T) { cacheChecker(caddyTester, "/cache-301", 301, true) cacheChecker(caddyTester, "/cache-405", 405, true) } + +func TestExpires(t *testing.T) { + expiresValue := time.Now().Add(time.Hour * 24) + caddyTester := caddytest.NewTester(t) + caddyTester.InitServer(fmt.Sprintf(` + { + admin localhost:2999 + http_port 9080 + https_port 9443 + cache { + ttl 10s + } + } + localhost:9080 { + route /expires-only { + cache + header Expires "%[1]s" + respond "Hello, expires-only!" + } + route /expires-with-max-age { + cache + header Expires "%[1]s" + header Cache-Control "max-age=60" + respond "Hello, expires-with-max-age!" + } + route /expires-with-s-maxage { + cache + header Expires "%[1]s" + header Cache-Control "s-maxage=5" + respond "Hello, expires-with-s-maxage!" + } + }`, expiresValue.Format(time.RFC1123)), "caddyfile") + + cacheChecker := func(tester *caddytest.Tester, path string, expectedBody string, expectedDuration int) { + resp1, _ := tester.AssertGetResponse("http://localhost:9080"+path, 200, expectedBody) + if resp1.Header.Get("Age") != "" { + t.Errorf("unexpected Age header %v", resp1.Header.Get("Age")) + } + + if resp1.Header.Get("Cache-Status") != "Souin; fwd=uri-miss; stored; key=GET-http-localhost:9080-"+path { + t.Errorf("unexpected first Cache-Status header %v", resp1.Header.Get("Cache-Status")) + } + + resp1, _ = tester.AssertGetResponse("http://localhost:9080"+path, 200, expectedBody) + + if resp1.Header.Get("Age") != "1" { + t.Errorf("unexpected Age header %v", resp1.Header.Get("Age")) + } + + if resp1.Header.Get("Cache-Status") != fmt.Sprintf("Souin; hit; ttl=%d; key=GET-http-localhost:9080-%s; detail=DEFAULT", expectedDuration, path) { + t.Errorf( + "unexpected second Cache-Status header %v, expected %s", + resp1.Header.Get("Cache-Status"), + fmt.Sprintf("Souin; hit; ttl=%d; key=GET-http-localhost:9080-%s; detail=DEFAULT", expectedDuration, path), + ) + } + } + + cacheChecker(caddyTester, "/expires-only", "Hello, expires-only!", int(time.Until(expiresValue).Seconds())-1) + cacheChecker(caddyTester, "/expires-with-max-age", "Hello, expires-with-max-age!", 59) + cacheChecker(caddyTester, "/expires-with-s-maxage", "Hello, expires-with-s-maxage!", 4) +} + +func TestComplexQuery(t *testing.T) { + caddyTester := caddytest.NewTester(t) + caddyTester.InitServer(` + { + admin localhost:2999 + http_port 9080 + https_port 9443 + cache { + ttl 10s + } + } + localhost:9080 { + route /complex-query { + cache + respond "Hello, {query}!" + } + }`, "caddyfile") + + cacheChecker := func(tester *caddytest.Tester, query string, expectedDuration int) { + body := fmt.Sprintf("Hello, %s!", query) + resp1, _ := tester.AssertGetResponse("http://localhost:9080/complex-query?"+query, 200, body) + if resp1.Header.Get("Age") != "" { + t.Errorf("unexpected Age header %v", resp1.Header.Get("Age")) + } + + if resp1.Header.Get("Cache-Status") != "Souin; fwd=uri-miss; stored; key=GET-http-localhost:9080-/complex-query?"+query { + t.Errorf("unexpected first Cache-Status header %v", resp1.Header.Get("Cache-Status")) + } + + resp1, _ = tester.AssertGetResponse("http://localhost:9080/complex-query?"+query, 200, body) + + if resp1.Header.Get("Age") != "1" { + t.Errorf("unexpected Age header %v", resp1.Header.Get("Age")) + } + + if resp1.Header.Get("Cache-Status") != fmt.Sprintf("Souin; hit; ttl=%d; key=GET-http-localhost:9080-/complex-query?%s; detail=DEFAULT", expectedDuration, query) { + t.Errorf( + "unexpected second Cache-Status header %v, expected %s", + resp1.Header.Get("Cache-Status"), + fmt.Sprintf("Souin; hit; ttl=%d; key=GET-http-localhost:9080-/complex-query?%s; detail=DEFAULT", expectedDuration, query), + ) + } + } + + cacheChecker(caddyTester, "fields[]=id&pagination=true", 9) + cacheChecker(caddyTester, "fields[]=id&pagination=false", 9) +}