lib/nerves/utils/proxy.ex

defmodule Nerves.Utils.Proxy do
  # Special thanks to Hex.

  def config(url) do
    {http_proxy, https_proxy} = setup()
    auth(URI.parse(url), http_proxy, https_proxy)
  end

  defp setup do
    http_proxy = (proxy = System.get_env("HTTP_PROXY")) && set(:http, proxy)
    https_proxy = (proxy = System.get_env("HTTPS_PROXY")) && set(:https, proxy)
    {http_proxy, https_proxy}
  end

  defp set(scheme, proxy) do
    uri = URI.parse(proxy)

    if uri.host && uri.port do
      host = String.to_charlist(uri.host)
      :httpc.set_options([{scheme(scheme), {{host, uri.port}, []}}], :nerves)
    end

    uri
  end

  defp scheme(scheme) do
    case scheme do
      :http -> :proxy
      :https -> :https_proxy
    end
  end

  defp auth(%URI{scheme: "http"}, http_proxy, _https_proxy), do: auth(http_proxy)
  defp auth(%URI{scheme: "https"}, _http_proxy, https_proxy), do: auth(https_proxy)

  defp auth(nil), do: []
  defp auth(%URI{userinfo: nil}), do: []

  defp auth(%URI{userinfo: auth}) do
    destructure [user, pass], String.split(auth, ":", parts: 2)

    user = String.to_charlist(user)
    pass = String.to_charlist(pass || "")

    [proxy_auth: {user, pass}]
  end
end