@@ -47,6 +47,75 @@ func TestWriteHeader(t *testing.T) {
47
47
}
48
48
}
49
49
50
+ func TestWrite (t * testing.T ) {
51
+ waf , err := coraza .NewWAF (coraza .NewWAFConfig ())
52
+ if err != nil {
53
+ t .Fatal (err )
54
+ }
55
+
56
+ tx := waf .NewTransaction ()
57
+ req , _ := http .NewRequest ("GET" , "" , nil )
58
+ res := httptest .NewRecorder ()
59
+
60
+ rw , responseProcessor := wrap (res , req , tx )
61
+ _ , err = rw .Write ([]byte ("hello" ))
62
+ if err != nil {
63
+ t .Errorf ("unexpected error: %v" , err )
64
+ }
65
+
66
+ _ , err = rw .Write ([]byte ("world" ))
67
+ if err != nil {
68
+ t .Errorf ("unexpected error: %v" , err )
69
+ }
70
+
71
+ err = responseProcessor (tx , req )
72
+ if err != nil {
73
+ t .Errorf ("unexpected error: %v" , err )
74
+ }
75
+
76
+ if want , have := 200 , res .Code ; want != have {
77
+ t .Errorf ("unexpected status code, want %d, have %d" , want , have )
78
+ }
79
+ }
80
+
81
+ func TestWriteWithWriteHeader (t * testing.T ) {
82
+ waf , err := coraza .NewWAF (coraza .NewWAFConfig ())
83
+ if err != nil {
84
+ t .Fatal (err )
85
+ }
86
+
87
+ tx := waf .NewTransaction ()
88
+ req , _ := http .NewRequest ("GET" , "" , nil )
89
+ res := httptest .NewRecorder ()
90
+
91
+ rw , responseProcessor := wrap (res , req , tx )
92
+ rw .WriteHeader (204 )
93
+ // although we called WriteHeader, status code should be applied until
94
+ // responseProcessor is called.
95
+ if unwanted , have := 204 , res .Code ; unwanted == have {
96
+ t .Errorf ("unexpected status code %d" , have )
97
+ }
98
+
99
+ _ , err = rw .Write ([]byte ("hello" ))
100
+ if err != nil {
101
+ t .Errorf ("unexpected error: %v" , err )
102
+ }
103
+
104
+ _ , err = rw .Write ([]byte ("world" ))
105
+ if err != nil {
106
+ t .Errorf ("unexpected error: %v" , err )
107
+ }
108
+
109
+ err = responseProcessor (tx , req )
110
+ if err != nil {
111
+ t .Errorf ("unexpected error: %v" , err )
112
+ }
113
+
114
+ if want , have := 204 , res .Code ; want != have {
115
+ t .Errorf ("unexpected status code, want %d, have %d" , want , have )
116
+ }
117
+ }
118
+
50
119
func TestFlush (t * testing.T ) {
51
120
waf , err := coraza .NewWAF (coraza .NewWAFConfig ())
52
121
if err != nil {
@@ -75,6 +144,14 @@ func TestFlush(t *testing.T) {
75
144
}
76
145
}
77
146
147
+ type testReaderFrom struct {
148
+ io.Writer
149
+ }
150
+
151
+ func (x * testReaderFrom ) ReadFrom (r io.Reader ) (n int64 , err error ) {
152
+ return io .Copy (x , r )
153
+ }
154
+
78
155
func TestReadFrom (t * testing.T ) {
79
156
waf , err := coraza .NewWAF (coraza .NewWAFConfig ())
80
157
if err != nil {
@@ -84,13 +161,86 @@ func TestReadFrom(t *testing.T) {
84
161
tx := waf .NewTransaction ()
85
162
req , _ := http .NewRequest ("GET" , "" , nil )
86
163
res := httptest .NewRecorder ()
87
- rw , _ := wrap (res , req , tx )
164
+
165
+ type responseWriter interface {
166
+ http.ResponseWriter
167
+ http.Flusher
168
+ }
169
+
170
+ resWithReaderFrom := struct {
171
+ responseWriter
172
+ io.ReaderFrom
173
+ }{
174
+ res ,
175
+ & testReaderFrom {res },
176
+ }
177
+
178
+ rw , responseProcessor := wrap (resWithReaderFrom , req , tx )
88
179
rw .WriteHeader (204 )
180
+ // although we called WriteHeader, status code should be applied until
181
+ // responseProcessor is called.
182
+ if unwanted , have := 204 , res .Code ; unwanted == have {
183
+ t .Errorf ("unexpected status code %d" , have )
184
+ }
185
+
89
186
_ , err = rw .(io.ReaderFrom ).ReadFrom (bytes .NewBuffer ([]byte ("hello world" )))
90
187
if err != nil {
91
188
t .Errorf ("unexpected error: %v" , err )
92
189
}
93
190
191
+ err = responseProcessor (tx , req )
192
+ if err != nil {
193
+ t .Errorf ("unexpected error: %v" , err )
194
+ }
195
+
196
+ if want , have := 204 , res .Code ; want != have {
197
+ t .Errorf ("unexpected status code, want %d, have %d" , want , have )
198
+ }
199
+ }
200
+
201
+ type testPusher struct {}
202
+
203
+ func (x * testPusher ) Push (target string , opts * http.PushOptions ) error {
204
+ return nil
205
+ }
206
+
207
+ func TestPusher (t * testing.T ) {
208
+ waf , err := coraza .NewWAF (coraza .NewWAFConfig ())
209
+ if err != nil {
210
+ t .Fatal (err )
211
+ }
212
+
213
+ tx := waf .NewTransaction ()
214
+ req , _ := http .NewRequest ("GET" , "" , nil )
215
+ res := httptest .NewRecorder ()
216
+
217
+ type responseWriter interface {
218
+ http.ResponseWriter
219
+ http.Flusher
220
+ }
221
+
222
+ resWithPush := struct {
223
+ responseWriter
224
+ http.Pusher
225
+ }{
226
+ res ,
227
+ & testPusher {},
228
+ }
229
+
230
+ rw , responseProcessor := wrap (resWithPush , req , tx )
231
+ rw .WriteHeader (204 )
232
+ rw .(http.Pusher ).Push ("http://example.com" , nil )
233
+ // although we called WriteHeader, status code should be applied until
234
+ // responseProcessor is called.
235
+ if unwanted , have := 204 , res .Code ; unwanted == have {
236
+ t .Errorf ("unexpected status code %d" , have )
237
+ }
238
+
239
+ err = responseProcessor (tx , req )
240
+ if err != nil {
241
+ t .Errorf ("unexpected error: %v" , err )
242
+ }
243
+
94
244
if want , have := 204 , res .Code ; want != have {
95
245
t .Errorf ("unexpected status code, want %d, have %d" , want , have )
96
246
}
0 commit comments