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(<>, terminator, acc) do ch = <> if ch == terminator do {acc, buffer} else scan_until(buffer, terminator, acc <> ch) end end end