66 "crypto/tls"
77 "encoding/json"
88 "errors"
9- "fmt"
109 "github.com/hashicorp/go-retryablehttp"
1110 "github.com/jmespath/go-jmespath"
1211 "github.com/spf13/cast"
@@ -17,6 +16,12 @@ import (
1716 "strings"
1817)
1918
19+ const (
20+ AuthorizationHeader = "Authorization"
21+ ContentTypeHeader = "Content-Type"
22+ ContentTypeJSON = "application/json"
23+ )
24+
2025type Common interface {
2126 TeamInterface
2227}
@@ -29,80 +34,54 @@ type Secure interface {
2934 Common
3035}
3136
32- type RequestFunc func (ctx context.Context , method string , url string , payload io.Reader ) (* http.Response , error )
33-
34- type Client struct {
35- config * config
36- httpClient * http.Client
37- DoRequest RequestFunc
38- }
39-
40- type config struct {
41- url string
42- token string
43- insecure bool
44- extraHeaders map [string ]string
37+ type Requester interface {
38+ Request (ctx context.Context , method string , url string , payload io.Reader ) (* http.Response , error )
4539}
4640
47- type ClientOption func (c * config )
48-
49- func WithURL (url string ) ClientOption {
50- return func (c * config ) {
51- c .url = url
52- }
41+ type Client struct {
42+ config * config
43+ requester Requester
5344}
5445
55- func WithToken (token string ) ClientOption {
56- return func (c * config ) {
57- c .token = token
46+ func (client * Client ) ErrorFromResponse (response * http.Response ) error {
47+ var data interface {}
48+ err := json .NewDecoder (response .Body ).Decode (& data )
49+ if err != nil {
50+ return errors .New (response .Status )
5851 }
59- }
6052
61- func WithInsecure ( insecure bool ) ClientOption {
62- return func ( c * config ) {
63- c . insecure = insecure
53+ search , err := jmespath . Search ( "[message, errors[].[reason, message]][][] | join(', ', @)" , data )
54+ if err != nil {
55+ return errors . New ( response . Status )
6456 }
65- }
6657
67- func WithExtraHeaders (headers map [string ]string ) ClientOption {
68- return func (c * config ) {
69- c .extraHeaders = headers
58+ if searchArray , ok := search .([]interface {}); ok {
59+ return errors .New (strings .Join (cast .ToStringSlice (searchArray ), ", " ))
7060 }
71- }
72-
73- func NewMonitor (opts ... ClientOption ) Monitor {
74- return newClient (opts ... )
75- }
7661
77- func NewSecure (opts ... ClientOption ) Secure {
78- return newClient (opts ... )
62+ return errors .New (cast .ToString (search ))
7963}
8064
81- func newClient (opts ... ClientOption ) * Client {
82- cfg := & config {}
83- for _ , opt := range opts {
84- opt (cfg )
85- }
86-
87- httpClient := retryablehttp .NewClient ()
88- transport := http .DefaultTransport .(* http.Transport ).Clone ()
89- transport .TLSClientConfig = & tls.Config {InsecureSkipVerify : cfg .insecure }
90- httpClient .HTTPClient = & http.Client {Transport : transport }
65+ func Unmarshal [T any ](data io.ReadCloser ) (T , error ) {
66+ var result T
9167
92- c := & Client {
93- config : cfg ,
94- httpClient : httpClient . StandardClient (),
68+ body , err := io . ReadAll ( data )
69+ if err != nil {
70+ return result , err
9571 }
9672
97- // default to sysdig request
98- c .DoRequest = c .doSysdigRequest
73+ err = json .Unmarshal (body , & result )
74+ return result , err
75+ }
9976
100- return c
77+ func Marshal [T any ](data T ) (io.Reader , error ) {
78+ payload , err := json .Marshal (data )
79+ return bytes .NewBuffer (payload ), err
10180}
10281
103- func ( client * Client ) request ( request * http.Request ) (* http.Response , error ) {
104- if client . config .extraHeaders != nil {
105- for key , value := range client . config .extraHeaders {
82+ func request ( httpClient * http. Client , cfg * config , request * http.Request ) (* http.Response , error ) {
83+ if cfg .extraHeaders != nil {
84+ for key , value := range cfg .extraHeaders {
10685 request .Header .Set (key , value )
10786 }
10887 }
@@ -113,7 +92,7 @@ func (client *Client) request(request *http.Request) (*http.Response, error) {
11392 }
11493
11594 log .Printf ("[DEBUG] %s" , string (out ))
116- response , err := client . httpClient .Do (request )
95+ response , err := httpClient .Do (request )
11796 if err != nil {
11897 log .Println (err .Error ())
11998 return response , err
@@ -127,45 +106,10 @@ func (client *Client) request(request *http.Request) (*http.Response, error) {
127106 return response , err
128107}
129108
130- func (client * Client ) doSysdigRequest (ctx context.Context , method string , url string , payload io.Reader ) (* http.Response , error ) {
131- request , err := http .NewRequest (method , url , payload )
132- if err != nil {
133- return nil , err
134- }
135-
136- request = request .WithContext (ctx )
137- request .Header .Set ("Authorization" , fmt .Sprintf ("Bearer %s" , client .config .token ))
138- request .Header .Set ("Content-Type" , "application/json" )
139-
140- return client .request (request )
141- }
142-
143- func (client * Client ) ErrorFromResponse (response * http.Response ) error {
144- var data interface {}
145- err := json .NewDecoder (response .Body ).Decode (& data )
146- if err != nil {
147- return errors .New (response .Status )
148- }
149-
150- search , err := jmespath .Search ("[message, errors[].[reason, message]][][] | join(', ', @)" , data )
151- if err != nil {
152- return errors .New (response .Status )
153- }
154-
155- if searchArray , ok := search .([]interface {}); ok {
156- return errors .New (strings .Join (cast .ToStringSlice (searchArray ), ", " ))
157- }
158-
159- return errors .New (cast .ToString (search ))
160- }
161-
162- func Unmarshal [T any ](body []byte ) (T , error ) {
163- var result T
164- err := json .Unmarshal (body , & result )
165- return result , err
166- }
167-
168- func Marshal [T any ](data T ) (io.Reader , error ) {
169- payload , err := json .Marshal (data )
170- return bytes .NewBuffer (payload ), err
109+ func newHTTPClient (cfg * config ) * http.Client {
110+ httpClient := retryablehttp .NewClient ()
111+ transport := http .DefaultTransport .(* http.Transport ).Clone ()
112+ transport .TLSClientConfig = & tls.Config {InsecureSkipVerify : cfg .insecure }
113+ httpClient .HTTPClient = & http.Client {Transport : transport }
114+ return httpClient .StandardClient ()
171115}
0 commit comments