mirror of
https://github.com/pomerium/pomerium.git
synced 2025-04-30 02:46:30 +02:00
54 lines
1.3 KiB
Go
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)
|
|
}
|