@@ -26,6 +26,7 @@ func (e *missingKeyError) Error() string {
2626
2727var genericPlaceholder , _ = regexp .Compile (`(?mU)<(.*)>` )
2828var specificPathPlaceholder , _ = regexp .Compile (`(?mU)<path:([^#]+)#([^#]+)(?:#([^#]+))?>` )
29+ var specificPathUrlEncodedPlaceholder , _ = regexp .Compile (`(?mU)%3Cpath%3A(.+)%23(.+)(?:%23(.+))?%3E` )
2930var indivPlaceholderSyntax , _ = regexp .Compile (`(?mU)path:(?P<path>[^#]+?)#(?P<key>[^#]+?)(?:#(?P<version>.+?))??` )
3031
3132// replaceInner recurses through the given map and replaces the placeholders by calling `replacerFunc`
@@ -107,12 +108,25 @@ func genericReplacement(key, value string, resource Resource) (_ interface{}, er
107108 var nonStringReplacement interface {}
108109 var placeholderRegex = specificPathPlaceholder
109110
110- decoded , decodeError := url .QueryUnescape (value )
111- if decodeError == nil && decoded != value && placeholderRegex .Match ([]byte (decoded )) {
112- res , err := genericReplacement (key , string (decoded ), resource )
111+ decodedValue := specificPathUrlEncodedPlaceholder .ReplaceAllFunc ([]byte (value ), func (match []byte ) []byte {
112+ decoded , decErr := url .QueryUnescape (string (match ))
113+ if decErr != nil || ! placeholderRegex .Match ([]byte (decoded )) {
114+ err = append (err , decErr )
115+ return match
116+ }
117+
118+ repl , replErr := genericReplacement (key , decoded , resource )
119+ if replErr != nil {
120+ err = append (err , replErr ... )
121+ return match
122+ }
123+
124+ return []byte (url .QueryEscape (stringify (repl )))
125+ })
113126
114- utils .VerboseToStdErr ("key %s had URL encoded placeholder value, URL encoding value %s to fit" , key , value )
115- return url .QueryEscape (stringify (res )), err
127+ if string (decodedValue ) != value {
128+ utils .VerboseToStdErr ("key %s had value with URL encoded placeholder" , key )
129+ value = string (decodedValue )
116130 }
117131
118132 // If the Vault path annotation is present, there may be placeholders with/without an explicit path
0 commit comments