in plugins/wasm-go/extensions/transformer/main.go [1270:1382]
func newKvtGroup(rules []TransformRule, typ string) (g []kvtOperation, isChange bool, withMapKvt bool, err error) {
g = []kvtOperation{}
for _, r := range rules {
var prams []Param
switch typ {
case "headers":
prams = r.headers
case "querys":
prams = r.querys
case "body":
prams = r.body
}
var kvtOp kvtOperation
switch r.operate {
case "remove":
kvtOp.kvtOpType = RemoveK
case "rename":
kvtOp.kvtOpType = RenameK
case "map":
kvtOp.kvtOpType = MapK
case "replace":
kvtOp.kvtOpType = ReplaceK
case "dedupe":
kvtOp.kvtOpType = DedupeK
case "add":
kvtOp.kvtOpType = AddK
case "append":
kvtOp.kvtOpType = AppendK
default:
return nil, false, false, errors.Wrap(err, "invalid operation type")
}
for _, p := range prams {
switch r.operate {
case "remove":
key := p.removeParam.key
if typ == "headers" {
key = strings.ToLower(key)
}
kvtOp.removeKvtGroup = append(kvtOp.removeKvtGroup, removeKvt{key})
case "rename":
if typ == "headers" {
p.renameParam.oldKey = strings.ToLower(p.renameParam.oldKey)
p.renameParam.newKey = strings.ToLower(p.renameParam.newKey)
}
kvtOp.renameKvtGroup = append(kvtOp.renameKvtGroup, renameKvt{p.renameParam.oldKey, p.renameParam.newKey, p.valueType})
case "map":
if typ == "headers" {
p.mapParam.toKey = strings.ToLower(p.mapParam.toKey)
}
kvtOp.mapSource = r.mapSource
if kvtOp.mapSource == "self" {
kvtOp.mapSource = typ
r.mapSource = typ
}
if kvtOp.mapSource == "headers" {
p.mapParam.fromKey = strings.ToLower(p.mapParam.fromKey)
}
kvtOp.mapKvtGroup = append(kvtOp.mapKvtGroup, mapKvt{p.mapParam.fromKey, p.mapParam.toKey})
case "dedupe":
if typ == "headers" {
p.dedupeParam.key = strings.ToLower(p.dedupeParam.key)
}
kvtOp.dedupeKvtGroup = append(kvtOp.dedupeKvtGroup, dedupeKvt{p.dedupeParam.key, p.dedupeParam.strategy})
case "replace":
if typ == "headers" {
p.replaceParam.key = strings.ToLower(p.replaceParam.key)
}
var rg *reg
if p.hostPattern != "" || p.pathPattern != "" {
rg, err = newReg(p.hostPattern, p.pathPattern)
if err != nil {
return nil, false, false, errors.Wrap(err, "failed to new reg")
}
}
kvtOp.replaceKvtGroup = append(kvtOp.replaceKvtGroup, replaceKvt{p.replaceParam.key, p.replaceParam.newValue, p.valueType, rg})
case "add":
if typ == "headers" {
p.addParam.key = strings.ToLower(p.addParam.key)
}
var rg *reg
if p.hostPattern != "" || p.pathPattern != "" {
rg, err = newReg(p.hostPattern, p.pathPattern)
if err != nil {
return nil, false, false, errors.Wrap(err, "failed to new reg")
}
}
kvtOp.addKvtGroup = append(kvtOp.addKvtGroup, addKvt{p.addParam.key, p.addParam.value, p.valueType, rg})
case "append":
if typ == "headers" {
p.appendParam.key = strings.ToLower(p.appendParam.key)
}
var rg *reg
if p.hostPattern != "" || p.pathPattern != "" {
rg, err = newReg(p.hostPattern, p.pathPattern)
if err != nil {
return nil, false, false, errors.Wrap(err, "failed to new reg")
}
}
kvtOp.appendKvtGroup = append(kvtOp.appendKvtGroup, appendKvt{p.appendParam.key, p.appendParam.appendValue, p.valueType, rg})
}
}
isChange = isChange || len(kvtOp.removeKvtGroup) != 0 ||
len(kvtOp.renameKvtGroup) != 0 || len(kvtOp.replaceKvtGroup) != 0 ||
len(kvtOp.addKvtGroup) != 0 || len(kvtOp.appendKvtGroup) != 0 ||
len(kvtOp.mapKvtGroup) != 0 || len(kvtOp.dedupeKvtGroup) != 0
withMapKvt = withMapKvt || len(kvtOp.mapKvtGroup) != 0
g = append(g, kvtOp)
}
return g, isChange, withMapKvt, nil
}