defmodule LoggerTelegramBackend.HTTPClient do
@moduledoc """
Specifies the API for using a custom HTTP Client.
The default HTTP client is `LoggerTelegramBackend.HTTPClient.Finch`.
To configure a different HTTP client, implement the `LoggerTelegramBackend.HTTPClient` behaviour
and change the `:client` configuration:
config :logger, LoggerTelegramBackend,
client: MyHTTPClient
## Example
A client implementation based on `:hackney` could look like this:
defmodule MyHTTPClient do
@behaviour LoggerTelegramBackend.HTTPClient
@hackney_pool_name :logger_telegram_backend_pool
@impl true
def child_spec(opts) do
:hackney_pool.child_spec(@hackney_pool_name, opts)
end
@impl true
def request(method, url, headers, body, opts) do
opts = Keyword.merge(opts, pool: @hackney_pool_name) ++ [:with_body]
case :hackney.request(method, url, headers, body, opts) do
{:ok, _status, _headers, _body} = result -> result
{:error, _reason} = error -> error
end
end
end
"""
@moduledoc since: "3.0.0"
@typedoc """
HTTP request method.
"""
@type method :: atom
@typedoc """
HTTP request URL.
"""
@type url :: String.t()
@typedoc """
HTTP response status.
"""
@type status :: 100..599
@typedoc """
HTTP request or response headers.
"""
@type headers :: [{String.t(), String.t()}]
@typedoc """
HTTP request or response body.
"""
@type body :: binary()
@typedoc """
HTTP request options (set via `:client_request_opts`).
"""
@type req_opts :: Keyword.t()
@typedoc """
Options to configure the pool (set via `:client_pool_opts`).
"""
@type pool_opts :: Keyword.t()
@doc """
Should return a **child specification** to start the HTTP client or `nil`.
For example, this can start a pool of HTTP connections dedicated to LoggerTelegramBackend.
"""
@callback child_spec(pool_opts) :: Supervisor.child_spec() | nil
@doc """
Should make an HTTP request to `url` with the given `method`, `headers`, `body` and `req_opts`.
"""
@callback request(method, url, headers, body, req_opts) ::
{:ok, status, headers, body} | {:error, term}
end