Packages
plug
0.4.2
1.20.3
1.20.2
1.20.1
retired
1.20.0
retired
1.19.5
1.19.4
1.19.3
1.19.2
1.19.1
1.19.0
1.18.5
1.18.4
1.18.3
1.18.2
1.18.1
1.18.0
1.17.4
1.17.3
1.17.2
1.17.1
1.17.0
1.16.6
1.16.5
1.16.4
1.16.3
1.16.2
1.16.1
1.16.0
1.15.6
1.15.5
1.15.4
1.15.3
1.15.2
1.15.1
1.15.0
1.14.2
1.14.1
1.14.0
1.13.6
1.13.5
1.13.4
1.13.3
1.13.2
1.13.1
retired
1.13.0
retired
1.12.1
1.12.0
1.11.1
1.11.0
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
1.9.0
1.8.3
1.8.2
1.8.1
1.8.0
1.7.2
1.7.1
1.7.0
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.5.0-rc.2
1.5.0-rc.1
1.5.0-rc.0
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-rc.0
1.3.6
1.3.5
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc.0
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.14.0
0.13.1
0.13.0
0.12.2
0.12.1
0.12.0
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.0
0.5.3
0.5.2
0.5.1
0.5.0
0.4.4
0.4.3
0.4.2
0.4.1
Compose web applications with functions
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/plug/parsers/urlencoded.ex
defmodule Plug.Parsers.URLENCODED do
@moduledoc false
alias Plug.Conn
def parse(%Conn{} = conn, "application", "x-www-form-urlencoded", _headers, opts) do
read_body(conn, Keyword.fetch!(opts, :limit))
end
def parse(conn, _type, _subtype, _headers, _opts) do
{:next, conn}
end
defp read_body(%Conn{adapter: {adapter, state}} = conn, limit) do
case read_body({:ok, "", state}, "", limit, adapter) do
{:too_large, state} ->
{:too_large, %{conn | adapter: {adapter, state}}}
{:ok, body, state} ->
{:ok, Plug.Conn.Query.decode(body), %{conn | adapter: {adapter, state}}}
end
end
defp read_body({:ok, buffer, state}, acc, limit, adapter) when limit >= 0,
do: read_body(adapter.stream_req_body(state, 1_000_000),
acc <> buffer, limit - byte_size(buffer), adapter)
defp read_body({:ok, _, state}, _acc, _limit, _adapter),
do: {:too_large, state}
defp read_body({:done, state}, acc, limit, _adapter) when limit >= 0,
do: {:ok, acc, state}
defp read_body({:done, state}, _acc, _limit, _adapter),
do: {:too_large, state}
end