Current section

Files

Jump to
http_builder lib adapters httpoison.ex
Raw

lib/adapters/httpoison.ex

if Code.ensure_loaded?(HTTPoison) do
defmodule HttpBuilder.Adapters.HTTPoison do
alias HttpBuilder.HttpRequest
@moduledoc """
An adapter for using HTTPoison. Expects a JSON parser to be
included in the HTTPBuilder configuration for encoding requests.
Returns `HTTPoison` structs as responses.
"""
@behaviour HttpBuilder.Adapter
@impl true
@spec send(HttpRequest.t) :: HttpBuilder.Adapter.result
@doc """
Sends a `HttpRequest`
"""
def send(request), do: request |> format_request() |> do_send()
defp format_request(request) do
%{
options: create_options(request),
method: request.method,
uri: request.host <> request.path,
body: format_body(request),
headers: request.headers,
}
end
defp format_body(%{ body: nil }), do: ""
defp format_body(%{ body: {:other, body} }), do: body
defp format_body(%{ body: {:string, body} }), do: body
defp format_body(%{ body: {:json, body} } = request), do: request.json_parser.encode!(body)
defp format_body(%{ body: {atom, body} }), do: {atom, body}
defp create_options(request) do
timeout_options = [
timeout: request.req_timeout,
recv_timeout: request.rec_timeout,
]
params_options = if length(request.query_params) != 0,
do: [params: request.query_params], else: []
params_options ++ timeout_options ++ request.options
end
defp do_send(request) do
HTTPoison.request(
request.method,
request.uri,
request.body,
request.headers,
request.options
)
end
end
end