github.com/crowdsecurity/crowdsec@v1.6.1/pkg/appsec/query_utils_test.go (about) 1 package appsec 2 3 import ( 4 "net/url" 5 "reflect" 6 "testing" 7 ) 8 9 func TestParseQuery(t *testing.T) { 10 tests := []struct { 11 name string 12 query string 13 expected url.Values 14 }{ 15 { 16 name: "Simple query", 17 query: "foo=bar", 18 expected: url.Values{ 19 "foo": []string{"bar"}, 20 }, 21 }, 22 { 23 name: "Multiple values", 24 query: "foo=bar&foo=baz", 25 expected: url.Values{ 26 "foo": []string{"bar", "baz"}, 27 }, 28 }, 29 { 30 name: "Empty value", 31 query: "foo=", 32 expected: url.Values{ 33 "foo": []string{""}, 34 }, 35 }, 36 { 37 name: "Empty key", 38 query: "=bar", 39 expected: url.Values{ 40 "": []string{"bar"}, 41 }, 42 }, 43 { 44 name: "Empty query", 45 query: "", 46 expected: url.Values{}, 47 }, 48 { 49 name: "Multiple keys", 50 query: "foo=bar&baz=qux", 51 expected: url.Values{ 52 "foo": []string{"bar"}, 53 "baz": []string{"qux"}, 54 }, 55 }, 56 { 57 name: "Multiple keys with empty value", 58 query: "foo=bar&baz=qux&quux=", 59 expected: url.Values{ 60 "foo": []string{"bar"}, 61 "baz": []string{"qux"}, 62 "quux": []string{""}, 63 }, 64 }, 65 { 66 name: "Multiple keys with empty value and empty key", 67 query: "foo=bar&baz=qux&quux=&=quuz", 68 expected: url.Values{ 69 "foo": []string{"bar"}, 70 "baz": []string{"qux"}, 71 "quux": []string{""}, 72 "": []string{"quuz"}, 73 }, 74 }, 75 { 76 name: "Multiple keys with empty value and empty key and multiple values", 77 query: "foo=bar&baz=qux&quux=&=quuz&foo=baz", 78 expected: url.Values{ 79 "foo": []string{"bar", "baz"}, 80 "baz": []string{"qux"}, 81 "quux": []string{""}, 82 "": []string{"quuz"}, 83 }, 84 }, 85 { 86 name: "Multiple keys with empty value and empty key and multiple values and escaped characters", 87 query: "foo=bar&baz=qux&quux=&=quuz&foo=baz&foo=bar%20baz", 88 expected: url.Values{ 89 "foo": []string{"bar", "baz", "bar baz"}, 90 "baz": []string{"qux"}, 91 "quux": []string{""}, 92 "": []string{"quuz"}, 93 }, 94 }, 95 { 96 name: "Multiple keys with empty value and empty key and multiple values and escaped characters and semicolon", 97 query: "foo=bar&baz=qux&quux=&=quuz&foo=baz&foo=bar%20baz&foo=bar%3Bbaz", 98 expected: url.Values{ 99 "foo": []string{"bar", "baz", "bar baz", "bar;baz"}, 100 "baz": []string{"qux"}, 101 "quux": []string{""}, 102 "": []string{"quuz"}, 103 }, 104 }, 105 { 106 name: "Multiple keys with empty value and empty key and multiple values and escaped characters and semicolon and ampersand", 107 query: "foo=bar&baz=qux&quux=&=quuz&foo=baz&foo=bar%20baz&foo=bar%3Bbaz&foo=bar%26baz", 108 expected: url.Values{ 109 "foo": []string{"bar", "baz", "bar baz", "bar;baz", "bar&baz"}, 110 "baz": []string{"qux"}, 111 "quux": []string{""}, 112 "": []string{"quuz"}, 113 }, 114 }, 115 { 116 name: "Multiple keys with empty value and empty key and multiple values and escaped characters and semicolon and ampersand and equals", 117 query: "foo=bar&baz=qux&quux=&=quuz&foo=baz&foo=bar%20baz&foo=bar%3Bbaz&foo=bar%26baz&foo=bar%3Dbaz", 118 expected: url.Values{ 119 "foo": []string{"bar", "baz", "bar baz", "bar;baz", "bar&baz", "bar=baz"}, 120 "baz": []string{"qux"}, 121 "quux": []string{""}, 122 "": []string{"quuz"}, 123 }, 124 }, 125 { 126 name: "Multiple keys with empty value and empty key and multiple values and escaped characters and semicolon and ampersand and equals and question mark", 127 query: "foo=bar&baz=qux&quux=&=quuz&foo=baz&foo=bar%20baz&foo=bar%3Bbaz&foo=bar%26baz&foo=bar%3Dbaz&foo=bar%3Fbaz", 128 expected: url.Values{ 129 "foo": []string{"bar", "baz", "bar baz", "bar;baz", "bar&baz", "bar=baz", "bar?baz"}, 130 "baz": []string{"qux"}, 131 "quux": []string{""}, 132 "": []string{"quuz"}, 133 }, 134 }, 135 { 136 name: "keys with escaped characters", 137 query: "foo=ba;r&baz=qu;;x&quux=x\\&ww&xx=qu?uz&", 138 expected: url.Values{ 139 "foo": []string{"ba;r"}, 140 "baz": []string{"qu;;x"}, 141 "quux": []string{"x\\"}, 142 "ww": []string{""}, 143 "xx": []string{"qu?uz"}, 144 }, 145 }, 146 { 147 name: "hexadecimal characters", 148 query: "foo=bar%20baz", 149 expected: url.Values{ 150 "foo": []string{"bar baz"}, 151 }, 152 }, 153 { 154 name: "hexadecimal characters upper and lower case", 155 query: "foo=Ba%42%42&bar=w%2f%2F", 156 expected: url.Values{ 157 "foo": []string{"BaBB"}, 158 "bar": []string{"w//"}, 159 }, 160 }, 161 { 162 name: "hexadecimal characters with invalid characters", 163 query: "foo=bar%20baz%2", 164 expected: url.Values{ 165 "foo": []string{"bar baz%2"}, 166 }, 167 }, 168 { 169 name: "hexadecimal characters with invalid hex characters", 170 query: "foo=bar%xx", 171 expected: url.Values{ 172 "foo": []string{"bar%xx"}, 173 }, 174 }, 175 { 176 name: "hexadecimal characters with invalid 2nd hex character", 177 query: "foo=bar%2x", 178 expected: url.Values{ 179 "foo": []string{"bar%2x"}, 180 }, 181 }, 182 { 183 name: "url +", 184 query: "foo=bar+x", 185 expected: url.Values{ 186 "foo": []string{"bar x"}, 187 }, 188 }, 189 { 190 name: "url &&", 191 query: "foo=bar&&lol=bur", 192 expected: url.Values{ 193 "foo": []string{"bar"}, 194 "lol": []string{"bur"}, 195 }, 196 }, 197 } 198 199 for _, test := range tests { 200 t.Run(test.name, func(t *testing.T) { 201 res := ParseQuery(test.query) 202 if !reflect.DeepEqual(res, test.expected) { 203 t.Fatalf("unexpected result: %v", res) 204 } 205 }) 206 } 207 }