forked from icedream/go-footballdata
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclient.go
73 lines (60 loc) · 1.72 KB
/
client.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
package footballdata
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"net/url"
)
/*
Provides a high-level client to talk to the API that football-data.org offers.
To create an instance please use NewClient(h).
*/
type Client struct {
h *http.Client
// Insert an API token here if you have one. It will be sent across with all requests.
AuthToken string
}
// Creates a new Client instance that wraps around the given HTTP client.
func NewClient(h *http.Client) *Client {
return &Client{h: h}
}
func (c *Client) req(path string, pathValues ...interface{}) request {
return request{c, fmt.Sprintf(path, pathValues...), url.Values{}}
}
// Executes an HTTP request with given parameters and on success returns the response wrapped in a JSON decoder.
func (c *Client) doJson(method string, path string, values url.Values) (j *json.Decoder, meta ResponseMeta, err error) {
// Create request
req := &http.Request{
Method: method,
URL: resolveRelativeUrl(path, values),
Header: http.Header{},
}
// Set request headers
if len(c.AuthToken) > 0 {
req.Header.Set("X-Auth-Token", c.AuthToken)
}
req.Header.Set("X-Response-Control", "minified")
req.Header.Set("User-Agent", "go-footballdata/0.0")
// Execute request
resp, err := c.h.Do(req)
if err != nil {
return
}
defer resp.Body.Close()
// Save metadata from headers
meta = responseMetaFromHeaders(resp.Header)
// Expect the request to be successful, otherwise throw an error
if resp.StatusCode != 200 {
err = errors.New(resp.Status)
return
}
// Download to buffer to allow passing back a fully prepared decoder
buf := new(bytes.Buffer)
io.Copy(buf, resp.Body)
// Wrap JSON decoder around buffered data
j = json.NewDecoder(buf)
return
}