-
Notifications
You must be signed in to change notification settings - Fork 1
/
httpclient.go
64 lines (54 loc) · 1.35 KB
/
httpclient.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
package main
import (
"errors"
"io/ioutil"
"net"
"net/http"
"strconv"
"time"
)
// httpGet performs a simple get against a remote webserver.
func httpGet(url string, headers httpHeader) ([]byte, error) {
var (
err error // error handler
client http.Client // http client
req *http.Request // http request
res *http.Response // http response
output []byte // output
)
// set timeouts
client = http.Client{
Timeout: time.Duration(time.Second * 2),
Transport: &http.Transport{
Dial: (&net.Dialer{
Timeout: time.Duration(time.Second * 2),
}).Dial,
TLSHandshakeTimeout: time.Duration(time.Second * 2),
},
}
// setup request
if req, err = http.NewRequest("GET", url, nil); err != nil {
return output, err
}
// setup headers
if len(headers) > 0 {
for _, header := range headers {
req.Header.Set(header.Name, header.Value)
}
}
// perform the request
if res, err = client.Do(req); err != nil {
return output, err
}
// close the connection upon function closure
defer res.Body.Close()
// extract response body
if output, err = ioutil.ReadAll(res.Body); err != nil {
return output, err
}
// check status
if res.StatusCode < 200 || res.StatusCode >= 300 {
return output, errors.New("non-successful status code received [" + strconv.Itoa(res.StatusCode) + "]")
}
return output, nil
}