-
Notifications
You must be signed in to change notification settings - Fork 9
/
request_options.go
71 lines (59 loc) · 1.75 KB
/
request_options.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
package recurly
import (
"net/http"
)
// RequestOptions contains additional request parameters for the API client
type RequestOptions struct {
// IdempotencyKey used to prevent duplicate requests
IdempotencyKey string `json:"-"`
// Header contains additional request headers for unique requests
Header http.Header `json:"-"`
}
func (o *RequestOptions) clone() *RequestOptions {
clone := &RequestOptions{}
clone.Header = o.Header.Clone()
clone.IdempotencyKey = o.IdempotencyKey
return clone
}
// Option allows for customizations to a request.
type Option func(o *RequestOptions)
// NewRequestOptions will create a new RequestOptions with the passed Options applied to it.
func NewRequestOptions(opts ...Option) *RequestOptions {
o := &RequestOptions{}
return o.ApplyOptions(opts...)
}
// ApplyOptions will apply the passed Options to the RequestOptions.
func (o *RequestOptions) ApplyOptions(opts ...Option) *RequestOptions {
cOpts := o.clone()
for _, opt := range opts {
opt(cOpts)
}
return cOpts
}
// WithHeader provides the capability to add custom headers to an operation.
func WithHeader(h http.Header) Option {
return func(o *RequestOptions) {
o.Header = h
}
}
// WithIdempotencyKey provides the capability to add an Idempotency Key to an operation.
func WithIdempotencyKey(k string) Option {
return func(o *RequestOptions) {
o.IdempotencyKey = k
}
}
type OptionsApplier interface {
applyOptions(req *http.Request) *http.Request
}
func (o *RequestOptions) applyOptions(req *http.Request) *http.Request {
for key, v := range o.Header {
for _, value := range v {
req.Header.Set(key, value)
}
}
// TODO: generate an idempotency key if missing?
if o.IdempotencyKey != "" {
req.Header.Add("Idempotency-Key", o.IdempotencyKey)
}
return req
}