1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
defmodule ExOvh.Request do
@moduledoc :false
# Public
@spec request(HTTPipe.Conn.t | HTTPipe.Request.t, atom) :: {:ok, HTTPipe.Conn.t} | {:error, HTTPipe.Conn.t}
def request(%HTTPipe.Request{} = request, client) do
Map.put(HTTPipe.Conn.new(), :request, request)
|> request(client)
end
def request(%HTTPipe.Conn{} = conn, client) do
conn = apply_transformations(conn, client)
case HTTPipe.Conn.execute(conn) do
{:ok, conn} ->
body = parse_body(conn.response)
resp = Map.put(conn.response, :body, body)
conn = Map.put(conn, :response, resp)
if resp.status_code >= 100 and resp.status_code < 400 do
{:ok, conn}
else
{:error, conn}
end
{:error, conn} -> {:error, conn}
end
end
@doc :false
def apply_transformations(conn, client) do
conn =
unless (:url in Map.get(conn, :completed_transformations, [])) do
ExOvh.Transformation.Url.apply(conn, client)
else
conn
end
conn =
unless (:body in Map.get(conn, :completed_transformations, [])) do
ExOvh.Transformation.Body.apply(conn, "")
else
conn
end
conn =
unless (:hackney_options in Map.get(conn, :completed_transformations, [])) do
ExOvh.Transformation.HackneyOptions.apply(conn, client)
else
conn
end
unless (:auth in Map.get(conn, :completed_transformations, [])) do
ExOvh.Transformation.Auth.apply(conn, client)
else
conn
end
end
# private
defp parse_body(resp) do
try do
resp.body |> Poison.decode!()
rescue
_ ->
resp.body
end
end
end