Packages
ace
0.16.0
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/settings.ex
defmodule Ace.HTTP2.Settings do
@moduledoc false
@enforce_keys [
:enable_push,
:max_concurrent_streams,
:initial_window_size,
:max_frame_size
]
defstruct @enforce_keys
@max_frame_size_default 16384
@max_frame_size_maximum 16_777_215
@initial_window_size_default 65535
@initial_window_size_minimum 0
@initial_window_size_maximum 2_147_483_647
def for_server(values \\ []) do
for_client([{:enable_push, false} | values])
end
def for_client(values \\ []) do
case Keyword.get(values, :max_frame_size, @max_frame_size_default) do
value when value < @max_frame_size_default ->
{:error, :max_frame_size_too_small}
value when @max_frame_size_maximum < value ->
{:error, :max_frame_size_too_large}
max_frame_size ->
case Keyword.get(values, :initial_window_size, @initial_window_size_default) do
value when value < @initial_window_size_minimum ->
{:error, :initial_window_size_too_small}
value when @initial_window_size_maximum < value ->
{:error, :initial_window_size_too_large}
initial_window_size ->
# DEBT replace max to be unlimited
max_concurrent_streams = Keyword.get(values, :max_concurrent_streams, 10000)
enable_push = Keyword.get(values, :enable_push, true)
settings = %__MODULE__{
max_frame_size: max_frame_size,
max_concurrent_streams: max_concurrent_streams,
initial_window_size: initial_window_size,
enable_push: enable_push
}
{:ok, settings}
end
end
end
def update_frame(next, previous) do
changed =
if next.max_frame_size != previous.max_frame_size do
[max_frame_size: next.max_frame_size]
else
[]
end
changed =
if next.initial_window_size != previous.initial_window_size do
[initial_window_size: next.initial_window_size]
else
[]
end ++ changed
changed =
if next.enable_push != previous.enable_push do
[enable_push: next.enable_push]
else
[]
end ++ changed
changed =
if next.max_concurrent_streams != previous.max_concurrent_streams do
[max_concurrent_streams: next.max_concurrent_streams]
else
[]
end ++ changed
Ace.HTTP2.Frame.Settings.new(changed)
end
def apply_frame(frame, settings) do
Enum.reduce(@enforce_keys, settings, fn key, settings ->
case Map.get(frame, key) do
nil ->
settings
new_value ->
Map.put(settings, key, new_value)
end
end)
end
end