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