@@ -6,12 +6,10 @@ package httptest
6
6
7
7
import (
8
8
"bytes"
9
- "errors"
10
9
"fmt"
11
10
"io"
12
11
"net/http"
13
12
"net/textproto"
14
- "os"
15
13
"strconv"
16
14
"strings"
17
15
"time"
@@ -45,18 +43,17 @@ type ResponseRecorder struct {
45
43
// Flushed is whether the Handler called Flush.
46
44
Flushed bool
47
45
48
- // ReadDeadline is the read deadline that has been set using
46
+ // ReadDeadline is the last read deadline that has been set using
49
47
// "net/http".ResponseController
50
48
ReadDeadline time.Time
51
49
52
- // WriteDeadline is the write deadline that has been set using
50
+ // WriteDeadline is the last write deadline that has been set using
53
51
// "net/http".ResponseController
54
52
WriteDeadline time.Time
55
53
56
54
result * http.Response // cache of Result's return value
57
55
snapHeader http.Header // snapshot of HeaderMap at first Write
58
56
wroteHeader bool
59
- requestBody * deadlineBodyReader
60
57
}
61
58
62
59
// NewRecorder returns an initialized ResponseRecorder.
@@ -68,21 +65,6 @@ func NewRecorder() *ResponseRecorder {
68
65
}
69
66
}
70
67
71
- // NewRecorderWithDeadlineAwareRequest returns an initialized ResponseRecorder
72
- // and wraps the body of the HTTP request passed as parameter in a special "io".ReadCloser
73
- // that supports read deadlines.
74
- // The request read deadline can be set using ResponseRecorder.SetReadDeadline
75
- // and "http".ResponseController.
76
- // The body of returned the HTTP request returns an error when the read deadline is reached.
77
- // The read deadline can be inspected by reading ResponseRecorder.ReadDeadline.
78
- func NewRecorderWithDeadlineAwareRequest (r * http.Request ) (* ResponseRecorder , * http.Request ) {
79
- rw := NewRecorder ()
80
- rw .requestBody = & deadlineBodyReader {r .Body , time.Time {}}
81
- r .Body = rw .requestBody
82
-
83
- return rw , r
84
- }
85
-
86
68
// DefaultRemoteAddr is the default remote address to return in RemoteAddr if
87
69
// an explicit DefaultRemoteAddr isn't set on ResponseRecorder.
88
70
const DefaultRemoteAddr = "1.2.3.4"
@@ -132,10 +114,6 @@ func (rw *ResponseRecorder) writeHeader(b []byte, str string) {
132
114
// Write implements http.ResponseWriter. The data in buf is written to
133
115
// rw.Body, if not nil.
134
116
func (rw * ResponseRecorder ) Write (buf []byte ) (int , error ) {
135
- if ! rw .WriteDeadline .IsZero () && time .Now ().After (rw .WriteDeadline ) {
136
- return 0 , os .ErrDeadlineExceeded
137
- }
138
-
139
117
rw .writeHeader (buf , "" )
140
118
if rw .Body != nil {
141
119
rw .Body .Write (buf )
@@ -146,10 +124,6 @@ func (rw *ResponseRecorder) Write(buf []byte) (int, error) {
146
124
// WriteString implements io.StringWriter. The data in str is written
147
125
// to rw.Body, if not nil.
148
126
func (rw * ResponseRecorder ) WriteString (str string ) (int , error ) {
149
- if ! rw .WriteDeadline .IsZero () && time .Now ().After (rw .WriteDeadline ) {
150
- return 0 , os .ErrDeadlineExceeded
151
- }
152
-
153
127
rw .writeHeader (nil , str )
154
128
if rw .Body != nil {
155
129
rw .Body .WriteString (str )
@@ -193,10 +167,6 @@ func (rw *ResponseRecorder) WriteHeader(code int) {
193
167
// with the recorder. To test whether Flush was
194
168
// called, see rw.Flushed.
195
169
func (rw * ResponseRecorder ) FlushError () error {
196
- if ! rw .WriteDeadline .IsZero () && time .Now ().After (rw .WriteDeadline ) {
197
- return os .ErrDeadlineExceeded
198
- }
199
-
200
170
if ! rw .wroteHeader {
201
171
rw .WriteHeader (200 )
202
172
}
@@ -213,28 +183,28 @@ func (rw *ResponseRecorder) Flush() {
213
183
214
184
// SetReadDeadline allows using "net/http".ResponseController.SetReadDeadline()
215
185
// with the recorder.
186
+ //
187
+ // The deadline is recorded but is not enforced.
188
+ // To prevent flaky tests reads made after the deadline will work
189
+ // as if no deadline was set.
190
+ //
216
191
// To retrieve the deadline, use rw.ReadDeadline.
217
- // To use this method, be sure NewRecorderWithDeadlineAwareRequest
218
192
func (rw * ResponseRecorder ) SetReadDeadline (deadline time.Time ) error {
219
- if rw .requestBody == nil {
220
- return errors .New ("The request has not been created using NewRecorderWithDeadlineAwareRequest()" )
221
- }
222
-
223
- if deadline .After (rw .ReadDeadline ) {
224
- rw .ReadDeadline = deadline
225
- rw .requestBody .deadline = deadline
226
- }
193
+ rw .ReadDeadline = deadline
227
194
228
195
return nil
229
196
}
230
197
231
198
// SetWriteDeadline allows using "net/http".ResponseController.SetWriteDeadline()
232
199
// with the recorder.
200
+ //
201
+ // The deadline is recorded but is not enforced.
202
+ // To prevent flaky tests writes made after the deadline will work
203
+ // as if no deadline was set.
204
+ //
233
205
// To retrieve the deadline, use rw.WriteDeadline.
234
206
func (rw * ResponseRecorder ) SetWriteDeadline (deadline time.Time ) error {
235
- if deadline .After (rw .WriteDeadline ) {
236
- rw .WriteDeadline = deadline
237
- }
207
+ rw .WriteDeadline = deadline
238
208
239
209
return nil
240
210
}
@@ -329,16 +299,3 @@ func parseContentLength(cl string) int64 {
329
299
}
330
300
return int64 (n )
331
301
}
332
-
333
- type deadlineBodyReader struct {
334
- io.ReadCloser
335
- deadline time.Time
336
- }
337
-
338
- func (r * deadlineBodyReader ) Read (p []byte ) (n int , err error ) {
339
- if time .Now ().After (r .deadline ) {
340
- return 0 , os .ErrDeadlineExceeded
341
- }
342
-
343
- return r .ReadCloser .Read (p )
344
- }
0 commit comments