@@ -66,6 +66,8 @@ type responseRecorder struct {
66
66
size int
67
67
wroteHeader bool
68
68
stream bool
69
+
70
+ readSize * int
69
71
}
70
72
71
73
// NewResponseRecorder returns a new ResponseRecorder that can be
@@ -240,6 +242,12 @@ func (rr *responseRecorder) FlushError() error {
240
242
return nil
241
243
}
242
244
245
+ // Private interface so it can only be used in this package
246
+ // #TODO: maybe export it later
247
+ func (rr * responseRecorder ) setReadSize (size * int ) {
248
+ rr .readSize = size
249
+ }
250
+
243
251
func (rr * responseRecorder ) Hijack () (net.Conn , * bufio.ReadWriter , error ) {
244
252
//nolint:bodyclose
245
253
conn , brw , err := http .NewResponseController (rr .ResponseWriterWrapper ).Hijack ()
@@ -249,6 +257,15 @@ func (rr *responseRecorder) Hijack() (net.Conn, *bufio.ReadWriter, error) {
249
257
// Per http documentation, returned bufio.Writer is empty, but bufio.Read maybe not
250
258
conn = & hijackedConn {conn , rr }
251
259
brw .Writer .Reset (conn )
260
+
261
+ buffered := brw .Reader .Buffered ()
262
+ if buffered != 0 {
263
+ conn .(* hijackedConn ).updateReadSize (buffered )
264
+ data , _ := brw .Peek (buffered )
265
+ brw .Reader .Reset (io .MultiReader (bytes .NewReader (data ), conn ))
266
+ } else {
267
+ brw .Reader .Reset (conn )
268
+ }
252
269
return conn , brw , nil
253
270
}
254
271
@@ -258,6 +275,24 @@ type hijackedConn struct {
258
275
rr * responseRecorder
259
276
}
260
277
278
+ func (hc * hijackedConn ) updateReadSize (n int ) {
279
+ if hc .rr .readSize != nil {
280
+ * hc .rr .readSize += n
281
+ }
282
+ }
283
+
284
+ func (hc * hijackedConn ) Read (p []byte ) (int , error ) {
285
+ n , err := hc .Conn .Read (p )
286
+ hc .updateReadSize (n )
287
+ return n , err
288
+ }
289
+
290
+ func (hc * hijackedConn ) WriteTo (w io.Writer ) (int64 , error ) {
291
+ n , err := io .Copy (w , hc .Conn )
292
+ hc .updateReadSize (int (n ))
293
+ return n , err
294
+ }
295
+
261
296
func (hc * hijackedConn ) Write (p []byte ) (int , error ) {
262
297
n , err := hc .Conn .Write (p )
263
298
hc .rr .size += n
@@ -298,4 +333,6 @@ var (
298
333
_ io.ReaderFrom = (* ResponseWriterWrapper )(nil )
299
334
_ io.ReaderFrom = (* responseRecorder )(nil )
300
335
_ io.ReaderFrom = (* hijackedConn )(nil )
336
+
337
+ _ io.WriterTo = (* hijackedConn )(nil )
301
338
)
0 commit comments