Packages
avrora
0.1.1-beta
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/aurora/http_client.ex
defmodule Avrora.HttpClient do
@moduledoc """
Minimalistic HTTP client with a get/post functionality and built-in
JSON encode/decode behaviour.
"""
@callback get(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()) :: {:ok, map()} | {:error, term()}
def get(url) do
case :httpc.request(:get, {'#{url}', []}, [], []) do
{:ok, {{_, status, _}, _, body}} ->
handle(status, body)
{:error, reason} ->
{:error, reason}
end
end
@doc false
@spec post(String.t(), map(), keyword(String.t())) :: {:ok, map()} | {:error, term()}
def post(url, payload, content_type: content_type) when is_map(payload) do
with {:ok, schema} <- Jason.encode(payload), do: post(url, schema, content_type: content_type)
end
@doc false
@spec post(String.t(), String.t(), keyword(String.t())) :: {:ok, map()} | {:error, term()}
def post(url, payload, content_type: content_type) when is_binary(payload) do
with {:ok, body} <- Jason.encode(%{"schema" => payload}),
{:ok, {{_, status, _}, _, body}} =
:httpc.request(:post, {'#{url}', [], [content_type], body}, [], []) do
handle(status, body)
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