lib/swiss/phoenix/controller.ex

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