defmodule TableauDevServer.IndexHtml do @moduledoc false @behaviour Plug @doc ~S""" Initialize plug options - at: The request path to reach for static assets, defaults to "/" - default_file: Filename to serve when request path is a directory, defaults to "index.html" ## Example iex> Plug.Static.IndexHtml.init(at: "/doc") [matcher: ~r|^/doc/(.*/)?$|, default_file: "index.html"] """ def init(opts), do: Keyword.merge([default_file: "index.html"], opts) @doc """ Invokes the plug, adding default_file to request_path and path_info for directory paths ## Example iex> opts = Plug.Static.IndexHtml.init(at: "/doc") iex> conn = %Plug.Conn{request_path: "/doc/a/", path_info: ["doc", "a"]} iex> Plug.Static.IndexHtml.call(conn, opts) |> Map.take([:request_path, :path_info]) %{path_info: ["doc", "a", "index.html"], request_path: "/doc/a/index.html"} """ def call(conn, default_file: filename) do case Path.extname(conn.request_path) do "" -> %{ conn | request_path: String.replace_suffix(conn.request_path, "/", "") <> "/#{filename}", path_info: conn.path_info ++ [filename] } _ -> conn end end end