mirror of
https://github.com/alibaba/higress.git
synced 2026-03-07 18:10:54 +08:00
79 lines
2.9 KiB
Go
79 lines
2.9 KiB
Go
package main
|
||
|
||
import (
|
||
"github.com/alibaba/higress/plugins/wasm-go/extensions/frontend-gray/config"
|
||
"github.com/alibaba/higress/plugins/wasm-go/extensions/frontend-gray/util"
|
||
|
||
"github.com/alibaba/higress/plugins/wasm-go/pkg/wrapper"
|
||
"github.com/higress-group/proxy-wasm-go-sdk/proxywasm"
|
||
"github.com/higress-group/proxy-wasm-go-sdk/proxywasm/types"
|
||
"github.com/tidwall/gjson"
|
||
)
|
||
|
||
func main() {
|
||
wrapper.SetCtx(
|
||
"frontend-gray",
|
||
wrapper.ParseConfigBy(parseConfig),
|
||
wrapper.ProcessRequestHeadersBy(onHttpRequestHeaders),
|
||
)
|
||
}
|
||
|
||
func parseConfig(json gjson.Result, grayConfig *config.GrayConfig, log wrapper.Log) error {
|
||
// 解析json 为GrayConfig
|
||
config.JsonToGrayConfig(json, grayConfig)
|
||
return nil
|
||
}
|
||
|
||
// FilterGrayRule 过滤灰度规则
|
||
func FilterGrayRule(grayConfig *config.GrayConfig, grayKeyValue string, log wrapper.Log) *config.GrayDeployments {
|
||
for _, grayDeployment := range grayConfig.GrayDeployments {
|
||
if !grayDeployment.Enabled {
|
||
// 跳过Enabled=false
|
||
continue
|
||
}
|
||
grayRule := util.GetRule(grayConfig.Rules, grayDeployment.Name)
|
||
// 首先:先校验用户名单ID
|
||
if grayRule.GrayKeyValue != nil && len(grayRule.GrayKeyValue) > 0 && grayKeyValue != "" {
|
||
if util.Contains(grayRule.GrayKeyValue, grayKeyValue) {
|
||
log.Infof("x-mse-tag: %s, grayKeyValue: %s", grayDeployment.Version, grayKeyValue)
|
||
return grayDeployment
|
||
}
|
||
}
|
||
// 第二:校验Cookie中的 GrayTagKey
|
||
if grayRule.GrayTagKey != "" && grayRule.GrayTagValue != nil && len(grayRule.GrayTagValue) > 0 {
|
||
cookieStr, _ := proxywasm.GetHttpRequestHeader("cookie")
|
||
grayTagValue := util.GetValueByCookie(cookieStr, grayRule.GrayTagKey)
|
||
if util.Contains(grayRule.GrayTagValue, grayTagValue) {
|
||
log.Infof("x-mse-tag: %s, grayTag: %s=%s", grayDeployment.Version, grayRule.GrayTagKey, grayTagValue)
|
||
return grayDeployment
|
||
}
|
||
}
|
||
}
|
||
log.Infof("x-mse-tag: %s, grayKeyValue: %s", grayConfig.BaseDeployment.Version, grayKeyValue)
|
||
return nil
|
||
}
|
||
|
||
func onHttpRequestHeaders(ctx wrapper.HttpContext, grayConfig config.GrayConfig, log wrapper.Log) types.Action {
|
||
// 优先从cookie中获取,如果拿不到再从header中获取
|
||
cookieStr, _ := proxywasm.GetHttpRequestHeader("cookie")
|
||
grayHeaderKey, _ := proxywasm.GetHttpRequestHeader(grayConfig.GrayKey)
|
||
grayKeyValue := util.GetValueByCookie(cookieStr, grayConfig.GrayKey)
|
||
proxywasm.RemoveHttpRequestHeader("Accept-Encoding")
|
||
// 优先从Cookie中获取,否则从header中获取
|
||
if grayKeyValue == "" {
|
||
grayKeyValue = grayHeaderKey
|
||
}
|
||
// 如果有子key, 尝试从子key中获取值
|
||
if grayConfig.GraySubKey != "" {
|
||
subKeyValue := util.GetBySubKey(grayKeyValue, grayConfig.GraySubKey)
|
||
if subKeyValue != "" {
|
||
grayKeyValue = subKeyValue
|
||
}
|
||
}
|
||
grayDeployment := FilterGrayRule(&grayConfig, grayKeyValue, log)
|
||
if grayDeployment != nil {
|
||
proxywasm.AddHttpRequestHeader("x-mse-tag", grayDeployment.Version)
|
||
}
|
||
return types.ActionContinue
|
||
}
|