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/conn/adapter.ex
# In this file we check if at least one of the adapters are implemented.
# Since right now we only support cowboy, the check is straight-forward.
unless Code.ensure_loaded?(:cowboy_req) do
raise "cannot compile Plug because the :cowboy application is not available"
end
defmodule Plug.Conn.Adapter do
@moduledoc """
Specification of the connection adapter API implemented by webservers
"""
use Behaviour
alias Plug.Conn
@typep payload :: term
@doc """
Sends the given status, headers and body as a response
back to the client.
If the request has method `"HEAD"`, the adapter should
not send the response to the client.
Webservers are advised to return `nil` as the sent_body,
as the body can no longer be manipulated. However, the
test implementation returns the actual body so it can
be used during testing.
"""
defcallback send_resp(payload, Conn.status, Conn.headers, Conn.body) ::
{:ok, sent_body :: binary | nil, payload}
@doc """
Sends the given status, headers and file as a response
back to the client.
If the request has method `"HEAD"`, the adapter should
not send the response to the client.
Webservers are advised to return `nil` as the sent_body,
as the body can no longer be manipulated. However, the
test implementation returns the actual body so it can
be used during testing.
"""
defcallback send_file(payload, Conn.status, Conn.headers, file :: binary) ::
{:ok, sent_body :: binary | nil, payload}
@doc """
Sends the given status, headers as the beginning of
a chunked response to the client.
Webservers are advised to return `nil` as the sent_body,
as the body can no longer be manipulated. However, the
test implementation returns the actual body so it can
be used during testing.
"""
defcallback send_chunked(payload, Conn.status, Conn.headers) ::
{:ok, sent_body :: binary | nil, payload}
@doc """
Sends a chunk in the chunked response.
If the request has method `"HEAD"`, the adapter should
not send the response to the client.
Webservers are advised to return `:ok` and not modify
any further state for each chunk. However, the test
implementation returns the actual body and payload so
it can be used during testing.
"""
defcallback chunk(payload, Conn.status) ::
:ok | {:ok, sent_body :: binary, payload} | {:error, term}
@doc """
Streams the request body.
An approximate limit of data to be read from the socket per stream
can be passed as argument.
"""
defcallback stream_req_body(payload, limit :: pos_integer) ::
{:ok, data :: binary, payload} | {:done, payload}
@doc """
Parses a multipart request.
This function receives the payload, the body limit and a callback.
When parsing each multipart segment, the parser should invoke the
given fallback passing the headers for that segment, before consuming
the body. The callback will return one of the following values:
* `{:binary, name}` - the current segment must be treated as a regular
binary value with the given `name`
* `{:file, name, file, upload} - the current segment is a file upload with `name`
and contents should be written to the given `file`
* `:skip` - this multipart segment should be skipped
This function can respond with one of the three following values:
* `{:ok, params, payload}` - the parameters are already processed as defined per `Conn.params`
* `{:too_large, payload} - the request body goes over the given limit
"""
defcallback parse_req_multipart(payload, limit :: pos_integer, fun) ::
{:ok, Conn.params, payload} | {:too_large, payload}
end