66 lines
1.6 KiB
Go
66 lines
1.6 KiB
Go
package urlrewrite
|
|
|
|
import "encoding/json"
|
|
|
|
func rewriteStringValue(input, oldPrefix, newPrefix string) (string, bool) {
|
|
if oldPrefix == "" || newPrefix == "" {
|
|
return input, false
|
|
}
|
|
if len(input) >= len(oldPrefix) && input[:len(oldPrefix)] == oldPrefix {
|
|
return newPrefix + input[len(oldPrefix):], true
|
|
}
|
|
return input, false
|
|
}
|
|
|
|
func rewriteJSONContent(input, oldPrefix, newPrefix string) (string, bool, error) {
|
|
var data any
|
|
if err := json.Unmarshal([]byte(input), &data); err != nil {
|
|
rewritten, changed := rewriteStringValue(input, oldPrefix, newPrefix)
|
|
if changed {
|
|
return rewritten, true, nil
|
|
}
|
|
return "", false, err
|
|
}
|
|
rewritten, changed := rewriteAny(data, oldPrefix, newPrefix)
|
|
if !changed {
|
|
return input, false, nil
|
|
}
|
|
out, err := json.Marshal(rewritten)
|
|
if err != nil {
|
|
return "", false, err
|
|
}
|
|
return string(out), true, nil
|
|
}
|
|
|
|
func rewriteAny(value any, oldPrefix, newPrefix string) (any, bool) {
|
|
switch v := value.(type) {
|
|
case map[string]any:
|
|
changed := false
|
|
for key, child := range v {
|
|
newChild, childChanged := rewriteAny(child, oldPrefix, newPrefix)
|
|
if childChanged {
|
|
v[key] = newChild
|
|
changed = true
|
|
}
|
|
}
|
|
return v, changed
|
|
case []any:
|
|
changed := false
|
|
for i, child := range v {
|
|
newChild, childChanged := rewriteAny(child, oldPrefix, newPrefix)
|
|
if childChanged {
|
|
v[i] = newChild
|
|
changed = true
|
|
}
|
|
}
|
|
return v, changed
|
|
case string:
|
|
if rewritten, changed, err := rewriteJSONContent(v, oldPrefix, newPrefix); err == nil && changed {
|
|
return rewritten, true
|
|
}
|
|
return rewriteStringValue(v, oldPrefix, newPrefix)
|
|
default:
|
|
return value, false
|
|
}
|
|
}
|