Packages
ace
0.16.1
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/6_ping.ex
defmodule Ace.HTTP2.Frame.Ping do
@moduledoc false
@type t :: %__MODULE__{ack: boolean}
@enforce_keys [:identifier, :ack]
defstruct @enforce_keys
@type_id 6
def new(identifier, ack \\ false) when bit_size(identifier) == 64 do
%__MODULE__{identifier: identifier, ack: ack}
end
def ack(%__MODULE__{identifier: identifier, ack: false}) do
new(identifier, true)
end
def decode({@type_id, <<_::7, ack_flag::1>>, 0, identifier}) when bit_size(identifier) == 64 do
ack =
case ack_flag do
0 ->
false
1 ->
true
end
{:ok, new(identifier, ack)}
end
def decode({@type_id, _flags, 0, _identifier}) do
{:error, {:frame_size_error, "Ping identifier must be 64 bits"}}
end
def decode({@type_id, _flags, _stream_id, _identifier}) do
{:error, {:protocol_error, "Ping must be for stream 0"}}
end
def serialize(%__MODULE__{identifier: identifier, ack: ack}) do
flags = if ack, do: <<1>>, else: <<0>>
# DEBT should not need to calculate length
length = :erlang.iolist_size(identifier)
<<length::24, @type_id::8, flags::binary, 0::1, 0::31, identifier::binary>>
end
defimpl Inspect, for: Ace.HTTP2.Frame.Ping do
def inspect(%{ack: ack, identifier: identifier}, _opts) do
"PING(ack: #{ack}, identifier: #{inspect(identifier)})"
end
end
end