-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuilder.go
More file actions
114 lines (100 loc) · 3.3 KB
/
builder.go
File metadata and controls
114 lines (100 loc) · 3.3 KB
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
package nicehttp
import (
"net/http"
"time"
)
// NiceTransportBuilder is a builder used to create a NiceTransport
type NiceTransportBuilder struct {
defaultHeaders http.Header
attemptTimeout time.Duration
maxAttempts int
downstreamTransport http.RoundTripper
limiter *Limiter
}
// NewNiceTransportBuilder creates a NewNiceTransportBuilder
func NewNiceTransportBuilder() *NiceTransportBuilder {
return &NiceTransportBuilder{
defaultHeaders: map[string][]string{"User-Agent": {DefaultUserAgent}},
}
}
// Set sets values of the builder from an existing NiceTransport
func (b *NiceTransportBuilder) Set(settings *NiceTransport) *NiceTransportBuilder {
b.SetDefaultHeaders(settings.defaultHeaders)
b.SetMaxAttempts(settings.maxAttempts)
b.SetDownstreamTransport(settings.downstreamTransport)
b.SetAttemptTimeout(settings.attemptTimeout)
b.limiter = nil
if settings.limiter != nil {
b.limiter = settings.limiter.Clone()
}
return b
}
// SetDefaultHeaders sets headers that will be by default included
// in each request. If this is called multiple times, then existing
// keys will be overwritten.
func (b *NiceTransportBuilder) SetDefaultHeaders(headers http.Header) *NiceTransportBuilder {
for key, values := range headers {
b.defaultHeaders.Del(key)
if len(values) == 0 {
continue
}
for _, value := range values {
b.defaultHeaders.Add(key, value)
}
}
return b
}
// SetLimiterBackoff sets the backoff for the limiter.
// If this is not set, the DefaultExponentialBackoff will be used
func (b *NiceTransportBuilder) SetLimiterBackoff(backoff Backoff) *NiceTransportBuilder {
b.limiter = &Limiter{
backoff: backoff.Clone(),
}
return b
}
// SetAttemptTimeout sets timeout for a single connection attempt,
// after which the request will be retried. This is part of the total
// request time, which is controlled by the http.Client timeout.
// A value of 0 means no timeout.
func (b *NiceTransportBuilder) SetAttemptTimeout(timeout time.Duration) *NiceTransportBuilder {
b.attemptTimeout = timeout
return b
}
// SetUserAgent sets the User-Agent in default headers
func (b *NiceTransportBuilder) SetUserAgent(ua string) *NiceTransportBuilder {
b.defaultHeaders.Set("User-Agent", ua)
return b
}
// SetMaxAttempts sets the maximum number of request attempts that will be made
func (b *NiceTransportBuilder) SetMaxAttempts(n int) *NiceTransportBuilder {
b.maxAttempts = n
return b
}
// SetDownstreamTransport sets the downstream transport to be called by RoundTrip
func (b *NiceTransportBuilder) SetDownstreamTransport(rt http.RoundTripper) *NiceTransportBuilder {
b.downstreamTransport = rt
return b
}
// Build creates a NiceTransport with settings given previously combined with defaults.
func (b *NiceTransportBuilder) Build() (*NiceTransport, error) {
// Set defaults
if b.maxAttempts <= 0 {
b.maxAttempts = 10
}
if b.downstreamTransport == nil {
transport := http.DefaultTransport.(*http.Transport).Clone()
b.downstreamTransport = transport
}
if b.limiter == nil {
b.limiter = &Limiter{
backoff: DefaultExponentialBackoff.Clone(),
}
}
return &NiceTransport{
defaultHeaders: b.defaultHeaders,
maxAttempts: b.maxAttempts,
attemptTimeout: b.attemptTimeout,
limiter: b.limiter,
downstreamTransport: b.downstreamTransport,
}, nil
}