github.com/crowdsecurity/crowdsec@v1.6.1/pkg/appsec/request_test.go (about)

     1  package appsec
     2  
     3  import "testing"
     4  
     5  func TestBodyDumper(t *testing.T) {
     6  
     7  	tests := []struct {
     8  		name   string
     9  		req    *ParsedRequest
    10  		expect *ParsedRequest
    11  		filter func(r *ReqDumpFilter) *ReqDumpFilter
    12  	}{
    13  		{
    14  			name: "default filter (cookie+authorization stripped + no body)",
    15  			req: &ParsedRequest{
    16  				Body:    []byte("yo some body"),
    17  				Headers: map[string][]string{"cookie": {"toto"}, "authorization": {"tata"}, "foo": {"bar", "baz"}},
    18  			},
    19  			expect: &ParsedRequest{
    20  				Body:    []byte{},
    21  				Headers: map[string][]string{"foo": {"bar", "baz"}},
    22  			},
    23  			filter: func(r *ReqDumpFilter) *ReqDumpFilter {
    24  				return r
    25  			},
    26  		},
    27  		{
    28  			name: "explicit empty filter",
    29  			req: &ParsedRequest{
    30  				Body:    []byte("yo some body"),
    31  				Headers: map[string][]string{"cookie": {"toto"}, "authorization": {"tata"}, "foo": {"bar", "baz"}},
    32  			},
    33  			expect: &ParsedRequest{
    34  				Body:    []byte("yo some body"),
    35  				Headers: map[string][]string{"cookie": {"toto"}, "authorization": {"tata"}, "foo": {"bar", "baz"}},
    36  			},
    37  			filter: func(r *ReqDumpFilter) *ReqDumpFilter {
    38  				return r.NoFilters()
    39  			},
    40  		},
    41  		{
    42  			name: "filter header",
    43  			req: &ParsedRequest{
    44  				Body:    []byte{},
    45  				Headers: map[string][]string{"test1": {"toto"}, "test2": {"tata"}},
    46  			},
    47  			expect: &ParsedRequest{
    48  				Body:    []byte{},
    49  				Headers: map[string][]string{"test1": {"toto"}},
    50  			},
    51  			filter: func(r *ReqDumpFilter) *ReqDumpFilter {
    52  				return r.WithNoBody().WithHeadersNameFilter("test2")
    53  			},
    54  		},
    55  		{
    56  			name: "filter header content",
    57  			req: &ParsedRequest{
    58  				Body:    []byte{},
    59  				Headers: map[string][]string{"test1": {"toto"}, "test2": {"tata"}},
    60  			},
    61  			expect: &ParsedRequest{
    62  				Body:    []byte{},
    63  				Headers: map[string][]string{"test1": {"toto"}},
    64  			},
    65  			filter: func(r *ReqDumpFilter) *ReqDumpFilter {
    66  				return r.WithHeadersContentFilter("tata")
    67  			},
    68  		},
    69  		{
    70  			name: "with headers",
    71  			req: &ParsedRequest{
    72  				Body:    []byte{},
    73  				Headers: map[string][]string{"cookie1": {"lol"}},
    74  			},
    75  			expect: &ParsedRequest{
    76  				Body:    []byte{},
    77  				Headers: map[string][]string{"cookie1": {"lol"}},
    78  			},
    79  			filter: func(r *ReqDumpFilter) *ReqDumpFilter {
    80  				return r.WithHeaders()
    81  			},
    82  		},
    83  		{
    84  			name: "drop headers",
    85  			req: &ParsedRequest{
    86  				Body:    []byte{},
    87  				Headers: map[string][]string{"toto": {"lol"}},
    88  			},
    89  			expect: &ParsedRequest{
    90  				Body:    []byte{},
    91  				Headers: map[string][]string{},
    92  			},
    93  			filter: func(r *ReqDumpFilter) *ReqDumpFilter {
    94  				return r.WithNoHeaders()
    95  			},
    96  		},
    97  		{
    98  			name: "with body",
    99  			req: &ParsedRequest{
   100  				Body:    []byte("toto"),
   101  				Headers: map[string][]string{"toto": {"lol"}},
   102  			},
   103  			expect: &ParsedRequest{
   104  				Body:    []byte("toto"),
   105  				Headers: map[string][]string{"toto": {"lol"}},
   106  			},
   107  			filter: func(r *ReqDumpFilter) *ReqDumpFilter {
   108  				return r.WithBody()
   109  			},
   110  		},
   111  		{
   112  			name: "with empty args filter",
   113  			req: &ParsedRequest{
   114  				Args: map[string][]string{"toto": {"lol"}},
   115  			},
   116  			expect: &ParsedRequest{
   117  				Args: map[string][]string{"toto": {"lol"}},
   118  			},
   119  			filter: func(r *ReqDumpFilter) *ReqDumpFilter {
   120  				return r.WithEmptyArgsFilters()
   121  			},
   122  		},
   123  		{
   124  			name: "with args name filter",
   125  			req: &ParsedRequest{
   126  				Args: map[string][]string{"toto": {"lol"}, "totolol": {"lol"}},
   127  			},
   128  			expect: &ParsedRequest{
   129  				Args: map[string][]string{"totolol": {"lol"}},
   130  			},
   131  			filter: func(r *ReqDumpFilter) *ReqDumpFilter {
   132  				return r.WithArgsNameFilter("toto")
   133  			},
   134  		},
   135  		{
   136  			name: "WithEmptyHeadersFilters",
   137  			req: &ParsedRequest{
   138  				Args: map[string][]string{"cookie": {"lol"}, "totolol": {"lol"}},
   139  			},
   140  			expect: &ParsedRequest{
   141  				Args: map[string][]string{"cookie": {"lol"}, "totolol": {"lol"}},
   142  			},
   143  			filter: func(r *ReqDumpFilter) *ReqDumpFilter {
   144  				return r.WithEmptyHeadersFilters()
   145  			},
   146  		},
   147  		{
   148  			name: "WithArgsContentFilters",
   149  			req: &ParsedRequest{
   150  				Args: map[string][]string{"test": {"lol"}, "test2": {"toto"}},
   151  			},
   152  			expect: &ParsedRequest{
   153  				Args: map[string][]string{"test": {"lol"}},
   154  			},
   155  			filter: func(r *ReqDumpFilter) *ReqDumpFilter {
   156  				return r.WithArgsContentFilter("toto")
   157  			},
   158  		},
   159  	}
   160  
   161  	for idx, test := range tests {
   162  
   163  		t.Run(test.name, func(t *testing.T) {
   164  			orig_dr := test.req.DumpRequest()
   165  			result := test.filter(orig_dr).GetFilteredRequest()
   166  
   167  			if len(result.Body) != len(test.expect.Body) {
   168  				t.Fatalf("test %d (%s) failed, got %d, expected %d", idx, test.name, len(test.req.Body), len(test.expect.Body))
   169  			}
   170  			if len(result.Headers) != len(test.expect.Headers) {
   171  				t.Fatalf("test %d (%s) failed, got %d, expected %d", idx, test.name, len(test.req.Headers), len(test.expect.Headers))
   172  			}
   173  			for k, v := range result.Headers {
   174  				if len(v) != len(test.expect.Headers[k]) {
   175  					t.Fatalf("test %d (%s) failed, got %d, expected %d", idx, test.name, len(v), len(test.expect.Headers[k]))
   176  				}
   177  			}
   178  		})
   179  	}
   180  
   181  }