36 lines
1.1 KiB
Elixir
36 lines
1.1 KiB
Elixir
|
defmodule Mobilizon.Service.HTTP.Utils do
|
||
|
@moduledoc """
|
||
|
Utils for HTTP operations
|
||
|
"""
|
||
|
|
||
|
@spec get_header(Enum.t(), String.t()) :: String.t() | nil
|
||
|
def get_header(headers, key) do
|
||
|
key = String.downcase(key)
|
||
|
|
||
|
case List.keyfind(headers, key, 0) do
|
||
|
{^key, value} -> String.downcase(value)
|
||
|
nil -> nil
|
||
|
end
|
||
|
end
|
||
|
|
||
|
@spec is_content_type?(Enum.t(), String.t() | list(String.t())) :: boolean
|
||
|
def is_content_type?(headers, content_type) do
|
||
|
headers
|
||
|
|> get_header("Content-Type")
|
||
|
|> content_type_header_matches(content_type)
|
||
|
end
|
||
|
|
||
|
@spec content_type_header_matches(String.t() | nil, Enum.t()) :: boolean
|
||
|
defp content_type_header_matches(header, content_types)
|
||
|
defp content_type_header_matches(nil, _content_types), do: false
|
||
|
|
||
|
defp content_type_header_matches(header, content_type)
|
||
|
when is_binary(header) and is_binary(content_type),
|
||
|
do: content_type_header_matches(header, [content_type])
|
||
|
|
||
|
defp content_type_header_matches(header, content_types)
|
||
|
when is_binary(header) and is_list(content_types) do
|
||
|
Enum.any?(content_types, fn content_type -> String.starts_with?(header, content_type) end)
|
||
|
end
|
||
|
end
|