Skip to content

Commit df4a72a

Browse files
committed
Optimize splitting by semicolons
1 parent 746b312 commit df4a72a

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

@@ -327,15 +327,24 @@ defmodule Plug.Conn.Utils do
327327
defp downcase_char(char) when char in @upper, do: char + 32
328328
defp downcase_char(char), do: char
329329

330-
defp split_semicolon(<<>>, <<>>, acc, _), do: acc
331-
defp split_semicolon(<<>>, buffer, acc, _), do: [buffer | acc]
330+
defp split_semicolon(<<?", rest::binary>>, original, start, acc, quoted?, len) do
331+
split_semicolon(rest, original, start, acc, not quoted?, len + 1)
332+
end
333+
334+
defp split_semicolon(<<?;, rest::binary>>, original, start, acc, false, len) do
335+
part = binary_part(original, start, len)
336+
split_semicolon(rest, original, start + len + 1, [part | acc], false, 0)
337+
end
332338

333-
defp split_semicolon(<<?", rest::binary>>, buffer, acc, quoted?),
334-
do: split_semicolon(rest, <<buffer::binary, ?">>, acc, not quoted?)
339+
defp split_semicolon(<<_, rest::binary>>, original, start, acc, quoted?, len) do
340+
split_semicolon(rest, original, start, acc, quoted?, len + 1)
341+
end
335342

336-
defp split_semicolon(<<?;, rest::binary>>, buffer, acc, false),
337-
do: split_semicolon(rest, <<>>, [buffer | acc], false)
343+
defp split_semicolon(<<>>, _original, _start, acc, _quoted?, 0) do
344+
acc
345+
end
338346

339-
defp split_semicolon(<<char, rest::binary>>, buffer, acc, quoted?),
340-
do: split_semicolon(rest, <<buffer::binary, char>>, acc, quoted?)
347+
defp split_semicolon(<<>>, original, start, acc, _quoted?, len) do
348+
[binary_part(original, start, len) | acc]
349+
end
341350
end

0 commit comments

Comments
 (0)