Packages
ace
0.15.9
0.19.0
0.18.10
0.18.9
0.18.8
0.18.7
0.18.6
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.1
0.17.0
0.16.8
0.16.7
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.11
0.15.10
0.15.9
0.15.8
0.15.7
0.15.6
retired
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.1
0.13.0
0.12.1
0.12.0
retired
0.11.1
0.11.0
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.0
0.3.0
0.2.0
HTTP web server and client, supports http1 and http2
Current section
Files
Jump to
Current section
Files
lib/ace/http1.ex
defmodule Ace.HTTP1 do
@moduledoc false
def serialize_response(status_code, headers, body) do
[
"HTTP/1.1 #{status_code} #{Raxx.reason_phrase(status_code)}\r\n",
header_lines(headers),
"\r\n",
body
]
end
def pop_chunk(buffer) do
case String.split(buffer, "\r\n", parts: 2) do
[base_16_size, rest] ->
size =
base_16_size
|> :erlang.binary_to_list()
|> :erlang.list_to_integer(16)
case rest do
<<chunk::binary-size(size), "\r\n", rest::binary>> ->
{chunk, rest}
_incomplete_chunk ->
{nil, buffer}
end
[rest] ->
{nil, rest}
end
end
@doc """
Serialize io_data as a single chunk to be streamed.
## Example
iex> Ace.HTTP1.serialize_chunk("hello")
...> |> to_string()
"5\\r\\nhello\\r\\n"
iex> Ace.HTTP1.serialize_chunk("")
...> |> to_string()
"0\\r\\n\\r\\n"
"""
def serialize_chunk(data) do
size = :erlang.iolist_size(data)
[:erlang.integer_to_list(size, 16), "\r\n", data, "\r\n"]
end
defp header_lines(headers) do
Enum.map(headers, &header_line/1)
end
defp header_line({field_name, field_value}) do
"#{field_name}: #{field_value}\r\n"
end
end