pomerium/pkg/zero/cluster/client.go
2024-04-19 11:33:43 -04:00

54 lines
1.3 KiB
Go

// Package cluster is an API client for the cluster service
package cluster
import (
"context"
"fmt"
"net/http"
"time"
"github.com/pomerium/pomerium/internal/version"
)
const (
defaultMinTokenTTL = time.Minute * 5
)
var userAgent = version.UserAgent()
type client struct {
tokenProvider TokenProviderFn
httpClient *http.Client
minTokenTTL time.Duration
}
// TokenProviderFn is a function that returns a token that is expected to be valid for at least minTTL
type TokenProviderFn func(ctx context.Context, minTTL time.Duration) (string, error)
// NewAuthorizedClient creates a new HTTP client that will automatically add an authorization header
func NewAuthorizedClient(
endpoint string,
tokenProvider TokenProviderFn,
httpClient *http.Client,
) (ClientWithResponsesInterface, error) {
c := &client{
minTokenTTL: defaultMinTokenTTL,
httpClient: httpClient,
}
c.tokenProvider = tokenProvider
return NewClientWithResponses(endpoint, WithHTTPClient(c))
}
func (c *client) Do(req *http.Request) (*http.Response, error) {
ctx := req.Context()
token, err := c.tokenProvider(ctx, c.minTokenTTL)
if err != nil {
return nil, fmt.Errorf("error getting token: %w", err)
}
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("User-Agent", userAgent)
return c.httpClient.Do(req)
}