Skip to content

Commit 64ff8d2

Browse files
committed
test: add test suite
1 parent 5b4d4da commit 64ff8d2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+19145
-10
lines changed

go.mod

+8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
11
module github.com/acouvreur/traefik-modsecurity-plugin
22

33
go 1.17
4+
5+
require github.com/stretchr/testify v1.7.0
6+
7+
require (
8+
github.com/davecgh/go-spew v1.1.0 // indirect
9+
github.com/pmezard/go-difflib v1.0.0 // indirect
10+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect
11+
)

go.sum

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
2+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
4+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
5+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
6+
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
7+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
8+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
9+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
10+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
11+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

modsecurity.go

+14-10
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,7 @@ func (a *Modsecurity) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
8585
defer resp.Body.Close()
8686

8787
if resp.StatusCode >= 400 {
88-
// copy headers
89-
for k, vv := range resp.Header {
90-
for _, v := range vv {
91-
rw.Header().Set(k, v)
92-
}
93-
}
94-
// copy status
95-
rw.WriteHeader(resp.StatusCode)
96-
// copy body
97-
io.Copy(rw, resp.Body)
88+
forwardResponse(resp, rw)
9889
return
9990
}
10091

@@ -109,3 +100,16 @@ func isWebsocket(req *http.Request) bool {
109100
}
110101
return false
111102
}
103+
104+
func forwardResponse(resp *http.Response, rw http.ResponseWriter) {
105+
// copy headers
106+
for k, vv := range resp.Header {
107+
for _, v := range vv {
108+
rw.Header().Set(k, v)
109+
}
110+
}
111+
// copy status
112+
rw.WriteHeader(resp.StatusCode)
113+
// copy body
114+
io.Copy(rw, resp.Body)
115+
}

modsecurity_test.go

+118
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
// Package traefik_modsecurity_plugin a modsecurity plugin.
2+
package traefik_modsecurity_plugin
3+
4+
import (
5+
"bytes"
6+
"io"
7+
"log"
8+
"net/http"
9+
"net/http/httptest"
10+
"testing"
11+
12+
"github.com/stretchr/testify/assert"
13+
)
14+
15+
func TestModsecurity_ServeHTTP(t *testing.T) {
16+
17+
req, err := http.NewRequest(http.MethodGet, "http://proxy.com/test", bytes.NewBuffer([]byte("Request")))
18+
19+
if err != nil {
20+
log.Fatal(err)
21+
}
22+
23+
type response struct {
24+
Body string
25+
StatusCode int
26+
}
27+
28+
serviceResponse := response{
29+
StatusCode: 200,
30+
Body: "Response from service",
31+
}
32+
33+
tests := []struct {
34+
name string
35+
request http.Request
36+
wafResponse response
37+
serviceResponse response
38+
expectBody string
39+
expectStatus int
40+
}{
41+
{
42+
name: "Forward request when WAF found no threats",
43+
request: *req,
44+
wafResponse: response{
45+
StatusCode: 200,
46+
Body: "Response from waf",
47+
},
48+
serviceResponse: serviceResponse,
49+
expectBody: "Response from service",
50+
expectStatus: 200,
51+
},
52+
{
53+
name: "Intercepts request when WAF found threats",
54+
request: *req,
55+
wafResponse: response{
56+
StatusCode: 403,
57+
Body: "Response from waf",
58+
},
59+
serviceResponse: serviceResponse,
60+
expectBody: "Response from waf",
61+
expectStatus: 403,
62+
},
63+
{
64+
name: "Does not forward Websockets",
65+
request: http.Request{
66+
Body: http.NoBody,
67+
Header: http.Header{
68+
"Upgrade": []string{"Websocket"},
69+
},
70+
},
71+
wafResponse: response{
72+
StatusCode: 200,
73+
Body: "Response from waf",
74+
},
75+
serviceResponse: serviceResponse,
76+
expectBody: "Response from service",
77+
expectStatus: 200,
78+
},
79+
}
80+
for _, tt := range tests {
81+
t.Run(tt.name, func(t *testing.T) {
82+
83+
modsecurityMockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
84+
resp := http.Response{
85+
Body: io.NopCloser(bytes.NewReader([]byte(tt.wafResponse.Body))),
86+
StatusCode: tt.wafResponse.StatusCode,
87+
Header: http.Header{},
88+
}
89+
forwardResponse(&resp, w)
90+
}))
91+
92+
httpServiceHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
93+
resp := http.Response{
94+
Body: io.NopCloser(bytes.NewReader([]byte(tt.serviceResponse.Body))),
95+
StatusCode: tt.serviceResponse.StatusCode,
96+
Header: http.Header{},
97+
}
98+
forwardResponse(&resp, w)
99+
})
100+
101+
middleware := &Modsecurity{
102+
next: httpServiceHandler,
103+
modSecurityUrl: modsecurityMockServer.URL,
104+
name: "modsecurity-middleware",
105+
}
106+
107+
rw := httptest.NewRecorder()
108+
109+
middleware.ServeHTTP(rw, &tt.request)
110+
111+
resp := rw.Result()
112+
body, _ := io.ReadAll(resp.Body)
113+
114+
assert.Equal(t, tt.expectBody, string(body))
115+
assert.Equal(t, tt.expectStatus, resp.StatusCode)
116+
})
117+
}
118+
}

vendor/github.com/davecgh/go-spew/LICENSE

+15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/davecgh/go-spew/spew/bypass.go

+152
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/davecgh/go-spew/spew/bypasssafe.go

+38
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)