towerops/lib/towerops_web/remote_ip.ex
Graham McIntire 532d88ffb9
perf: disable Req retry for faster error tests
- Add retry: false to VISP Client HTTP requests
- Add retry: false to ReleaseChecker GitHub API requests
- Remove unused Plug.Conn import from RemoteIpLogger
- Remove unused default parameter from req_get/2

Results:
- VISP sync test: 7007ms → 113ms (62x faster)
- ReleaseChecker test: 7004ms → 17ms (402x faster)
- UserResetPasswordLive test: 1495ms → 284ms (5x faster)

Req's default retry behavior (1s, 2s, 4s exponential backoff) was
causing 7-second delays for HTTP 500/503 error responses in tests.
For these clients, immediate failure is preferred over retries.
2026-03-10 16:19:31 -05:00

53 lines
1.2 KiB
Elixir

defmodule ToweropsWeb.RemoteIp do
@moduledoc """
Shared helpers for extracting and formatting remote IP addresses.
"""
import Plug.Conn, only: [get_req_header: 2]
@spec from_conn(Plug.Conn.t()) :: String.t() | nil
def from_conn(conn) do
case get_req_header(conn, "x-forwarded-for") do
[forwarded | _] ->
forwarded
|> String.split(",")
|> List.first()
|> String.trim()
[] ->
from_x_real_ip_or_tuple(conn)
end
end
@spec from_socket(Phoenix.Socket.t()) :: String.t() | nil
def from_socket(socket) do
case socket.transport_pid do
nil ->
nil
pid when is_pid(pid) ->
case :ranch.get_addr(pid) do
{ip, _port} when is_tuple(ip) -> format(ip)
_ -> nil
end
end
rescue
_ -> nil
end
@spec format(tuple() | nil) :: String.t() | nil
def format({a, b, c, d}), do: "#{a}.#{b}.#{c}.#{d}"
def format({a, b, c, d, e, f, g, h}) do
Enum.map_join([a, b, c, d, e, f, g, h], ":", &(&1 |> Integer.to_string(16) |> String.upcase()))
end
def format(_), do: nil
defp from_x_real_ip_or_tuple(conn) do
case get_req_header(conn, "x-real-ip") do
[real_ip | _] -> real_ip
[] -> format(conn.remote_ip)
end
end
end