@@ -26,25 +26,77 @@ const (
2626 None AuthType = "None"
2727)
2828
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+
2971func parseTypedQuery (values []string ) interface {} {
3072 var result interface {}
3173
3274 raw := values [0 ]
3375
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+ }
3584
36- if strings .Contains (raw , "," ) {
3785 parts := strings .Split (raw , "," )
86+
3887 var list []interface {}
88+
3989 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 )
4294 } else {
4395 list = append (list , part )
4496 }
4597 }
4698 result = list
47- } else if err == nil {
99+ } else if isInt {
48100 result = intValue
49101 } else {
50102 result = raw
@@ -242,7 +294,7 @@ func TemplatingMiddleware(next http.Handler, VARIABLES map[string]interface{}) h
242294
243295 modifiedQuery := req .URL .Query ()
244296
245- queryData , _ := url . ParseQuery (query )
297+ queryData := parseRawQuery (query )
246298
247299 for key , value := range queryData {
248300 keyWithoutPrefix , found := strings .CutPrefix (key , "@" )
0 commit comments