Packages
ace
0.15.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/5_push_promise.ex
defmodule Ace.HTTP2.Frame.PushPromise do
@moduledoc false
@enforce_keys [:stream_id, :promised_stream_id, :header_block_fragment, :end_headers]
defstruct @enforce_keys
def new(stream_id, promised_stream_id, header_block_fragment, end_headers) do
%__MODULE__{
stream_id: stream_id,
promised_stream_id: promised_stream_id,
header_block_fragment: header_block_fragment,
end_headers: end_headers
}
end
def decode({5, flags, stream_id, payload}) do
<<_::4, padded::1, end_headers::1, _::2>> = flags
end_headers = end_headers == 1
data =
if padded == 1 do
Ace.HTTP2.Frame.remove_padding(payload)
else
payload
end
<<_R::1, promised_stream_id::31, header_block_fragment::binary>> = data
{:ok, new(stream_id, promised_stream_id, header_block_fragment, end_headers)}
end
def serialize(frame) do
length = 4 + :erlang.iolist_size(frame.header_block_fragment)
# DEBT provide way to serialize with padding
padded_flag = 0
end_headers_flag = if frame.end_headers, do: 1, else: 0
flags = <<0::4, padded_flag::1, end_headers_flag::1, 0::2>>
<<
length::24,
5::8,
flags::binary,
0::1,
frame.stream_id::31,
0::1,
frame.promised_stream_id::31,
frame.header_block_fragment::binary
>>
end
defimpl Inspect, for: Ace.HTTP2.Frame.PushPromise do
def inspect(
%{
stream_id: stream_id,
promised_stream_id: promised_stream_id,
end_headers: end_headers
},
_opts
) do
"PUSH_PROMISE(stream_id: #{stream_id}, promised_stream_id: #{promised_stream_id}, end_headers: #{
end_headers
})"
end
end
end