@@ -20,6 +20,7 @@ import (
20
20
21
21
"github.com/quay/clair/v4/httptransport"
22
22
"github.com/quay/clair/v4/internal/codec"
23
+ "github.com/quay/clair/v4/internal/httputil"
23
24
)
24
25
25
26
const (
@@ -63,15 +64,16 @@ func rt(ctx context.Context, ref string) (http.RoundTripper, error) {
63
64
type Client struct {
64
65
host * url.URL
65
66
client * http.Client
67
+ signer * httputil.Signer
66
68
67
69
mu sync.RWMutex
68
70
// TODO Back this on disk to minimize resubmissions.
69
71
validator map [string ]string
70
72
}
71
73
72
- func NewClient (c * http.Client , root string ) (* Client , error ) {
74
+ func NewClient (c * http.Client , root string , s * httputil. Signer ) (* Client , error ) {
73
75
if c == nil {
74
- c = http .DefaultClient
76
+ return nil , errors . New ( "programmer error: no http.Client provided" )
75
77
}
76
78
host , err := url .Parse (root )
77
79
if err != nil {
@@ -80,6 +82,7 @@ func NewClient(c *http.Client, root string) (*Client, error) {
80
82
return & Client {
81
83
host : host ,
82
84
client : c ,
85
+ signer : s ,
83
86
validator : make (map [string ]string ),
84
87
}, nil
85
88
}
@@ -117,7 +120,10 @@ func (c *Client) IndexReport(ctx context.Context, id claircore.Digest, m *clairc
117
120
Msg ("unable to construct index_report url" )
118
121
return err
119
122
}
120
- req = c .request (ctx , fp , http .MethodGet )
123
+ req , err = c .request (ctx , fp , http .MethodGet )
124
+ if err != nil {
125
+ return err
126
+ }
121
127
res , err = c .client .Do (req )
122
128
if err != nil {
123
129
zlog .Debug (ctx ).
@@ -163,7 +169,10 @@ func (c *Client) IndexReport(ctx context.Context, id claircore.Digest, m *clairc
163
169
return err
164
170
}
165
171
166
- req = c .request (ctx , ru , http .MethodPost )
172
+ req , err = c .request (ctx , ru , http .MethodPost )
173
+ if err != nil {
174
+ return err
175
+ }
167
176
req .Body = codec .JSONReader (m )
168
177
res , err = c .client .Do (req )
169
178
if err != nil {
@@ -241,7 +250,10 @@ func (c *Client) VulnerabilityReport(ctx context.Context, id claircore.Digest) (
241
250
Msg ("unable to construct vulnerability_report url" )
242
251
return nil , err
243
252
}
244
- req = c .request (ctx , u , http .MethodGet )
253
+ req , err = c .request (ctx , u , http .MethodGet )
254
+ if err != nil {
255
+ return nil , err
256
+ }
245
257
res , err = c .client .Do (req )
246
258
if err != nil {
247
259
zlog .Debug (ctx ).
@@ -286,7 +298,10 @@ func (c *Client) DeleteIndexReports(ctx context.Context, ds []claircore.Digest)
286
298
if err != nil {
287
299
return err
288
300
}
289
- req = c .request (ctx , u , http .MethodDelete )
301
+ req , err = c .request (ctx , u , http .MethodDelete )
302
+ if err != nil {
303
+ return err
304
+ }
290
305
291
306
req .Body = codec .JSONReader (ds )
292
307
res , err = c .client .Do (req )
@@ -311,21 +326,18 @@ func (c *Client) DeleteIndexReports(ctx context.Context, ds []claircore.Digest)
311
326
return nil
312
327
}
313
328
314
- func (c * Client ) request (ctx context.Context , u * url.URL , m string ) * http.Request {
315
- req := & http.Request {
316
- Method : m ,
317
- URL : u ,
318
- Proto : "HTTP/1.1" ,
319
- ProtoMajor : 1 ,
320
- ProtoMinor : 1 ,
321
- Header : make (http.Header ),
322
- Body : nil ,
323
- Host : u .Host ,
324
- }
325
- req = req .WithContext (ctx )
326
- req .Header .Set ("user-agent" , userAgent )
329
+ func (c * Client ) request (ctx context.Context , u * url.URL , m string ) (* http.Request , error ) {
330
+ req , err := httputil .NewRequestWithContext (ctx , m , u .String (), nil )
331
+ if err != nil {
332
+ return nil , err
333
+ }
327
334
if v := c .getValidator (ctx , u .EscapedPath ()); v != "" {
328
335
req .Header .Set ("if-none-match" , v )
329
336
}
330
- return req
337
+ if c .signer != nil {
338
+ if err := c .signer .Sign (ctx , req ); err != nil {
339
+ return nil , err
340
+ }
341
+ }
342
+ return req , nil
331
343
}
0 commit comments