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 }