-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathdigdag.go
140 lines (115 loc) · 2.64 KB
/
digdag.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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package digdag
import (
"encoding/json"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"net/http/httputil"
"net/url"
"path"
"runtime"
)
const (
defaultBaseURL = "http://localhost:65432"
version = "v0.1.1" // client-version
)
// Client is the api client for digdag-server
type Client struct {
BaseURL *url.URL
HTTPClient *http.Client
UserAgent string
CustomHeaders http.Header
Verbose bool
}
// RequestOpts is the list of options to pass to the request
type RequestOpts struct {
Params map[string]string
// Headers map[string]string
Body io.Reader
}
// default UserAgent
var defaultUserAgent = fmt.Sprintf("DigdagGoClient/%s (%s)", version, runtime.Version())
// NewClient return new client for digdag
func NewClient(urlStr string, verbose bool) (*Client, error) {
if urlStr == "" {
// Set default
urlStr = defaultBaseURL
}
parsedURL, err := url.Parse(urlStr)
if err != nil {
return nil, err
}
client := &Client{
BaseURL: parsedURL,
HTTPClient: &http.Client{},
UserAgent: defaultUserAgent,
CustomHeaders: http.Header{},
Verbose: verbose,
}
return client, err
}
// NewRequest request to digdag-server
func (c *Client) NewRequest(method, spath string, ro *RequestOpts) (resp *http.Response, err error) {
u := *c.BaseURL
u.Path = path.Join(c.BaseURL.Path, spath)
if ro == nil {
ro = new(RequestOpts)
}
// Add query params
var params = make(url.Values)
for k, v := range ro.Params {
params.Add(k, v)
}
u.RawQuery = params.Encode()
req, err := http.NewRequest(method, u.String(), ro.Body)
if err != nil {
return nil, err
}
// Set headers
if ro.Body != nil {
req.Header.Set("Content-Type", "application/json")
}
req.Header.Set("User-Agent", c.UserAgent)
// Set custom headers
for header, values := range c.CustomHeaders {
for _, v := range values {
req.Header.Set(header, v)
}
}
if c.Verbose {
dump, err := httputil.DumpRequestOut(req, true)
if err == nil {
log.Printf("%s", dump)
}
}
client := c.HTTPClient
resp, err = client.Do(req)
if err != nil {
return nil, err
}
if c.Verbose {
dump, err := httputil.DumpResponse(resp, true)
if err == nil {
log.Printf("%s", dump)
}
}
if resp.StatusCode < 200 || resp.StatusCode >= 400 {
return resp, fmt.Errorf("Failed to request: %s", resp.Status)
}
return resp, nil
}
func decodeBody(resp *http.Response, out interface{}) error {
defer resp.Body.Close()
decoder := json.NewDecoder(resp.Body)
return decoder.Decode(out)
}
func respToString(resp *http.Response) (string, error) {
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", err
}
return string(body), nil
}