@@ -16,7 +16,7 @@ import (
1616 git "github.com/go-git/go-git/v5"
1717)
1818
19- var userAgent string
19+ var baseUserAgent string
2020
2121type Factory struct {
2222 Config * config.Config
@@ -35,9 +35,10 @@ type Factory struct {
3535type FactoryOpt func (* factoryConfig )
3636
3737type factoryConfig struct {
38- debug bool
39- orgOverride string
40- transport http.RoundTripper
38+ debug bool
39+ orgOverride string
40+ transport http.RoundTripper
41+ userAgentSuffix string
4142}
4243
4344// WithDebug enables debug output for REST API calls
@@ -64,6 +65,13 @@ func WithTransport(t http.RoundTripper) FactoryOpt {
6465 }
6566}
6667
68+ // WithUserAgentSuffix appends an extra product token to the default user agent.
69+ func WithUserAgentSuffix (suffix string ) FactoryOpt {
70+ return func (c * factoryConfig ) {
71+ c .userAgentSuffix = suffix
72+ }
73+ }
74+
6775// debugTransport wraps an http.RoundTripper and logs requests/responses with sensitive headers redacted
6876type debugTransport struct {
6977 transport http.RoundTripper
@@ -129,17 +137,25 @@ func redactHeaders(headers http.Header) {
129137}
130138
131139type gqlHTTPClient struct {
132- client * http.Client
133- token string
140+ client * http.Client
141+ token string
142+ userAgent string
134143}
135144
136145func init () {
137- userAgent = fmt .Sprintf ("%s buildkite-cli/%s" , buildkite .DefaultUserAgent , version .Version )
146+ baseUserAgent = fmt .Sprintf ("%s buildkite-cli/%s" , buildkite .DefaultUserAgent , version .Version )
147+ }
148+
149+ func buildUserAgent (suffix string ) string {
150+ if suffix == "" {
151+ return baseUserAgent
152+ }
153+ return fmt .Sprintf ("%s %s" , baseUserAgent , suffix )
138154}
139155
140156func (a * gqlHTTPClient ) Do (req * http.Request ) (* http.Response , error ) {
141157 req .Header .Set ("Authorization" , fmt .Sprintf ("Bearer %s" , a .token ))
142- req .Header .Set ("User-Agent" , userAgent )
158+ req .Header .Set ("User-Agent" , a . userAgent )
143159 return a .client .Do (req )
144160}
145161
@@ -165,6 +181,8 @@ func New(opts ...FactoryOpt) (*Factory, error) {
165181 }
166182 }
167183
184+ userAgent := buildUserAgent (cfg .userAgentSuffix )
185+
168186 // Build client options
169187 clientOpts := []buildkite.ClientOpt {
170188 buildkite .WithBaseURL (conf .RESTAPIEndpoint ()),
@@ -188,7 +206,7 @@ func New(opts ...FactoryOpt) (*Factory, error) {
188206 return nil , fmt .Errorf ("creating buildkite client: %w" , err )
189207 }
190208
191- graphqlHTTPClient := & gqlHTTPClient {client : http .DefaultClient , token : token }
209+ graphqlHTTPClient := & gqlHTTPClient {client : http .DefaultClient , token : token , userAgent : userAgent }
192210
193211 return & Factory {
194212 Config : conf ,
0 commit comments