@@ -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
341350end
0 commit comments