31 lines
689 B
Elixir
31 lines
689 B
Elixir
|
|
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
|