go icon indicating copy to clipboard operation
go copied to clipboard

Allow for configuration of http.Client

Open arwineap opened this issue 3 months ago • 0 comments

Currently the http.Client is completely managed by the constructor , and is unexported preventing any further configuration of the client after initialization

However, it may be desirable to provide a customized client to the library in order to support additional features like:

  • custom timeouts
  • proxy configuration
  • instrumentation ( otel )

There's a couple methods to solve, each with their own pros and cons

With a breaking change we could inject the client into the constructor:

func NewClient(apiKey string, client *http.Client) (Client, error) {
[...]

At the risk of a user modifying the client midflight, we could export the client field:

type Client struct {
	C *http.Client // http client
	e string       // api endpoint
	k string       // api key
}

To maintain backwards compatibility, we could add variadic, functional parameters:

func NewClient(apiKey string, opts ...Option) (Client, error) {

Which could look like this:

client, _ := NewClient(apiKey, WithHttpClient(&http.Client{}))

Given that apiKey is optional, it may be interesting to move to a new constructor signature to allow it to be omitted:

client, _ := NewClient(WithHttpClient(&http.Client{}))
client2 := NewClient(WithApiKey("XXXXX"), WithHttpClient(&http.Client{}))

Let me know what you think, and if I can help

arwineap avatar May 08 '24 14:05 arwineap