defmodule Utils.ExHttp do @retries 5 @default_user_agent "web3_aptos_ex" require Logger def http_get(url) do http_get(url, @retries) end def http_get(_url, retries) when retries == 0 do {:error, "GET retires #{@retries} times and not success"} end def http_get(url, retries) do url |> HTTPoison.get([{"User-Agent", @default_user_agent}], hackney: [headers: [{"User-Agent", @default_user_agent}]] ) |> handle_response() |> case do {:ok, body} -> {:ok, body} {:error, 404} -> {:error, 404} {:error, _} -> Process.sleep(500) http_get(url, retries - 1) end end def http_post(url, data) do http_post(url, data, @retries) end def http_post(_url, _data, retries) when retries == 0 do {:error, "POST retires #{@retries} times and not success"} end def http_post(url, data, retries) do body = Poison.encode!(data) url |> HTTPoison.post( body, [{"User-Agent", @default_user_agent}, {"Content-Type", "application/json"}], hackney: [headers: [{"User-Agent", @default_user_agent}]] ) |> handle_response() |> case do {:ok, body} -> {:ok, body} {:error, 404} -> {:error, 404} {:error, _} -> Process.sleep(500) http_post(url, data, retries - 1) end end # normal defp handle_response({:ok, %HTTPoison.Response{status_code: status_code, body: body}}) when status_code in 200..299 do case Poison.decode(body) do {:ok, json_body} -> {:ok, ExStructTranslator.to_atom_struct(json_body)} {:error, payload} -> Logger.error("Reason: #{inspect(payload)}") {:error, :network_error} end end defp handle_response({:ok, %HTTPoison.Response{status_code: 404, body: _}}) do Logger.error("Reason: 404") {:error, 404} end # else defp handle_response({:ok, %HTTPoison.Response{status_code: status_code, body: _}}) do Logger.error("Reason: #{status_code} ") {:error, :network_error} end defp handle_response(error) do Logger.error("Reason: other_error") error end end