Packages
stellar_sdk
0.6.0
0.23.0
0.22.0
0.21.2
0.21.1
0.21.0
0.20.0
0.19.0
0.18.1
0.18.0
0.17.1
0.17.0
0.16.1
0.16.0
0.15.1
0.15.0
0.14.0
0.13.1
0.13.0
0.12.0
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.2
0.10.1
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.1
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Elixir SDK for the Stellar network.
Current section
Files
Jump to
Current section
Files
lib/horizon/client/default.ex
defmodule Stellar.Horizon.Client.Default do
@moduledoc """
Hackney HTTP client implementation.
This implementation allows you to use your own JSON encoding library. The default is Jason.
"""
@behaviour Stellar.Horizon.Client.Spec
alias Stellar.Network
alias Stellar.Horizon.Error
@type status :: pos_integer()
@type headers :: [{binary(), binary()}, ...]
@type body :: binary()
@type success_response :: {:ok, status(), headers(), body()}
@type error_response :: {:error, status(), headers(), body()} | {:error, any()}
@type client_response :: success_response() | error_response()
@type parsed_response :: {:ok, map()} | {:error, Error.t()}
@impl true
def request(method, path, headers \\ [], body \\ "", opts \\ []) do
base_url = Network.base_url()
options = http_options(opts)
method
|> http_client().request(base_url <> path, headers, body, options)
|> handle_response()
end
@spec handle_response(response :: client_response()) :: parsed_response()
defp handle_response({:ok, status, _headers, body}) when status >= 200 and status <= 299 do
decoded_body = json_library().decode!(body, keys: :atoms)
{:ok, decoded_body}
end
defp handle_response({:ok, status, _headers, body}) when status >= 400 and status <= 599 do
decoded_body = json_library().decode!(body, keys: :atoms)
error = Error.new({:horizon, decoded_body})
{:error, error}
end
defp handle_response({:error, reason}) do
error = Error.new({:network, reason})
{:error, error}
end
@spec http_client() :: atom()
defp http_client, do: Application.get_env(:stellar_sdk, :http_client, :hackney)
@spec json_library() :: module()
defp json_library, do: Application.get_env(:stellar_sdk, :json_library, Jason)
@spec http_options(options :: Keyword.t()) :: Keyword.t()
defp http_options(options) do
default_options = [recv_timeout: 30_000, follow_redirect: true]
override_options = Application.get_env(:stellar_sdk, :hackney_options, [])
default_options
|> Keyword.merge(override_options)
|> Keyword.merge(options)
|> (&[:with_body | &1]).()
end
end