1
0
Fork 0
golang-github-nicholas-fedo.../pkg/format/format_query.go
Daniel Baumann c0c4addb85
Adding upstream version 0.8.9.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-22 10:16:14 +02:00

95 lines
2.5 KiB
Go

package format
import (
"net/url"
"strings"
"github.com/nicholas-fedor/shoutrrr/pkg/types"
)
// BuildQuery converts the fields of a config object to a delimited query string.
func BuildQuery(cqr types.ConfigQueryResolver) string {
return BuildQueryWithCustomFields(cqr, url.Values{}).Encode()
}
// escaping any custom fields that share the same key as a config prop using a "__" prefix.
func BuildQueryWithCustomFields(cqr types.ConfigQueryResolver, query url.Values) url.Values {
fields := cqr.QueryFields()
skipEscape := len(query) < 1
pkr, isPkr := cqr.(*PropKeyResolver)
for _, key := range fields {
if !skipEscape {
// Escape any webhook query keys using the same name as service props
escValues := query[key]
if len(escValues) > 0 {
query.Del(key)
query[EscapeKey(key)] = escValues
}
}
if isPkr && !pkr.KeyIsPrimary(key) {
continue
}
value, err := cqr.Get(key)
if err != nil || isPkr && pkr.IsDefault(key, value) {
continue
}
query.Set(key, value)
}
return query
}
// SetConfigPropsFromQuery iterates over all the config prop keys and sets the config prop to the corresponding
// query value based on the key.
// SetConfigPropsFromQuery returns a non-nil url.Values query with all config prop keys removed, even if any of
// them could not be used to set a config field, and with any escaped keys unescaped.
// The error returned is the first error that occurred, subsequent errors are just discarded.
func SetConfigPropsFromQuery(cqr types.ConfigQueryResolver, query url.Values) (url.Values, error) {
var firstError error
if query == nil {
return url.Values{}, nil
}
for _, key := range cqr.QueryFields() {
// Retrieve the service-related prop value
values := query[key]
if len(values) > 0 {
if err := cqr.Set(key, values[0]); err != nil && firstError == nil {
firstError = err
}
}
// Remove it from the query Values
query.Del(key)
// If an escaped version of the key exist, unescape it
escKey := EscapeKey(key)
escValues := query[escKey]
if len(escValues) > 0 {
query.Del(escKey)
query[key] = escValues
}
}
return query, firstError
}
// EscapeKey adds the KeyPrefix to custom URL query keys that conflict with service config prop keys.
func EscapeKey(key string) string {
return KeyPrefix + key
}
// UnescapeKey removes the KeyPrefix from custom URL query keys that conflict with service config prop keys.
func UnescapeKey(key string) string {
return strings.TrimPrefix(key, KeyPrefix)
}
// consisting of two underscore characters ("__").
const KeyPrefix = "__"