client/internal/http/http.go (39 lines of code) (raw):
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
package http
import (
"fmt"
"net/http"
"time"
"github.com/Azure/aks-secure-tls-bootstrap/client/internal/build"
"github.com/hashicorp/go-retryablehttp"
"go.uber.org/zap"
)
const (
userAgentHeaderKey = "User-Agent"
)
// GetUserAgentValue returns the common User-Agent header value used in all RPCs and HTTP calls.
func GetUserAgentValue() string {
return fmt.Sprintf("aks-secure-tls-bootstrap-client/%s", build.GetVersion())
}
// NewClient returns an http.Client shimed into a *retryablehttp.Client with a custom transport.
func NewClient(logger *zap.Logger) *http.Client {
return NewRetryableClient(logger).StandardClient()
}
// NewRetryableClient returns a *retryablehttp.Client with a custom transport.
func NewRetryableClient(logger *zap.Logger) *retryablehttp.Client {
c := retryablehttp.NewClient()
c.RetryMax = 5
c.RetryWaitMin = 300 * time.Millisecond
c.RetryWaitMax = 3 * time.Second
transport := c.HTTPClient.Transport
c.HTTPClient.Transport = &customTransport{
base: transport,
}
c.Logger = &leveledLoggerShim{
logger: logger,
}
return c
}
type customTransport struct {
base http.RoundTripper
}
func (t *customTransport) RoundTrip(req *http.Request) (*http.Response, error) {
req.Header.Set(userAgentHeaderKey, GetUserAgentValue())
return t.base.RoundTrip(req)
}