Skip to content

Commit 2285d22

Browse files
authored
DE-1144 refactor httphelpers (#334)
1 parent 609ce8b commit 2285d22

File tree

3 files changed

+38
-28
lines changed

3 files changed

+38
-28
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ all: test
1212

1313
.PHONY: test
1414
test:
15-
export GO111MODULE=on; go test . -v
15+
export GO111MODULE=on; go test . -race -count=1
1616

1717
.PHONY: godoc
1818
godoc:

httphelpers.go

+35-25
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"encoding/json"
77
"fmt"
88
"io"
9-
"io/ioutil"
109
"mime/multipart"
1110
"net/http"
1211
"net/url"
@@ -131,6 +130,7 @@ func (f *urlEncodedPayload) getPayloadBuffer() (*bytes.Buffer, error) {
131130
for _, keyVal := range f.Values {
132131
data.Add(keyVal.key, keyVal.value)
133132
}
133+
134134
return bytes.NewBufferString(data.Encode()), nil
135135
}
136136

@@ -177,6 +177,7 @@ func (f *formDataPayload) getPayloadBuffer() (*bytes.Buffer, error) {
177177

178178
for _, keyVal := range f.Values {
179179
if tmp, err := writer.CreateFormField(keyVal.key); err == nil {
180+
// TODO(DE-1139): handle error:
180181
tmp.Write([]byte(keyVal.value))
181182
} else {
182183
return nil, err
@@ -186,7 +187,9 @@ func (f *formDataPayload) getPayloadBuffer() (*bytes.Buffer, error) {
186187
for _, file := range f.Files {
187188
if tmp, err := writer.CreateFormFile(file.key, path.Base(file.value)); err == nil {
188189
if fp, err := os.Open(file.value); err == nil {
190+
// TODO(DE-1139): defer in a loop:
189191
defer fp.Close()
192+
// TODO(DE-1139): handle error:
190193
io.Copy(tmp, fp)
191194
} else {
192195
return nil, err
@@ -198,7 +201,9 @@ func (f *formDataPayload) getPayloadBuffer() (*bytes.Buffer, error) {
198201

199202
for _, file := range f.ReadClosers {
200203
if tmp, err := writer.CreateFormFile(file.key, file.name); err == nil {
204+
// TODO(DE-1139): defer in a loop:
201205
defer file.value.Close()
206+
// TODO(DE-1139): handle error:
202207
io.Copy(tmp, file.value)
203208
} else {
204209
return nil, err
@@ -208,6 +213,7 @@ func (f *formDataPayload) getPayloadBuffer() (*bytes.Buffer, error) {
208213
for _, buff := range f.Buffers {
209214
if tmp, err := writer.CreateFormFile(buff.key, buff.name); err == nil {
210215
r := bytes.NewReader(buff.value)
216+
// TODO(DE-1139): handle error:
211217
io.Copy(tmp, r)
212218
} else {
213219
return nil, err
@@ -221,8 +227,10 @@ func (f *formDataPayload) getPayloadBuffer() (*bytes.Buffer, error) {
221227

222228
func (f *formDataPayload) getContentType() string {
223229
if f.contentType == "" {
230+
// TODO(DE-1139): handle error:
224231
f.getPayloadBuffer()
225232
}
233+
226234
return f.contentType
227235
}
228236

@@ -234,23 +242,23 @@ func (r *httpRequest) addHeader(name, value string) {
234242
}
235243

236244
func (r *httpRequest) makeGetRequest(ctx context.Context) (*httpResponse, error) {
237-
return r.makeRequest(ctx, "GET", nil)
245+
return r.makeRequest(ctx, http.MethodGet, nil)
238246
}
239247

240248
func (r *httpRequest) makePostRequest(ctx context.Context, payload payload) (*httpResponse, error) {
241-
return r.makeRequest(ctx, "POST", payload)
249+
return r.makeRequest(ctx, http.MethodPost, payload)
242250
}
243251

244252
func (r *httpRequest) makePutRequest(ctx context.Context, payload payload) (*httpResponse, error) {
245-
return r.makeRequest(ctx, "PUT", payload)
253+
return r.makeRequest(ctx, http.MethodPut, payload)
246254
}
247255

248256
func (r *httpRequest) makeDeleteRequest(ctx context.Context) (*httpResponse, error) {
249-
return r.makeRequest(ctx, "DELETE", nil)
257+
return r.makeRequest(ctx, http.MethodDelete, nil)
250258
}
251259

252260
func (r *httpRequest) NewRequest(ctx context.Context, method string, payload payload) (*http.Request, error) {
253-
url, err := r.generateUrlWithParameters()
261+
uri, err := r.generateUrlWithParameters()
254262
if err != nil {
255263
return nil, err
256264
}
@@ -263,13 +271,12 @@ func (r *httpRequest) NewRequest(ctx context.Context, method string, payload pay
263271
} else {
264272
body = nil
265273
}
266-
req, err := http.NewRequest(method, url, body)
274+
275+
req, err := http.NewRequestWithContext(ctx, method, uri, body)
267276
if err != nil {
268277
return nil, err
269278
}
270279

271-
req = req.WithContext(ctx)
272-
273280
if payload != nil && payload.getContentType() != "" {
274281
req.Header.Add("Content-Type", payload.getContentType())
275282
}
@@ -286,6 +293,7 @@ func (r *httpRequest) NewRequest(ctx context.Context, method string, payload pay
286293
}
287294
req.Header.Add(header, value)
288295
}
296+
289297
return req, nil
290298
}
291299

@@ -305,52 +313,53 @@ func (r *httpRequest) makeRequest(ctx context.Context, method string, payload pa
305313
}
306314
}
307315

308-
response := httpResponse{}
309-
310316
resp, err := r.Client.Do(req)
311-
if resp != nil {
312-
response.Code = resp.StatusCode
313-
}
314317
if err != nil {
315-
if urlErr, ok := err.(*url.Error); ok {
316-
if urlErr.Err == io.EOF {
317-
return nil, errors.Wrap(err, "remote server prematurely closed connection")
318-
}
318+
var urlErr *url.Error
319+
if errors.As(err, &urlErr) && urlErr != nil && errors.Is(urlErr.Err, io.EOF) {
320+
return nil, errors.Wrap(err, "remote server prematurely closed connection")
319321
}
322+
320323
return nil, errors.Wrap(err, "while making http request")
321324
}
322325

323326
defer resp.Body.Close()
324-
responseBody, err := ioutil.ReadAll(resp.Body)
327+
328+
response := httpResponse{
329+
Code: resp.StatusCode,
330+
}
331+
332+
responseBody, err := io.ReadAll(resp.Body)
325333
if err != nil {
326334
return nil, errors.Wrap(err, "while reading response body")
327335
}
328336

329337
response.Data = responseBody
338+
330339
return &response, nil
331340
}
332341

333342
func (r *httpRequest) generateUrlWithParameters() (string, error) {
334-
url, err := url.Parse(r.URL)
343+
uri, err := url.Parse(r.URL)
335344
if err != nil {
336345
return "", err
337346
}
338347

339-
if !validURL.MatchString(url.Path) {
340-
return "", errors.New(`BaseAPI must end with a /v1, /v2, /v3 or /v4; setBaseAPI("https://host/v3")`)
348+
if !validURL.MatchString(uri.Path) {
349+
return "", errors.New(`APIBase must end with a /v1, /v2, /v3 or /v4; SetAPIBase("https://host/v3")`)
341350
}
342351

343-
q := url.Query()
352+
q := uri.Query()
344353
if r.Parameters != nil && len(r.Parameters) > 0 {
345354
for name, values := range r.Parameters {
346355
for _, value := range values {
347356
q.Add(name, value)
348357
}
349358
}
350359
}
351-
url.RawQuery = q.Encode()
360+
uri.RawQuery = q.Encode()
352361

353-
return url.String(), nil
362+
return uri.String(), nil
354363
}
355364

356365
func (r *httpRequest) curlString(req *http.Request, p payload) string {
@@ -384,5 +393,6 @@ func (r *httpRequest) curlString(req *http.Request, p payload) string {
384393
}
385394
}
386395
}
396+
387397
return strings.Join(parts, " ")
388398
}

mailgun_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
"github.com/facebookgo/ensure"
1212
"github.com/mailgun/mailgun-go/v4"
13+
"github.com/stretchr/testify/assert"
1314
)
1415

1516
const domain = "valid-mailgun-domain"
@@ -33,8 +34,7 @@ func TestInvalidBaseAPI(t *testing.T) {
3334

3435
ctx := context.Background()
3536
_, err := mg.GetDomain(ctx, "unknown.domain")
36-
ensure.NotNil(t, err)
37-
ensure.DeepEqual(t, err.Error(), `BaseAPI must end with a /v1, /v2, /v3 or /v4; setBaseAPI("https://host/v3")`)
37+
assert.EqualError(t, err, `APIBase must end with a /v1, /v2, /v3 or /v4; SetAPIBase("https://host/v3")`)
3838
}
3939

4040
func TestValidBaseAPI(t *testing.T) {

0 commit comments

Comments
 (0)