Packages
ankh
0.3.1
0.17.0
0.16.0
0.15.0
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.1
0.12.0
0.11.0
0.10.0
0.9.0
0.8.11
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.0
0.5.3
0.5.2
0.5.1
0.5.0
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.1
0.3.0
0.1.1
0.1.0
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
Pure Elixir HTTP/2 implementation
Current section
Files
Jump to
Current section
Files
lib/ankh/frame/settings/payload.ex
defmodule Ankh.Frame.Settings.Payload do
@moduledoc """
SETTINGS frame payload
"""
@type t :: %__MODULE__{header_table_size: Integer.t, enable_push: boolean,
max_concurrent_streams: Integer.t, initial_window_size: Intger.t,
max_frame_size: Integer.t, max_header_list_size: Integer.t}
defstruct [header_table_size: 4_096, enable_push: true,
max_concurrent_streams: 128, initial_window_size: 2_147_483_647,
max_frame_size: 16_384, max_header_list_size: 128]
end
defimpl Ankh.Frame.Payload, for: Ankh.Frame.Settings.Payload do
import Ankh.Frame.Utils
@header_table_size 0x1
@enable_push 0x2
@max_concurrent_streams 0x3
@initial_window_size 0x4
@max_frame_size 0x5
@max_header_list_size 0x6
def decode!(struct, binary, _) do
binary
|> parse_settings_payload
|> Enum.reduce(struct, fn {key, value}, acc -> Map.put(acc, key, value) end)
end
def encode!(%{header_table_size: hts, enable_push: ep,
max_concurrent_streams: mcs, initial_window_size: iws, max_frame_size: mfs,
max_header_list_size: mhls}, _) do
[<<@header_table_size::16>>, <<hts::32>>, <<@enable_push::16>>,
<<bool_to_int!(ep)::32>>, <<@max_concurrent_streams::16>>, <<mcs::32>>,
<<@initial_window_size::16>>, <<iws::32>>, <<@max_frame_size::16>>,
<<mfs::32>>, <<@max_header_list_size::16>>, <<mhls::32>>]
end
defp parse_settings_payload(<<@header_table_size::16, value::32,
rest::binary>>) do
[{:header_table_size, value} | parse_settings_payload(rest)]
end
defp parse_settings_payload(<<@enable_push::16, value::32,
rest::binary>>) do
[{:enable_push, value} | parse_settings_payload(rest)]
end
defp parse_settings_payload(<<@max_concurrent_streams::16, value::32,
rest::binary>>) do
[{:max_concurrent_streams, value} | parse_settings_payload(rest)]
end
defp parse_settings_payload(<<@initial_window_size::16, value::32,
rest::binary>>) do
[{:initial_window_size, value} | parse_settings_payload(rest)]
end
defp parse_settings_payload(<<@max_frame_size::16, value::32,
rest::binary>>) do
[{:max_frame_size, value} | parse_settings_payload(rest)]
end
defp parse_settings_payload(<<@max_header_list_size::16, value::32,
rest::binary>>) do
[{:max_header_list_size, value} | parse_settings_payload(rest)]
end
defp parse_settings_payload(_), do: []
end