Files
higress/plugins/wasm-go/extensions/response-cache/config/config.go
Jingze 38d50bbdad feat: Add response-cache plugin (#3061)
Co-authored-by: mirror58229 <674958229@qq.com>
2025-12-26 17:22:03 +08:00

90 lines
2.4 KiB
Go

package config
import (
"fmt"
"strconv"
"github.com/alibaba/higress/plugins/wasm-go/extensions/response-cache/cache"
"github.com/higress-group/wasm-go/pkg/log"
"github.com/tidwall/gjson"
)
type PluginConfig struct {
cacheProvider cache.Provider
cacheProviderConfig cache.ProviderConfig
CacheKeyFromHeader string
CacheKeyFromBody string
CacheValueFromBodyType string
CacheValueFromBody string
CacheResponseCode []int32
}
func (c *PluginConfig) FromJson(json gjson.Result) {
c.cacheProviderConfig.FromJson(json.Get("cache"))
c.CacheKeyFromHeader = json.Get("cacheKeyFromHeader").String()
c.CacheKeyFromBody = json.Get("cacheKeyFromBody").String()
c.CacheValueFromBodyType = json.Get("cacheValueFromBodyType").String()
if c.CacheValueFromBodyType == "" {
c.CacheValueFromBodyType = "application/json"
}
c.CacheValueFromBody = json.Get("cacheValueFromBody").String()
cacheResponseCode := json.Get("cacheResponseCode").Array()
c.CacheResponseCode = make([]int32, 0, len(cacheResponseCode))
for _, v := range cacheResponseCode {
responseCode, err := strconv.Atoi(v.String())
if err != nil || responseCode < 100 || responseCode > 999 {
log.Errorf("Skip invalid response_code value: %s", v.String())
return
}
c.CacheResponseCode = append(c.CacheResponseCode, int32(responseCode))
}
if len(c.CacheResponseCode) == 0 {
c.CacheResponseCode = []int32{200}
}
}
func (c *PluginConfig) Validate() error {
// cache cannot be empty
if c.cacheProviderConfig.GetProviderType() == "" {
return fmt.Errorf("cache provider cannot be empty")
}
// if cache provider is configured, validate it
if c.cacheProviderConfig.GetProviderType() != "" {
if err := c.cacheProviderConfig.Validate(); err != nil {
return err
}
}
// cache key cannot be all set
if c.CacheKeyFromHeader != "" && c.CacheKeyFromBody != "" {
return fmt.Errorf("cacheKeyFromHeader and cacheKeyFromBody cannot be all set")
}
return nil
}
func (c *PluginConfig) Complete() error {
var err error
if c.cacheProviderConfig.GetProviderType() != "" {
log.Debugf("cache provider is set to %s", c.cacheProviderConfig.GetProviderType())
c.cacheProvider, err = cache.CreateProvider(c.cacheProviderConfig)
if err != nil {
return err
}
} else {
log.Info("cache provider is not configured")
c.cacheProvider = nil
}
return nil
}
func (c *PluginConfig) GetCacheProvider() cache.Provider {
return c.cacheProvider
}