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