lib/riverside/util/cowboy_util.ex

defmodule Riverside.Util.CowboyUtil do
  @spec queries(:cowboy_req.req()) :: map

  def queries(req) do
    queries = :cowboy_req.parse_qs(req)
    queries |> Map.new(&{elem(&1, 0), elem(&1, 1)})
  end

  @spec headers(:cowboy_req.req()) :: map

  def headers(req) do
    headers = :cowboy_req.headers(req)
    headers |> Map.new(&{elem(&1, 0), elem(&1, 1)})
  end

  def response(req, code, headers) do
    :cowboy_req.reply(code, headers, req)
  end

  @spec peer(:cowboy_req.req()) :: {:inet.ip_address(), :inet.port_number(), String.t()}

  def peer(req) do
    {address, port} = :cowboy_req.peer(req)
    {address, port, x_forwarded_for(req)}
  end

  @spec x_forwarded_for(:cowboy_req.req()) :: String.t()

  def x_forwarded_for(req) do
    case :cowboy_req.parse_header("x-forwarded-for", req) do
      [head | _tail] -> head
      _ -> ""
    end
  end
end