mirror of
https://github.com/alibaba/higress.git
synced 2026-03-04 08:30:48 +08:00
90 lines
2.4 KiB
Go
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
|
|
}
|