if Code.ensure_loaded?(Plug.Conn) && Code.ensure_loaded?(Phoenix.Controller) do defmodule Swiss.Phoenix.Controller do @moduledoc """ Helper functions for Phoenix controllers. """ import Plug.Conn, only: [put_status: 2] import Phoenix.Controller, only: [redirect: 2, text: 2] @doc """ Redirects back to the referer, or to `fallback` when missing. Does not redirect back to an external host. """ @spec redirect_back(Plug.Conn.t(), String.t()) :: Plug.Conn.t() def redirect_back(conn, fallback \\ "/") when is_binary(fallback) do redirect(conn, to: extract_referer(conn) || fallback) end @doc "Returns 204 No Content." @spec render_no_content(Plug.Conn.t()) :: Plug.Conn.t() def render_no_content(conn) do conn |> put_status(:no_content) |> text("") end defp extract_referer(conn) do {_, referer} = List.keyfind(conn.req_headers, "referer", 0, {"referer", ""}) no_host = String.replace_prefix(referer, conn.host, "") # No match on the host, don't know referer path if referer == no_host do nil else no_host end end end end