forked from dkerwin/gini-api-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.go
77 lines (63 loc) · 1.88 KB
/
utils.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
76
77
package giniapi
import (
"fmt"
"io"
"net/http"
"net/http/httputil"
"net/url"
"reflect"
"strconv"
)
// MakeAPIRequest is a wrapper around http.NewRequest to create http
// request and inject required headers.
func (api *APIClient) makeAPIRequest(verb, url string, body io.Reader, headers map[string]string, userIdentifier string) (*http.Response, error) {
req, err := http.NewRequest(verb, url, body)
if err != nil {
return nil, fmt.Errorf("failed to create HTTP request: %s", err)
}
if _, ok := headers["Accept"]; !ok {
req.Header.Add("Accept", fmt.Sprintf("application/vnd.gini.%s+json", api.Config.APIVersion))
}
req.Header.Add("User-Agent", fmt.Sprintf("gini-api-go/%s", VERSION))
if reflect.TypeOf(api.Config.Authentication).Name() == "BasicAuth" {
if userIdentifier == "" {
return nil, fmt.Errorf("userIdentifier required (Authentication=BasicAuth)")
}
req.Header.Add("X-User-Identifier", userIdentifier)
}
// Append additional headers
for h, v := range headers {
req.Header.Add(h, v)
}
resp, err := api.HTTPClient.Do(req)
// Debug HTTP calls?
if api.Config.HTTPDebug {
debug, err := httputil.DumpRequest(resp.Request, false)
if err != nil {
api.Config.RequestDebug <- []byte(fmt.Sprintf("Failed to dump request: %s", err))
} else {
api.Config.RequestDebug <- debug
}
debug, err = httputil.DumpResponse(resp, true)
if err != nil {
api.Config.ResponseDebug <- []byte(fmt.Sprintf("Failed to dump response: %s", err))
} else {
api.Config.ResponseDebug <- debug
}
}
return resp, err
}
func encodeURLParams(baseURL string, queryParams map[string]interface{}) string {
u, _ := url.Parse(baseURL)
params := url.Values{}
for key, value := range queryParams {
switch value := value.(type) {
case string:
params.Add(key, value)
case int:
params.Add(key, strconv.Itoa(value))
}
}
u.RawQuery = params.Encode()
return u.String()
}