Current section

Files

Jump to
nerves_hub_link_http lib nerves_hub_link_http default.ex
Raw

lib/nerves_hub_link_http/default.ex

defmodule NervesHubLinkHTTP.Client.Default do
@moduledoc """
Default NervesHubLinkHTTP.Client implementation
Requests are completed via `:hackney`
FWUP messages are simply logged as warnings
See `NervesHugLinkHTTP.Client` for more details.
"""
alias NervesHubLinkHTTP.Client
require Logger
@behaviour Client
@impl Client
def handle_fwup_message({:progress, percent}) when rem(percent, 25) == 0 do
Logger.debug("[NervesHubLinkHTTP] FWUP PROG: #{percent}%")
end
def handle_fwup_message({:error, _, message}) do
Logger.error("[NervesHubLinkHTTP] FWUP ERROR: #{message}")
end
def handle_fwup_message({:warning, _, message}) do
Logger.warn("[NervesHubLinkHTTP] FWUP WARN: #{message}")
end
def handle_fwup_message(fwup_message) do
Logger.warn("[NervesHubLinkHTTP] Unknown FWUP message: #{inspect(fwup_message)}")
end
@impl Client
def handle_error(error) do
Logger.warn("[NervesHubLinkHTTP] Firmware stream error: #{inspect(error)}")
end
@impl Client
def request(method, url, headers, body, opts \\ []) do
method
|> :hackney.request(url, headers, body, opts)
|> resp()
end
defp resp({:ok, status_code, _headers, client_ref})
when status_code >= 200 and status_code < 300 do
case :hackney.body(client_ref) do
{:ok, ""} ->
{:ok, ""}
{:ok, body} ->
Jason.decode(body)
error ->
error
end
after
:hackney.close(client_ref)
end
defp resp({:ok, _status_code, _headers, client_ref}) do
case :hackney.body(client_ref) do
{:ok, ""} ->
{:error, ""}
{:ok, body} ->
resp =
case Jason.decode(body) do
{:ok, body} -> body
body -> body
end
{:error, resp}
error ->
error
end
after
:hackney.close(client_ref)
end
defp resp(resp) do
{:error, resp}
end
end