-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclient.go
70 lines (56 loc) · 1.36 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
package rssapi
import (
"context"
"encoding/json"
"io"
"log"
"net/http"
"net/url"
"path"
"github.com/pkg/errors"
)
type Client struct {
url *url.URL
apiKey string
httpClient *http.Client
Logger *log.Logger
}
// NewClient returns new RSS API Client.
func NewClient(urlStr, apiKey string, logger *log.Logger) (*Client, error) {
parsedURL, err := url.Parse(urlStr)
if err != nil {
return nil, errors.Wrap(err, "failed to parse url")
}
// TODO: Configure HTTP Client.
httpClient := &http.Client{}
var discardLogger = log.New(io.Discard, "", log.LstdFlags)
if logger == nil {
logger = discardLogger
}
return &Client{
url: parsedURL,
apiKey: apiKey,
httpClient: httpClient,
Logger: logger,
}, nil
}
func (c *Client) newGETRequest(ctx context.Context, spath string, query map[string]string) (*http.Request, error) {
u := *c.url
u.Path = path.Join(c.url.Path, spath)
q := u.Query()
for k, v := range query {
q.Add(k, v)
}
u.RawQuery = q.Encode()
req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil)
if err != nil {
return nil, errors.Wrap(err, "failed to create new request")
}
req.Header.Add("X-API-KEY", c.apiKey)
return req, nil
}
func decodeBody(resp *http.Response, out interface{}) error {
defer resp.Body.Close()
decoder := json.NewDecoder(resp.Body)
return decoder.Decode(out)
}