Packages
plug
1.2.4
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/multipart.ex
defmodule Plug.Parsers.MULTIPART do
@moduledoc """
Parses multipart request body.
"""
@behaviour Plug.Parsers
def parse(conn, "multipart", subtype, _headers, opts) when subtype in ["form-data", "mixed"] do
{adapter, state} = conn.adapter
try do
adapter.parse_req_multipart(state, opts, &handle_headers/1)
rescue
e in Plug.UploadError -> # Do not ignore upload errors
reraise e, System.stacktrace
e -> # All others are wrapped
reraise Plug.Parsers.ParseError.exception(exception: e), System.stacktrace
else
{:ok, params, state} ->
{:ok, params, %{conn | adapter: {adapter, state}}}
{:more, _params, state} ->
{:error, :too_large, %{conn | adapter: {adapter, state}}}
{:error, :timeout} ->
raise Plug.TimeoutError
{:error, _} ->
raise Plug.BadRequestError
end
end
def parse(conn, _type, _subtype, _headers, _opts) do
{:next, conn}
end
defp handle_headers(headers) do
case List.keyfind(headers, "content-disposition", 0) do
{_, disposition} -> handle_disposition(disposition, headers)
nil -> :skip
end
end
defp handle_disposition(disposition, headers) do
case :binary.split(disposition, ";") do
[_, params] ->
params = Plug.Conn.Utils.params(params)
if name = Map.get(params, "name") do
handle_disposition_params(name, params, headers)
else
:skip
end
[_] ->
:skip
end
end
defp handle_disposition_params(name, params, headers) do
case Map.get(params, "filename") do
nil -> {:binary, name}
"" -> :skip
filename ->
path = Plug.Upload.random_file!("multipart")
{:file, name, path, %Plug.Upload{filename: filename, path: path,
content_type: get_header(headers, "content-type")}}
end
end
defp get_header(headers, key) do
case List.keyfind(headers, key, 0) do
{^key, value} -> value
nil -> nil
end
end
end