Packages
bandit
0.7.4
1.12.0
1.11.1
1.11.0
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
retired
1.9.0
1.8.0
1.7.0
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.2
1.4.1
1.4.0
1.3.0
1.2.3
1.2.2
1.2.1
1.2.0
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
1.0.0-pre.18
1.0.0-pre.17
1.0.0-pre.16
1.0.0-pre.15
1.0.0-pre.14
1.0.0-pre.13
1.0.0-pre.12
1.0.0-pre.11
1.0.0-pre.10
1.0.0-pre.9
1.0.0-pre.8
1.0.0-pre.7
1.0.0-pre.6
1.0.0-pre.5
1.0.0-pre.4
1.0.0-pre.3
1.0.0-pre.2
1.0.0-pre.1
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.2.3
0.2.2
0.2.1
0.2.0
0.1.1
0.1.0
A pure-Elixir HTTP server built for Plug & WebSock apps
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
test/support/simple_http1_client.ex
defmodule SimpleHTTP1Client do
@moduledoc false
def tcp_client(context) do
{:ok, socket} =
:gen_tcp.connect(~c"localhost", context[:port], active: false, mode: :binary, nodelay: true)
socket
end
def tls_client(context, protocols) do
{:ok, socket} =
:ssl.connect(~c"localhost", context[:port],
active: false,
mode: :binary,
nodelay: true,
verify: :verify_peer,
cacertfile: Path.join(__DIR__, "../support/ca.pem"),
alpn_advertised_protocols: protocols
)
socket
end
def send(socket, verb, request_target, headers \\ [], version \\ "1.1") do
:gen_tcp.send(socket, "#{verb} #{request_target} HTTP/#{version}\r\n")
Enum.each(headers, &:gen_tcp.send(socket, &1 <> "\r\n"))
:gen_tcp.send(socket, "\r\n")
end
def recv_reply(socket) do
{:ok, response} = :gen_tcp.recv(socket, 0)
[status_line | headers] = String.split(response, "\r\n")
<<_version::binary-size(8), " ", status::binary>> = status_line
{headers, rest} = Enum.split_while(headers, &(&1 != ""))
headers =
Enum.map(headers, fn header ->
[key, value] = String.split(header, ":", parts: 2)
{String.to_atom(key), String.trim(value)}
end)
rest = rest |> Enum.drop(1) |> Enum.join("\r\n")
body =
headers
|> Keyword.get(:"content-length")
|> case do
nil ->
rest
value ->
case String.to_integer(value) - byte_size(rest) do
0 ->
rest
pending ->
{:ok, response} = :gen_tcp.recv(socket, pending)
rest <> response
end
end
{:ok, status, headers, body}
end
def connection_closed_for_reading?(client) do
:gen_tcp.recv(client, 0) == {:error, :closed}
end
end