Current section
Files
Jump to
Current section
Files
lib/adapters/http_poison.ex
if Code.ensure_loaded?(HTTPoison) do
defmodule HttpBuilder.Adapters.HTTPosion do
alias HttpBuilder.HttpRequest
@behaviour HttpBuilder.Adapter
@spec send(HttpRequest) :: {:ok, term } | { :error, String.t }
def send(%{retry: retries} = request) do
options = create_options(request)
converted_request =
HTTPoison.request(
request.method,
request.host <> request.path,
format_body(request.body),
request.headers,
options
)
case converted_request do
{:ok, %{status_code: code, body: body}} when code < 400 and code >= 200 ->
{:ok, Poison.decode!(body) }
{:ok, %{status_code: status }} when 500 < status and retries > 0 ->
send(%{ request | retry: retries - 1 })
{:ok, %{status_code: status, body: body }} ->
{:error, %{status_code: status, body: body }}
{:error, %HTTPoison.Error{reason: reason}} ->
{:error, reason }
other ->
{:error, "Could not complete request: #{inspect(other)}" }
end
end
def format_body({atom, body}), do: {atom, body}
def format_body(body), do: Poison.encode!(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: []
Enum.concat(request.options, [timeout_options, params_options])
end
end
end