Current section
Files
Jump to
Current section
Files
lib/tehama_client/tehama_client_http.ex
defmodule TehamaClientHTTP do
@moduledoc false
use HTTPoison.Base
require Logger
def post_without_auth(path, body) do
post(path, Poison.encode!(body), headers())
end
def get_with_auth(url, token) do
get(url, headers(token)) |> handle_response()
end
def process_url(url) do
base_url = TehamaClient.Config.api_base_url()
Logger.debug("Performing URL: #{base_url <> url}")
base_url <> url
end
def process_response(%HTTPoison.Response{headers: headers, body: body} = response) do
parsed_body =
headers
|> find_header("content-encoding")
|> decompress_body(body)
|> parse_json_body()
%HTTPoison.Response{response | body: parsed_body}
end
defp decompress_body(nil, body), do: body
defp decompress_body("identity", body), do: body
defp decompress_body("gzip", <<31, 139, 8, _::binary>> = body), do: :zlib.gunzip(body)
defp decompress_body("gzip", body), do: body
defp decompress_body("x-gzip", <<31, 139, 8, _::binary>> = body), do: :zlib.gunzip(body)
defp decompress_body("x-gzip", body), do: body
defp decompress_body("deflate", body), do: :zlib.unzip(body)
defp decompress_body(other, body) do
Logger.error("No support for decompression of body using '#{other}' algorithm.")
body
end
defp parse_json_body(body) do
body
|> Poison.decode!()
|> format_object()
end
defp find_header(headers, header_name) do
Enum.find_value(
headers,
fn {name, value} ->
name =~ ~r/#{header_name}/i && String.downcase(value)
end
)
end
defp format_object(list) when is_list(list) do
Enum.map(list, &format_object/1)
end
defp format_object(obj) do
obj
# |> Map.take(@expected_fields)
|> Enum.map(fn {k, v} -> {String.to_atom(k), v} end)
|> Map.new()
end
defp handle_response(resp) do
case resp do
{:ok, %{body: json, status_code: 200}} ->
{:ok, json}
{:ok, %{body: error, status_code: 422}} ->
{:error, error}
{:ok, %{body: error, status_code: 403}} ->
{:error, error}
end
end
defp headers() do
[
{:"content-type", "application/json"}
]
end
defp headers(token) do
%{
"content-type": "application/json",
"X-Authorization": token
}
end
end