defmodule EmbedbaseEx.ExHttp do @retries 5 @default_user_agent "chat_programming" 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, token, retries) do url |> HTTPoison.get( [ {"User-Agent", @default_user_agent}, {"authorization", "Bearer #{token}"} ], 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, token, retries - 1) end 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, _token, retries) when retries == 0 do {:error, "POST retires #{@retries} times and not success"} end def http_post(url, data, token, retries) do body = Poison.encode!(data) url |> HTTPoison.post( body, [ {"User-Agent", @default_user_agent}, {"Content-Type", "application/json"}, {"authorization", "Bearer #{token}"} ], hackney: [headers: [{"User-Agent", @default_user_agent}]] ) |> handle_response() |> case do {:ok, body} -> {:ok, body} {:error, 404} -> {:error, 404} {:error, _} -> Process.sleep(1000) http_post(url, data, token, retries - 1) end 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(1000) http_post(url, data, retries - 1) end end def http_delete(url) do http_get(url, @retries) end def http_delete(_url, retries) when retries == 0 do {:error, "GET retires #{@retries} times and not success"} end def http_delete(url, token, retries) do url |> HTTPoison.delete( [ {"User-Agent", @default_user_agent}, {"authorization", "Bearer #{token}"} ], hackney: [ headers: [ {"User-Agent", @default_user_agent} ] ] ) |> handle_response() |> case do {:ok, body} -> {:ok, body} {:error, 404} -> {:error, 404} {:error, _} -> Process.sleep(500) http_delete(url, token, retries - 1) end end def http_delete(url, data, token, retries) do body = Poison.encode!(data) # # headers = Keyword.put_new(headers, :method, :delete) # options = [headers: [ # {"User-Agent", @default_user_agent}, # {"authorization", "Bearer #{token}"} # ]] HTTPoison.request( :delete, url, body, [ {"User-Agent", @default_user_agent}, {"Content-Type", "application/json"}, {"authorization", "Bearer #{token}"} ], hackney: [headers: [{"User-Agent", @default_user_agent}]] ) |> handle_response() |> case do {:ok, body} -> {:ok, body} {:error, 404} -> {:error, 404} {:error, _} -> Process.sleep(500) http_delete(url, data, token, retries - 1) end end def http_delete(url, retries) do url |> HTTPoison.delete([{"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_delete(url, 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} -> {:ok, body} # 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