@@ -321,26 +321,31 @@ func (resp *Response) BodyStream() io.Reader {
321
321
}
322
322
323
323
func (resp * Response ) CloseBodyStream () error {
324
- return resp .closeBodyStream ()
324
+ return resp .closeBodyStream (nil )
325
+ }
326
+
327
+ type ReadCloserWithError interface {
328
+ io.Reader
329
+ CloseWithError (err error ) error
325
330
}
326
331
327
332
type closeReader struct {
328
333
io.Reader
329
- closeFunc func () error
334
+ closeFunc func (err error ) error
330
335
}
331
336
332
- func newCloseReader (r io.Reader , closeFunc func () error ) io. ReadCloser {
337
+ func newCloseReaderWithError (r io.Reader , closeFunc func (err error ) error ) ReadCloserWithError {
333
338
if r == nil {
334
339
panic (`BUG: reader is nil` )
335
340
}
336
341
return & closeReader {Reader : r , closeFunc : closeFunc }
337
342
}
338
343
339
- func (c * closeReader ) Close ( ) error {
344
+ func (c * closeReader ) CloseWithError ( err error ) error {
340
345
if c .closeFunc == nil {
341
346
return nil
342
347
}
343
- return c .closeFunc ()
348
+ return c .closeFunc (err )
344
349
}
345
350
346
351
// BodyWriter returns writer for populating request body.
@@ -394,7 +399,7 @@ func (resp *Response) Body() []byte {
394
399
bodyBuf := resp .bodyBuffer ()
395
400
bodyBuf .Reset ()
396
401
_ , err := copyZeroAlloc (bodyBuf , resp .bodyStream )
397
- resp .closeBodyStream () //nolint:errcheck
402
+ resp .closeBodyStream (err ) //nolint:errcheck
398
403
if err != nil {
399
404
bodyBuf .SetString (err .Error ())
400
405
}
@@ -618,7 +623,7 @@ func (req *Request) BodyWriteTo(w io.Writer) error {
618
623
func (resp * Response ) BodyWriteTo (w io.Writer ) error {
619
624
if resp .bodyStream != nil {
620
625
_ , err := copyZeroAlloc (w , resp .bodyStream )
621
- resp .closeBodyStream () //nolint:errcheck
626
+ resp .closeBodyStream (err ) //nolint:errcheck
622
627
return err
623
628
}
624
629
_ , err := w .Write (resp .bodyBytes ())
@@ -629,29 +634,29 @@ func (resp *Response) BodyWriteTo(w io.Writer) error {
629
634
//
630
635
// It is safe re-using p after the function returns.
631
636
func (resp * Response ) AppendBody (p []byte ) {
632
- resp .closeBodyStream () //nolint:errcheck
637
+ resp .closeBodyStream (nil ) //nolint:errcheck
633
638
resp .bodyBuffer ().Write (p ) //nolint:errcheck
634
639
}
635
640
636
641
// AppendBodyString appends s to response body.
637
642
func (resp * Response ) AppendBodyString (s string ) {
638
- resp .closeBodyStream () //nolint:errcheck
643
+ resp .closeBodyStream (nil ) //nolint:errcheck
639
644
resp .bodyBuffer ().WriteString (s ) //nolint:errcheck
640
645
}
641
646
642
647
// SetBody sets response body.
643
648
//
644
649
// It is safe re-using body argument after the function returns.
645
650
func (resp * Response ) SetBody (body []byte ) {
646
- resp .closeBodyStream () //nolint:errcheck
651
+ resp .closeBodyStream (nil ) //nolint:errcheck
647
652
bodyBuf := resp .bodyBuffer ()
648
653
bodyBuf .Reset ()
649
654
bodyBuf .Write (body ) //nolint:errcheck
650
655
}
651
656
652
657
// SetBodyString sets response body.
653
658
func (resp * Response ) SetBodyString (body string ) {
654
- resp .closeBodyStream () //nolint:errcheck
659
+ resp .closeBodyStream (nil ) //nolint:errcheck
655
660
bodyBuf := resp .bodyBuffer ()
656
661
bodyBuf .Reset ()
657
662
bodyBuf .WriteString (body ) //nolint:errcheck
@@ -660,7 +665,7 @@ func (resp *Response) SetBodyString(body string) {
660
665
// ResetBody resets response body.
661
666
func (resp * Response ) ResetBody () {
662
667
resp .bodyRaw = nil
663
- resp .closeBodyStream () //nolint:errcheck
668
+ resp .closeBodyStream (nil ) //nolint:errcheck
664
669
if resp .body != nil {
665
670
if resp .keepBodyBuffer {
666
671
resp .body .Reset ()
@@ -700,7 +705,7 @@ func (resp *Response) ReleaseBody(size int) {
700
705
return
701
706
}
702
707
if cap (resp .body .B ) > size {
703
- resp .closeBodyStream () //nolint:errcheck
708
+ resp .closeBodyStream (nil ) //nolint:errcheck
704
709
resp .body = nil
705
710
}
706
711
}
@@ -734,7 +739,7 @@ func (resp *Response) SwapBody(body []byte) []byte {
734
739
if resp .bodyStream != nil {
735
740
bb .Reset ()
736
741
_ , err := copyZeroAlloc (bb , resp .bodyStream )
737
- resp .closeBodyStream () //nolint:errcheck
742
+ resp .closeBodyStream (err ) //nolint:errcheck
738
743
if err != nil {
739
744
bb .Reset ()
740
745
bb .SetString (err .Error ())
@@ -1725,10 +1730,13 @@ func (resp *Response) brotliBody(level int) {
1725
1730
wf : zw ,
1726
1731
bw : sw ,
1727
1732
}
1728
- copyZeroAlloc (fw , bs ) //nolint:errcheck
1733
+ _ , wErr := copyZeroAlloc (fw , bs )
1729
1734
releaseStacklessBrotliWriter (zw , level )
1730
- if bsc , ok := bs .(io.Closer ); ok {
1731
- bsc .Close ()
1735
+ switch v := bs .(type ) {
1736
+ case io.Closer :
1737
+ v .Close ()
1738
+ case ReadCloserWithError :
1739
+ v .CloseWithError (wErr ) //nolint:errcheck
1732
1740
}
1733
1741
})
1734
1742
} else {
@@ -1780,10 +1788,13 @@ func (resp *Response) gzipBody(level int) {
1780
1788
wf : zw ,
1781
1789
bw : sw ,
1782
1790
}
1783
- copyZeroAlloc (fw , bs ) //nolint:errcheck
1791
+ _ , wErr := copyZeroAlloc (fw , bs )
1784
1792
releaseStacklessGzipWriter (zw , level )
1785
- if bsc , ok := bs .(io.Closer ); ok {
1786
- bsc .Close ()
1793
+ switch v := bs .(type ) {
1794
+ case io.Closer :
1795
+ v .Close ()
1796
+ case ReadCloserWithError :
1797
+ v .CloseWithError (wErr ) //nolint:errcheck
1787
1798
}
1788
1799
})
1789
1800
} else {
@@ -1835,10 +1846,13 @@ func (resp *Response) deflateBody(level int) {
1835
1846
wf : zw ,
1836
1847
bw : sw ,
1837
1848
}
1838
- copyZeroAlloc (fw , bs ) //nolint:errcheck
1849
+ _ , wErr := copyZeroAlloc (fw , bs )
1839
1850
releaseStacklessDeflateWriter (zw , level )
1840
- if bsc , ok := bs .(io.Closer ); ok {
1841
- bsc .Close ()
1851
+ switch v := bs .(type ) {
1852
+ case io.Closer :
1853
+ v .Close ()
1854
+ case ReadCloserWithError :
1855
+ v .CloseWithError (wErr ) //nolint:errcheck
1842
1856
}
1843
1857
})
1844
1858
} else {
@@ -1887,10 +1901,13 @@ func (resp *Response) zstdBody(level int) {
1887
1901
wf : zw ,
1888
1902
bw : sw ,
1889
1903
}
1890
- copyZeroAlloc (fw , bs ) //nolint:errcheck
1904
+ _ , wErr := copyZeroAlloc (fw , bs )
1891
1905
releaseStacklessZstdWriter (zw , level )
1892
- if bsc , ok := bs .(io.Closer ); ok {
1893
- bsc .Close ()
1906
+ switch v := bs .(type ) {
1907
+ case io.Closer :
1908
+ v .Close ()
1909
+ case ReadCloserWithError :
1910
+ v .CloseWithError (wErr ) //nolint:errcheck
1894
1911
}
1895
1912
})
1896
1913
} else {
@@ -2053,7 +2070,7 @@ func (resp *Response) writeBodyStream(w *bufio.Writer, sendBody bool) (err error
2053
2070
}
2054
2071
}
2055
2072
}
2056
- errc := resp .closeBodyStream ()
2073
+ errc := resp .closeBodyStream (err )
2057
2074
if err == nil {
2058
2075
err = errc
2059
2076
}
@@ -2075,14 +2092,17 @@ func (req *Request) closeBodyStream() error {
2075
2092
return err
2076
2093
}
2077
2094
2078
- func (resp * Response ) closeBodyStream () error {
2095
+ func (resp * Response ) closeBodyStream (wErr error ) error {
2079
2096
if resp .bodyStream == nil {
2080
2097
return nil
2081
2098
}
2082
2099
var err error
2083
2100
if bsc , ok := resp .bodyStream .(io.Closer ); ok {
2084
2101
err = bsc .Close ()
2085
2102
}
2103
+ if bsc , ok := resp .bodyStream .(ReadCloserWithError ); ok {
2104
+ err = bsc .CloseWithError (wErr )
2105
+ }
2086
2106
if bsr , ok := resp .bodyStream .(* requestStream ); ok {
2087
2107
releaseRequestStream (bsr )
2088
2108
}
0 commit comments