Packages
ace
0.18.7
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/http2/frame/1_headers.ex
defmodule Ace.HTTP2.Frame.Headers do
@moduledoc false
@type t :: %__MODULE__{stream_id: Ace.HTTP2.Frame.stream_id()}
# TODO rename header_block_fragment -> fragment
@enforce_keys [:stream_id, :header_block_fragment, :end_headers, :end_stream]
defstruct @enforce_keys
def new(stream_id, header_block_fragment, end_headers, end_stream) do
%__MODULE__{
stream_id: stream_id,
header_block_fragment: header_block_fragment,
end_headers: end_headers,
end_stream: end_stream
}
end
def decode({1, flags, stream_id, payload}) do
<<_::1, _::1, priority::1, _::1, padded::1, end_headers::1, _::1, end_stream::1>> = flags
data =
if padded == 1 do
Ace.HTTP2.Frame.remove_padding(payload)
else
payload
end
if priority == 1 do
<<_exclusive::1, d_stream_id::31, _weight::8, header_block_fragment::binary>> = data
if stream_id == d_stream_id do
{:error, {:protocol_error, "Headers frame can not be dependent on own stream"}}
else
{:ok, header_block_fragment}
end
else
{:ok, data}
end
|> case do
{:ok, header_block_fragment} ->
{
:ok,
%__MODULE__{
stream_id: stream_id,
header_block_fragment: header_block_fragment,
end_headers: end_headers == 1,
end_stream: end_stream == 1
}
}
{:error, reason} ->
{:error, reason}
end
end
def serialize(frame) do
end_stream_flag = if frame.end_stream, do: 1, else: 0
end_headers_flag = if frame.end_headers, do: 1, else: 0
length = :erlang.iolist_size(frame.header_block_fragment)
flags = <<0::5, end_headers_flag::1, 0::1, end_stream_flag::1>>
<<
length::24,
1::8,
flags::binary,
0::1,
frame.stream_id::31,
frame.header_block_fragment::binary
>>
end
defimpl Inspect, for: Ace.HTTP2.Frame.Headers do
def inspect(%{stream_id: stream_id, end_headers: end_headers, end_stream: end_stream}, _opts) do
"HEADERS(stream_id: #{stream_id}, end_headers: #{end_headers}, end_stream: #{end_stream})"
end
end
end