Packages
timber
1.1.10
3.1.2
3.1.1
3.1.0
3.0.0
3.0.0-alpha.3
3.0.0-alpha.2
3.0.0-alpha.1
2.8.4
2.8.3
2.8.2
2.8.1
2.8.0
2.7.0
2.6.1
2.6.0
2.5.6
2.5.5
2.5.4
2.5.3
2.5.2
2.5.1
2.5.0
2.4.5
2.4.4
2.4.3
2.4.2
2.4.1
2.4.0
2.3.4
2.3.3
2.3.1
2.3.0
2.2.1
2.2.0
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.2
2.0.1
2.0.0
2.0.0-rc7
2.0.0-rc6
2.0.0-rc5
2.0.0-rc4
2.0.0-rc3
2.0.0-rc2
2.0.0-rc1
1.1.18
1.1.17
1.1.16
1.1.15
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
🌲 Great Elixir Logging Made Easy. Official Timber.io Integration.
Current section
Files
Jump to
Current section
Files
lib/timber/transports/http/hackney_client.ex
if Code.ensure_loaded?(:hackney) do
defmodule Timber.Transports.HTTP.HackneyClient do
@moduledoc """
An efficient HTTP client that leverages hackney, keep alive connections, and connection
pools to communicate with the Timber API.
## Configuration
```elixir
config :timber, :hackney_client,
request_options: [
connect_timeout: 5_000, # 5 seconds, timeout to connect
recv_timeout: 20_000 # 20 seconds, timeout to receive a response
]
```
* `:request_options` - Passed to `:hackney.request(method, url, headers, body, request_options)`.
"""
alias Timber.Transports.HTTP.Client
@behaviour Client
@default_request_options [
connect_timeout: 5_000, # 5 seconds, timeout to connect
recv_timeout: 10_000 # 10 seconds, timeout to receive a response
]
@doc """
Issues a HTTP request via hackney.
"""
@spec async_request(Client.method, Client.url, Client.headers, Client.body) :: Client.result
def async_request(method, url, headers, body) do
req_headers = Enum.map(headers, &(&1))
req_opts =
get_request_options()
|> Keyword.merge([async: true])
:hackney.request(method, url, req_headers, body, req_opts)
end
@doc """
Takes a reference to an async request and waits for it to complete.
"""
@spec wait_on_request(reference) :: :ok
def wait_on_request(ref) do
receive do
{:hackney_response, ^ref, :done} -> :ok
_else -> wait_on_request(ref)
end
end
#
# Config
#
@spec config :: Keyword.t
defp config, do: Application.get_env(:timber, :hackney_client, [])
@spec get_request_options() :: Keyword.t
defp get_request_options(), do: Keyword.get(config(), :request_options, @default_request_options)
end
end