shift73k/lib/shift73k_web/plugs/redirector.ex

37 lines
1.1 KiB
Elixir

defmodule Shift73kWeb.Redirector do
import Phoenix.Controller, only: [redirect: 2]
def init([to: _] = opts), do: opts
def init([external: _] = opts), do: opts
def init(_default), do: raise("Missing required to: / external: option in redirect")
def call(conn, [to: to]) do
redirect(conn, to: append_query_string(conn, to))
end
def call(conn, [external: url]) do
external = url
|> URI.parse
|> merge_query_string(conn)
|> URI.to_string
redirect(conn, external: external)
end
defp append_query_string(%Plug.Conn{query_string: ""}, path), do: path
defp append_query_string(%Plug.Conn{query_string: query}, path), do: "#{path}?#{query}"
defp merge_query_string(%URI{query: nil} = destination_uri, %Plug.Conn{query_string: source}) do
%{destination_uri | query: source}
end
defp merge_query_string(%URI{query: destination} = destination_uri, %Plug.Conn{query_string: source}) do
merged_query = Map.merge(
URI.decode_query(destination),
URI.decode_query(source)
)
%{destination_uri | query: URI.encode_query(merged_query)}
end
end