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  }