diff --git a/rules.go b/rules.go index f629c41..b9e4871 100644 --- a/rules.go +++ b/rules.go @@ -3,6 +3,7 @@ package main import ( "encoding/base64" "encoding/hex" + "net/url" "strconv" "strings" @@ -22,6 +23,7 @@ var rules = []Rule{ DecodeLiteral, DecodeBase64, DecodeIntegerBytes, + DecodeURLEscaped, } func DecodeHex(n *Node) *Variant { @@ -173,3 +175,17 @@ func DecodeIntegerBytes(n *Node) *Variant { children: []*Node{N("key", b)}, } } + +func DecodeURLEscaped(n *Node) *Variant { + if n.typ != "key" { + return nil + } + s, err := url.PathUnescape(string(n.val)) + if err != nil || s == string(n.val) { + return nil + } + return &Variant{ + method: "decode url encoded", + children: []*Node{N("key", []byte(s))}, + } +}