@@ -26,25 +26,77 @@ const (
26
26
None AuthType = "None"
27
27
)
28
28
29
+ func parseRawQuery (raw string ) map [string ][]string {
30
+ result := make (map [string ][]string )
31
+ pairs := strings .SplitSeq (raw , "&" )
32
+
33
+ for pair := range pairs {
34
+ if pair == "" {
35
+ continue
36
+ }
37
+
38
+ parts := strings .SplitN (pair , "=" , 2 )
39
+
40
+ key := parts [0 ]
41
+ val := ""
42
+
43
+ if len (parts ) == 2 {
44
+ val = parts [1 ]
45
+ }
46
+
47
+ result [key ] = append (result [key ], val )
48
+ }
49
+
50
+ return result
51
+ }
52
+
53
+ func tryParseInt (str string ) (int , bool ) {
54
+ isInt , err := regexp .MatchString (`^\d+$` , str )
55
+
56
+ if err != nil {
57
+ log .Error ("Encountered Error while Parsing Int" , err .Error ())
58
+ }
59
+
60
+ if isInt && err == nil {
61
+ intValue , err := strconv .Atoi (str )
62
+
63
+ if err == nil {
64
+ return intValue , true
65
+ }
66
+ }
67
+
68
+ return 0 , false
69
+ }
70
+
29
71
func parseTypedQuery (values []string ) interface {} {
30
72
var result interface {}
31
73
32
74
raw := values [0 ]
33
75
34
- intValue , err := strconv .Atoi (raw )
76
+ intValue , isInt := tryParseInt (raw )
77
+
78
+ if strings .Contains (raw , "," ) || (strings .Contains (raw , "[" ) && strings .Contains (raw , "]" )) {
79
+ if strings .Contains (raw , "[" ) && strings .Contains (raw , "]" ) {
80
+ escapedStr := strings .ReplaceAll (raw , "[" , "" )
81
+ escapedStr = strings .ReplaceAll (escapedStr , "]" , "" )
82
+ raw = escapedStr
83
+ }
35
84
36
- if strings .Contains (raw , "," ) {
37
85
parts := strings .Split (raw , "," )
86
+
38
87
var list []interface {}
88
+
39
89
for _ , part := range parts {
40
- if intVal , err := strconv .Atoi (part ); err == nil {
41
- list = append (list , intVal )
90
+ _intValue , _isInt := tryParseInt (part )
91
+
92
+ if _isInt {
93
+ list = append (list , _intValue )
42
94
} else {
43
95
list = append (list , part )
44
96
}
45
97
}
46
98
result = list
47
- } else if err == nil {
99
+ } else if isInt {
48
100
result = intValue
49
101
} else {
50
102
result = raw
@@ -242,7 +294,7 @@ func TemplatingMiddleware(next http.Handler, VARIABLES map[string]interface{}) h
242
294
243
295
modifiedQuery := req .URL .Query ()
244
296
245
- queryData , _ := url . ParseQuery (query )
297
+ queryData := parseRawQuery (query )
246
298
247
299
for key , value := range queryData {
248
300
keyWithoutPrefix , found := strings .CutPrefix (key , "@" )
0 commit comments