Skip to content

Commit 74b5cda

Browse files
authored
Optimize splitting by semicolons (#1314)
1 parent 9153fb7 commit 74b5cda

1 file changed

Lines changed: 18 additions & 9 deletions

File tree

lib/plug/conn/utils.ex

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ defmodule Plug.Conn.Utils do
172172
@spec params(binary) :: params
173173
def params(t) do
174174
t
175-
|> split_semicolon("", [], false)
175+
|> split_semicolon(t, 0, [], false, 0)
176176
|> Enum.reduce(%{}, &params/2)
177177
end
178178

@@ -346,15 +346,24 @@ defmodule Plug.Conn.Utils do
346346
defp downcase_char(char) when char in @upper, do: char + 32
347347
defp downcase_char(char), do: char
348348

349-
defp split_semicolon(<<>>, <<>>, acc, _), do: acc
350-
defp split_semicolon(<<>>, buffer, acc, _), do: [buffer | acc]
349+
defp split_semicolon(<<?", rest::binary>>, original, start, acc, quoted?, len) do
350+
split_semicolon(rest, original, start, acc, not quoted?, len + 1)
351+
end
352+
353+
defp split_semicolon(<<?;, rest::binary>>, original, start, acc, false, len) do
354+
part = binary_part(original, start, len)
355+
split_semicolon(rest, original, start + len + 1, [part | acc], false, 0)
356+
end
351357

352-
defp split_semicolon(<<?", rest::binary>>, buffer, acc, quoted?),
353-
do: split_semicolon(rest, <<buffer::binary, ?">>, acc, not quoted?)
358+
defp split_semicolon(<<_, rest::binary>>, original, start, acc, quoted?, len) do
359+
split_semicolon(rest, original, start, acc, quoted?, len + 1)
360+
end
354361

355-
defp split_semicolon(<<?;, rest::binary>>, buffer, acc, false),
356-
do: split_semicolon(rest, <<>>, [buffer | acc], false)
362+
defp split_semicolon(<<>>, _original, _start, acc, _quoted?, 0) do
363+
acc
364+
end
357365

358-
defp split_semicolon(<<char, rest::binary>>, buffer, acc, quoted?),
359-
do: split_semicolon(rest, <<buffer::binary, char>>, acc, quoted?)
366+
defp split_semicolon(<<>>, original, start, acc, _quoted?, len) do
367+
[binary_part(original, start, len) | acc]
368+
end
360369
end

0 commit comments

Comments
 (0)