| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- package cloudflare
- import (
- "net/http"
- "time"
- "golang.org/x/time/rate"
- )
- // Option is a functional option for configuring the API client.
- type Option func(*API) error
- // HTTPClient accepts a custom *http.Client for making API calls.
- func HTTPClient(client *http.Client) Option {
- return func(api *API) error {
- api.httpClient = client
- return nil
- }
- }
- // Headers allows you to set custom HTTP headers when making API calls (e.g. for
- // satisfying HTTP proxies, or for debugging).
- func Headers(headers http.Header) Option {
- return func(api *API) error {
- api.headers = headers
- return nil
- }
- }
- // UsingAccount allows you to apply account-level changes (Load Balancing,
- // Railguns) to an account instead.
- func UsingAccount(accountID string) Option {
- return func(api *API) error {
- api.AccountID = accountID
- return nil
- }
- }
- // UsingRateLimit applies a non-default rate limit to client API requests
- // If not specified the default of 4rps will be applied
- func UsingRateLimit(rps float64) Option {
- return func(api *API) error {
- // because ratelimiter doesnt do any windowing
- // setting burst makes it difficult to enforce a fixed rate
- // so setting it equal to 1 this effectively disables bursting
- // this doesn't check for sensible values, ultimately the api will enforce that the value is ok
- api.rateLimiter = rate.NewLimiter(rate.Limit(rps), 1)
- return nil
- }
- }
- // UsingRetryPolicy applies a non-default number of retries and min/max retry delays
- // This will be used when the client exponentially backs off after errored requests
- func UsingRetryPolicy(maxRetries int, minRetryDelaySecs int, maxRetryDelaySecs int) Option {
- // seconds is very granular for a minimum delay - but this is only in case of failure
- return func(api *API) error {
- api.retryPolicy = RetryPolicy{
- MaxRetries: maxRetries,
- MinRetryDelay: time.Duration(minRetryDelaySecs) * time.Second,
- MaxRetryDelay: time.Duration(maxRetryDelaySecs) * time.Second,
- }
- return nil
- }
- }
- // UsingLogger can be set if you want to get log output from this API instance
- // By default no log output is emitted
- func UsingLogger(logger Logger) Option {
- return func(api *API) error {
- api.logger = logger
- return nil
- }
- }
- // UserAgent can be set if you want to send a software name and version for HTTP access logs.
- // It is recommended to set it in order to help future Customer Support diagnostics
- // and prevent collateral damage by sharing generic User-Agent string with abusive users.
- // E.g. "my-software/1.2.3". By default generic Go User-Agent is used.
- func UserAgent(userAgent string) Option {
- return func(api *API) error {
- api.UserAgent = userAgent
- return nil
- }
- }
- // parseOptions parses the supplied options functions and returns a configured
- // *API instance.
- func (api *API) parseOptions(opts ...Option) error {
- // Range over each options function and apply it to our API type to
- // configure it. Options functions are applied in order, with any
- // conflicting options overriding earlier calls.
- for _, option := range opts {
- err := option(api)
- if err != nil {
- return err
- }
- }
- return nil
- }
|