Skip to content

Commit 414b364

Browse files
authored
fix: retry not reset multipartField reader (#953)
1 parent 16fd88a commit 414b364

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

retry.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,9 @@ func Backoff(operation func() (*Response, error), options ...Option) error {
139139
if err := resetFileReaders(resp.Request.multipartFiles); err != nil {
140140
return err
141141
}
142+
if err := resetFieldReaders(resp.Request.multipartFields); err != nil {
143+
return err
144+
}
142145
}
143146

144147
for _, hook := range opts.retryHooks {
@@ -250,3 +253,15 @@ func resetFileReaders(files []*File) error {
250253

251254
return nil
252255
}
256+
257+
func resetFieldReaders(fields []*MultipartField) error {
258+
for _, f := range fields {
259+
if rs, ok := f.Reader.(io.ReadSeeker); ok {
260+
if _, err := rs.Seek(0, io.SeekStart); err != nil {
261+
return err
262+
}
263+
}
264+
}
265+
266+
return nil
267+
}

retry_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,3 +823,58 @@ func TestResetMultipartReaders(t *testing.T) {
823823
assertEqual(t, 500, resp.StatusCode())
824824
assertNil(t, err)
825825
}
826+
827+
func TestResetMultipartFieldReaderSeekStartError(t *testing.T) {
828+
ts := createFilePostServer(t)
829+
defer ts.Close()
830+
831+
testSeeker := &failingSeeker{
832+
bytes.NewReader([]byte("test")),
833+
}
834+
835+
c := dc().
836+
SetRetryCount(2).
837+
SetTimeout(time.Second * 3).
838+
SetRetryResetReaders(true).
839+
AddRetryAfterErrorCondition()
840+
841+
resp, err := c.R().
842+
SetMultipartField("file", "audio.wav", "audio/wav", testSeeker).
843+
Post(ts.URL + "/set-reset-multipart-readers-test")
844+
845+
assertEqual(t, 500, resp.StatusCode())
846+
assertEqual(t, err.Error(), errSeekFailure.Error())
847+
}
848+
849+
func TestResetMultipartFieldReaders(t *testing.T) {
850+
ts := createFilePostServer(t)
851+
defer ts.Close()
852+
853+
str := "test"
854+
buf := []byte(str)
855+
856+
bufReader := bytes.NewReader(buf)
857+
bufCpy := make([]byte, len(buf))
858+
859+
c := dc().
860+
SetRetryCount(2).
861+
SetTimeout(time.Second * 3).
862+
SetRetryResetReaders(true).
863+
AddRetryAfterErrorCondition().
864+
AddRetryHook(
865+
func(response *Response, _ error) {
866+
read, err := bufReader.Read(bufCpy)
867+
868+
assertNil(t, err)
869+
assertEqual(t, len(buf), read)
870+
assertEqual(t, str, string(bufCpy))
871+
},
872+
)
873+
874+
resp, err := c.R().
875+
SetMultipartField("file", "audio.wav", "audio/wav", bufReader).
876+
Post(ts.URL + "/set-reset-multipart-readers-test")
877+
878+
assertEqual(t, 500, resp.StatusCode())
879+
assertNil(t, err)
880+
}

0 commit comments

Comments
 (0)