42 lines
1.0 KiB
Elixir
42 lines
1.0 KiB
Elixir
|
defmodule OpentelemetryHTTPoison.URI do
|
||
|
@moduledoc """
|
||
|
Exposes a function to normalise URIs in a format suitable for usage as Open Telemetry metadata.
|
||
|
"""
|
||
|
|
||
|
alias HTTPoison.Request
|
||
|
|
||
|
@default_route "/"
|
||
|
|
||
|
@spec infer_route_from_request(Request.t()) :: binary()
|
||
|
@doc """
|
||
|
Infers the route of the provided `HTTPoison.Request`, returned in a format suitable for usage as Open Telemetry metadata.
|
||
|
"""
|
||
|
def infer_route_from_request(%Request{url: url}) when is_binary(url),
|
||
|
do: infer_route_from_url(url)
|
||
|
|
||
|
def infer_route_from_request(%Request{}), do: @default_route
|
||
|
|
||
|
@spec infer_route_from_url(binary()) :: binary()
|
||
|
defp infer_route_from_url(url) when is_binary(url) do
|
||
|
url
|
||
|
|> URI.parse()
|
||
|
|> Map.get(:path, "/")
|
||
|
|> case do
|
||
|
nil ->
|
||
|
@default_route
|
||
|
|
||
|
value ->
|
||
|
case String.split(value, "/", parts: 2, trim: true) do
|
||
|
[] ->
|
||
|
@default_route
|
||
|
|
||
|
[path] ->
|
||
|
"/#{path}"
|
||
|
|
||
|
[path, _] ->
|
||
|
"/#{path}/:subpath"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|