File: custom_query.go

package info (click to toggle)
golang-github-nicholas-fedor-shoutrrr 0.8.17-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,332 kB
  • sloc: sh: 61; makefile: 5
file content (74 lines) | stat: -rw-r--r-- 1,906 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package generic

import (
	"net/url"
	"strings"
)

// Constants for character values and offsets.
const (
	ExtraPrefixChar      = '$'       // Prefix for extra data in query parameters
	HeaderPrefixChar     = '@'       // Prefix for header values in query parameters
	CaseOffset           = 'a' - 'A' // Offset between lowercase and uppercase letters
	UppercaseA           = 'A'       // ASCII value for uppercase A
	UppercaseZ           = 'Z'       // ASCII value for uppercase Z
	DashChar             = '-'       // Dash character for header formatting
	HeaderCapacityFactor = 2         // Estimated capacity multiplier for header string builder
)

func normalizedHeaderKey(key string) string {
	stringBuilder := strings.Builder{}
	stringBuilder.Grow(len(key) * HeaderCapacityFactor)

	for i, c := range key {
		if UppercaseA <= c && c <= UppercaseZ {
			// Char is uppercase
			if i > 0 && key[i-1] != DashChar {
				// Add missing dash
				stringBuilder.WriteRune(DashChar)
			}
		} else if i == 0 || key[i-1] == DashChar {
			// First char, or previous was dash
			c -= CaseOffset
		}

		stringBuilder.WriteRune(c)
	}

	return stringBuilder.String()
}

func appendCustomQueryValues(
	query url.Values,
	headers map[string]string,
	extraData map[string]string,
) {
	for key, value := range headers {
		query.Set(string(HeaderPrefixChar)+key, value)
	}

	for key, value := range extraData {
		query.Set(string(ExtraPrefixChar)+key, value)
	}
}

func stripCustomQueryValues(query url.Values) (map[string]string, map[string]string) {
	headers := make(map[string]string)
	extraData := make(map[string]string)

	for key, values := range query {
		switch key[0] {
		case HeaderPrefixChar:
			headerKey := normalizedHeaderKey(key[1:])
			headers[headerKey] = values[0]
		case ExtraPrefixChar:
			extraData[key[1:]] = values[0]
		default:
			continue
		}

		delete(query, key)
	}

	return headers, extraData
}