Current section
Files
Jump to
Current section
Files
lib/plug_x_forwarded_proto.ex
defmodule PlugXForwardedProto do
@behaviour Plug
import Plug.Conn
def init(_) do
nil
end
def call(conn, _opts) do
case get_req_header(conn, "x-forwarded-proto") do
[] ->
conn
[proto | _] ->
%{scheme: orig_scheme, port: orig_port} = conn
scheme = choose_scheme(orig_scheme, proto)
port = choose_port(orig_port, scheme, orig_scheme)
%{conn | scheme: scheme, port: port}
end
end
defp choose_scheme(:ws, "http"), do: :ws
defp choose_scheme(:ws, "https"), do: :wss
defp choose_scheme(:wss, "https"), do: :wss
defp choose_scheme(_, "http"), do: :http
defp choose_scheme(_, "https"), do: :https
defp choose_scheme(_, proto), do: String.to_existing_atom(proto)
defp choose_port(80, :https, :http), do: 443
defp choose_port(80, :wss, :ws), do: 443
defp choose_port(port, _, _), do: port
end