-
Notifications
You must be signed in to change notification settings - Fork 3
/
api.go
75 lines (61 loc) · 1.4 KB
/
api.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package api
import (
"bytes"
"context"
"fmt"
"io/ioutil"
"net/http"
"time"
cb "github.com/sleey/common-go/circuitbreaker"
)
// Request request config for http call
// Please be aware that timeout is Duration type i.e 4*time.Second or 100*time.Millisecond
type Request struct {
Method string
URL string
Headers map[string]string
Timeout time.Duration
CB *cb.CircuitBreaker
}
// Do do http call
func (r *Request) Do() (buffer []byte, err error) {
err = r.CB.Run(func() error {
var errCb error
buffer, errCb = r.DoRequest()
return errCb
})
return
}
// DoRequest to do request
func (r *Request) DoRequest() (buffer []byte, err error) {
ctx, cancel := context.WithTimeout(context.Background(), (r.Timeout))
defer cancel()
var request *http.Request
var response *http.Response
// setup http request
request, err = http.NewRequest(r.Method, r.URL, &bytes.Buffer{})
if err != nil {
return
}
for key, value := range r.Headers {
request.Header.Set(key, value)
}
request.WithContext(ctx)
// send request
response, err = (&http.Client{Timeout: r.Timeout}).Do(request)
if err != nil {
return
}
defer response.Body.Close()
// check non 200 responses
if response.StatusCode != 200 {
err = fmt.Errorf("Status code: %d, url: %s", response.StatusCode, r.URL)
return
}
// read body response
buffer, err = ioutil.ReadAll(response.Body)
if err != nil {
return
}
return
}