Skip to main content

lib/router/router.ex

defmodule Router.Router do
  import Plug.Conn

  alias Router.Registry

  def init(opts), do: opts

  def call(conn, _) do
    host =
      conn
      |> get_req_header("host")
      |> List.first()
      |> normalize_host()

    case Registry.resolve(host) do
      nil ->
        send_resp(conn, 404, "unknown service: #{host}")

      endpoint ->
        forward(conn, endpoint)
    end
  end

  defp forward(conn, endpoint) do
    endpoint.call(conn, endpoint.init([]))
  end

  defp normalize_host(nil), do: nil
  defp normalize_host(host), do: host |> String.split(":") |> List.first()
end