defmodule Ankh.Frame.Error do @moduledoc """ HTTP/2 Error encoding and decoding """ @type t :: :no_error | :protocol_error | :internal_error | :flow_control_error | :settings_timeout | :stream_closed | :frame_size_error | :refused_stream | :cancel | :compression_error | :connect_error | :enache_your_calm | :inadequate_security | :http_1_1_required @no_error 0x0 @protocol_error 0x1 @internal_error 0x2 @flow_control_error 0x3 @settings_timeout 0x4 @stream_closed 0x5 @frame_size_error 0x6 @refused_stream 0x7 @cancel 0x8 @compression_error 0x9 @connect_error 0xA @enache_your_calm 0xB @inadequate_security 0xC @http_1_1_required 0xD @doc """ Returns a human readable string for the corresponding error code atom """ @spec format(t) :: String.t() def format(:no_error), do: "Graceful shutdown" def format(:protocol_error), do: "Protocol error detected" def format(:internal_error), do: "Implementation fault" def format(:flow_control_error), do: "Flow-control limits exceeded" def format(:settings_timeout), do: "Settings not acknowledged" def format(:stream_closed), do: "Frame received for closed stream" def format(:frame_size_error), do: "Frame size incorrect" def format(:refused_stream), do: "Stream not processed" def format(:cancel), do: "Stream cancelled" def format(:compression_error), do: "Compression state not updated" def format(:connect_error), do: "TCP connection error for CONNECT method" def format(:enache_your_calm), do: "Processing capacity exceeded" def format(:inadequate_security), do: "Negotiated TLS parameters not acceptable" def format(:http_1_1_required), do: "Use HTTP/1.1 for the request" def decode!(@no_error), do: :no_error def decode!(@protocol_error), do: :protocol_error def decode!(@internal_error), do: :internal_error def decode!(@flow_control_error), do: :flow_control_error def decode!(@settings_timeout), do: :settings_timeout def decode!(@stream_closed), do: :stream_closed def decode!(@frame_size_error), do: :frame_size_error def decode!(@refused_stream), do: :refused_stream def decode!(@cancel), do: :cancel def decode!(@compression_error), do: :compression_error def decode!(@connect_error), do: :connect_error def decode!(@enache_your_calm), do: :enache_your_calm def decode!(@inadequate_security), do: :inadequate_security def decode!(@http_1_1_required), do: :http_1_1_required def encode!(:no_error), do: <<@no_error::32>> def encode!(:protocol_error), do: <<@protocol_error::32>> def encode!(:internal_error), do: <<@internal_error::32>> def encode!(:flow_control_error), do: <<@flow_control_error::32>> def encode!(:settings_timeout), do: <<@settings_timeout::32>> def encode!(:stream_closed), do: <<@stream_closed::32>> def encode!(:frame_size_error), do: <<@frame_size_error::32>> def encode!(:refused_stream), do: <<@refused_stream::32>> def encode!(:cancel), do: <<@cancel::32>> def encode!(:compression_error), do: <<@compression_error::32>> def encode!(:connect_error), do: <<@connect_error::32>> def encode!(:enache_your_calm), do: <<@enache_your_calm::32>> def encode!(:inadequate_security), do: <<@inadequate_security::32>> def encode!(:http_1_1_required), do: <<@http_1_1_required::32>> end