Packages
plug
0.13.0
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/adapters/cowboy/handler.ex
defmodule Plug.Adapters.Cowboy.Handler do
@moduledoc false
@connection Plug.Adapters.Cowboy.Conn
@already_sent {:plug_conn, :sent}
def init({transport, :http}, req, {plug, opts}) when transport in [:tcp, :ssl] do
{:upgrade, :protocol, __MODULE__, req, {transport, plug, opts}}
end
def upgrade(req, env, __MODULE__, {transport, plug, opts}) do
conn = @connection.conn(req, transport)
try do
%{adapter: {@connection, req}} =
conn
|> plug.call(opts)
|> maybe_send(plug)
{:ok, req, [{:result, :ok} | env]}
catch
:error, value ->
stack = System.stacktrace()
exception = Exception.normalize(:error, value, stack)
reason = {{exception, stack}, {plug, :call, [conn, opts]}}
terminate(reason, req, stack)
:throw, value ->
stack = System.stacktrace()
reason = {{{:nocatch, value}, stack}, {plug, :call, [conn, opts]}}
terminate(reason, req, stack)
:exit, value ->
stack = System.stacktrace()
reason = {value, {plug, :call, [conn, opts]}}
terminate(reason, req, stack)
after
receive do
@already_sent -> :ok
after
0 -> :ok
end
end
end
defp maybe_send(%Plug.Conn{state: :unset}, _plug), do: raise Plug.Conn.NotSentError
defp maybe_send(%Plug.Conn{state: :set} = conn, _plug), do: Plug.Conn.send_resp(conn)
defp maybe_send(%Plug.Conn{} = conn, _plug), do: conn
defp maybe_send(other, plug) do
raise "Cowboy adapter expected #{inspect plug} to return Plug.Conn but got: #{inspect other}"
end
defp terminate(reason, req, stack) do
:cowboy_req.maybe_reply(stack, req)
exit(reason)
end
end