mirror of
https://github.com/alibaba/higress.git
synced 2026-03-17 00:40:48 +08:00
feat: Add response-cache plugin (#3061)
Co-authored-by: mirror58229 <674958229@qq.com>
This commit is contained in:
89
plugins/wasm-go/extensions/response-cache/config/config.go
Normal file
89
plugins/wasm-go/extensions/response-cache/config/config.go
Normal file
@@ -0,0 +1,89 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user