Packages
bandit
1.1.0
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
defdelegate tcp_client(context), to: Transport
def send(socket, verb, request_target, headers \\ [], version \\ "1.1") do
Transport.send(socket, "#{verb} #{request_target} HTTP/#{version}\r\n")
Enum.each(headers, &Transport.send(socket, &1 <> "\r\n"))
Transport.send(socket, "\r\n")
end
def recv_reply(socket, head? \\ false) do
{:ok, response} = Transport.recv(socket, 0)
parse_response(socket, response, head?)
end
def parse_response(socket, response, head? \\ false) do
[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
_ when head? ->
rest
nil ->
rest
value ->
case String.to_integer(value) - byte_size(rest) do
0 ->
rest
pending when pending < 0 ->
expected = String.to_integer(value)
<<response::binary-size(expected), _rest::binary>> = rest
response
pending ->
{:ok, response} = Transport.recv(socket, pending)
rest <> response
end
end
{:ok, status, headers, body}
end
def connection_closed_for_reading?(client) do
Transport.recv(client, 0) == {:error, :closed}
end
end