Packages
avrora
0.11.0
0.30.2
0.30.1
0.30.0
0.29.2
0.29.1
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.2
0.24.1
0.24.0
0.23.0
0.22.0
0.21.1
0.21.0
0.20.0
0.19.0
0.18.1
0.18.0
0.17.0
0.16.0
0.15.0
0.14.1
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.1
0.9.0
0.8.1
0.8.0
0.7.1
0.7.0
0.6.0
0.5.1
0.5.0
0.4.0
0.3.1
0.3.0
0.2.2
0.2.1
0.2.0
0.1.1-beta
0.1.0-beta
An Elixir library for working with Avro messages conveniently. It supports local schema files and Confluent® schema registry.
Current section
Files
Jump to
Current section
Files
lib/avrora/http_client.ex
defmodule Avrora.HTTPClient do
@moduledoc """
Minimal HTTP client using built-in Erlang `httpc` library.
"""
@callback get(String.t(), keyword(String.t())) :: {:ok, map()} | {:error, term()}
@callback post(String.t(), String.t(), keyword(String.t())) :: {:ok, map()} | {:error, term()}
@doc false
@spec get(String.t(), keyword(String.t())) :: {:ok, map()} | {:error, term()}
def get(url, options \\ []) do
with {:ok, headers} <- extract_headers(options),
{:ok, {{_, status, _}, _, body}} <- :httpc.request(:get, {'#{url}', headers}, [], []) do
handle(status, body)
end
end
@doc false
@spec post(String.t(), String.t(), keyword(String.t())) :: {:ok, map()} | {:error, term()}
def post(url, payload, options \\ []) when is_binary(payload) do
with {:ok, body} <- Jason.encode(%{"schema" => payload}),
{:ok, content_type} <- Keyword.fetch(options, :content_type),
{:ok, headers} <- extract_headers(options),
{:ok, {{_, status, _}, _, body}} <-
:httpc.request(:post, {'#{url}', headers, [content_type], body}, [], []) do
handle(status, body)
end
end
defp extract_headers(options) do
case Keyword.get(options, :authorization) do
nil -> {:ok, []}
credentials -> {:ok, [{'Authorization', '#{credentials}'}]}
end
end
defp handle(200 = _status, body), do: Jason.decode(body)
defp handle(status, body) do
case Jason.decode(body) do
{:ok, reason} -> {:error, reason}
{:error, _} -> {:error, {status, body}}
end
end
end