From df4a72ad12dd06a4a657addf92f7fc20eb4aaee1 Mon Sep 17 00:00:00 2001 From: preciz Date: Mon, 15 Jun 2026 17:25:42 +0200 Subject: [PATCH] Optimize splitting by semicolons --- lib/plug/conn/utils.ex | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/lib/plug/conn/utils.ex b/lib/plug/conn/utils.ex index a98d09d2..9577df85 100644 --- a/lib/plug/conn/utils.ex +++ b/lib/plug/conn/utils.ex @@ -172,7 +172,7 @@ defmodule Plug.Conn.Utils do @spec params(binary) :: params def params(t) do t - |> split_semicolon("", [], false) + |> split_semicolon(t, 0, [], false, 0) |> Enum.reduce(%{}, ¶ms/2) end @@ -327,15 +327,24 @@ defmodule Plug.Conn.Utils do defp downcase_char(char) when char in @upper, do: char + 32 defp downcase_char(char), do: char - defp split_semicolon(<<>>, <<>>, acc, _), do: acc - defp split_semicolon(<<>>, buffer, acc, _), do: [buffer | acc] + defp split_semicolon(<>, original, start, acc, quoted?, len) do + split_semicolon(rest, original, start, acc, not quoted?, len + 1) + end + + defp split_semicolon(<>, original, start, acc, false, len) do + part = binary_part(original, start, len) + split_semicolon(rest, original, start + len + 1, [part | acc], false, 0) + end - defp split_semicolon(<>, buffer, acc, quoted?), - do: split_semicolon(rest, <>, acc, not quoted?) + defp split_semicolon(<<_, rest::binary>>, original, start, acc, quoted?, len) do + split_semicolon(rest, original, start, acc, quoted?, len + 1) + end - defp split_semicolon(<>, buffer, acc, false), - do: split_semicolon(rest, <<>>, [buffer | acc], false) + defp split_semicolon(<<>>, _original, _start, acc, _quoted?, 0) do + acc + end - defp split_semicolon(<>, buffer, acc, quoted?), - do: split_semicolon(rest, <>, acc, quoted?) + defp split_semicolon(<<>>, original, start, acc, _quoted?, len) do + [binary_part(original, start, len) | acc] + end end