postland/lib/activity_pub/headers/signature_splitter.ex

31 lines
689 B
Elixir
Raw Normal View History

2024-09-24 13:16:54 +00:00
defmodule ActivityPub.Headers.SignatureSplitter do
def split(""), do: []
def split(value) do
{key_value, rest} = scan_until(value, ",")
{key, value} = split_kv(key_value)
[{key, value} | split(rest)]
end
defp split_kv(kv_string) do
{key, wrapped_value} = scan_until(kv_string, "=")
value = String.trim(wrapped_value, ~s("))
{key, value}
end
def scan_until(buffer, terminator, acc \\ "")
def scan_until("", _terminator, acc), do: {acc, ""}
def scan_until(<<ch::utf8, buffer::binary>>, terminator, acc) do
ch = <<ch>>
if ch == terminator do
{acc, buffer}
else
scan_until(buffer, terminator, acc <> ch)
end
end
end