Skip to content

Commit cfc3ac7

Browse files
committed
Fix retrying requests with non-nil body
fix retrying requests use GetBody method to deliver body when retrying http requests
1 parent 4e9f38f commit cfc3ac7

File tree

1 file changed

+32
-14
lines changed

1 file changed

+32
-14
lines changed

internal/web_api.go

+32-14
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/json"
66
"errors"
77
"fmt"
8+
"io"
89
"io/ioutil"
910
"mime/multipart"
1011
"net/http"
@@ -64,10 +65,6 @@ func NewAPI(t authorization.TokenGetter, client *http.Client, clientID string, r
6465

6566
// Call sends request to API with given action
6667
func (a *api) Call(action string, reqPayload interface{}, respPayload interface{}) error {
67-
rawBody, err := json.Marshal(reqPayload)
68-
if err != nil {
69-
return err
70-
}
7168
token, err := a.getToken()
7269
if err != nil {
7370
return err
@@ -77,7 +74,15 @@ func (a *api) Call(action string, reqPayload interface{}, respPayload interface{
7774
if err != nil {
7875
return fmt.Errorf("couldn't create new http request: %v", err)
7976
}
80-
req.Body = ioutil.NopCloser(bytes.NewReader(rawBody))
77+
78+
rawBody, err := json.Marshal(reqPayload)
79+
if err != nil {
80+
return err
81+
}
82+
req.GetBody = func() (io.ReadCloser, error) {
83+
return ioutil.NopCloser(bytes.NewReader(rawBody)), nil
84+
}
85+
req.Body, _ = req.GetBody()
8186

8287
req.Header.Set("Content-Type", "application/json")
8388
req.Header.Set("Authorization", fmt.Sprintf("%s %s", token.Type, token.AccessToken))
@@ -119,6 +124,17 @@ func NewAPIWithFileUpload(t authorization.TokenGetter, client *http.Client, clie
119124
// Returned URL shall be used in call to SendFile or SendEvent or it'll become invalid
120125
// in about 24 hours.
121126
func (a *fileUploadAPI) UploadFile(filename string, file []byte) (string, error) {
127+
token := a.tokenGetter()
128+
if token == nil {
129+
return "", fmt.Errorf("couldn't get token")
130+
}
131+
132+
req, err := a.httpRequestGenerator(token, a.host, "upload_file")
133+
if err != nil {
134+
return "", fmt.Errorf("couldn't create new http request: %v", err)
135+
}
136+
req.Method = "POST"
137+
122138
body := &bytes.Buffer{}
123139
writer := multipart.NewWriter(body)
124140
w, err := writer.CreateFormFile("file", filename)
@@ -131,17 +147,11 @@ func (a *fileUploadAPI) UploadFile(filename string, file []byte) (string, error)
131147
if err := writer.Close(); err != nil {
132148
return "", fmt.Errorf("couldn't close multipart writer: %v", err)
133149
}
134-
token := a.tokenGetter()
135-
if token == nil {
136-
return "", fmt.Errorf("couldn't get token")
137-
}
138150

139-
req, err := a.httpRequestGenerator(token, a.host, "upload_file")
140-
if err != nil {
141-
return "", fmt.Errorf("couldn't create new http request: %v", err)
151+
req.GetBody = func() (io.ReadCloser, error) {
152+
return ioutil.NopCloser(bytes.NewReader(body.Bytes())), nil
142153
}
143-
req.Method = "POST"
144-
req.Body = ioutil.NopCloser(body)
154+
req.Body, _ = req.GetBody()
145155

146156
req.Header.Set("Content-Type", writer.FormDataContentType())
147157
req.Header.Set("Authorization", fmt.Sprintf("%s %s", token.Type, token.AccessToken))
@@ -185,6 +195,14 @@ func (a *api) send(req *http.Request, respPayload interface{}) error {
185195
}
186196

187197
req.Header.Set("Authorization", fmt.Sprintf("%s %s", token.Type, token.AccessToken))
198+
if req.Body != nil {
199+
reqBody, err := req.GetBody()
200+
if err != nil {
201+
return fmt.Errorf("couldn't get request body: %v", err)
202+
}
203+
req.Body = reqBody
204+
}
205+
188206
attempts++
189207
return do()
190208
}

0 commit comments

Comments
 (0)