Current section
Files
Jump to
Current section
Files
lib/stream/response.ex
defmodule Kadabra.Stream.Response do
@moduledoc """
Response struct returned from open streams.
If received as a push promise, `:status` and `:body` will
most likely be empty.
*Sample response for a `PUT` request*
%Kadabra.Stream.Response{
body: "SAMPLE ECHO REQUEST",
headers: [
{":status", "200"},
{"content-type", "text/plain; charset=utf-8"},
{"date", "Sun, 16 Oct 2016 21:28:15 GMT"}
],
id: 1,
status: 200
}
"""
defstruct [:id, :headers, :body, :status]
alias Kadabra.Stream
@type t :: %__MODULE__{
id: non_neg_integer,
headers: Keyword.t,
body: String.t,
status: integer
}
@doc false
@spec new(Stream.t) :: t
def new(%Stream{id: id, headers: headers, body: body}) do
%__MODULE__{
id: id,
headers: headers,
body: body,
status: get_status(headers)
}
end
defp get_status(headers) do
case get_header(headers, ":status") do
{":status", status} -> status |> String.to_integer
nil -> nil
end
end
@doc ~S"""
Fetches header with given name.
## Examples
iex> stream = %Kadabra.Stream.Response{headers: [{":status", "200"}]}
iex> Kadabra.Stream.Response.get_header(stream.headers, ":status")
{":status", "200"}
"""
@spec get_header([...], String.t) :: {String.t, term} | nil
def get_header(headers, header) do
headers
|> Enum.filter(& &1 != :undefined)
|> Enum.find(fn({key, _val}) -> key == header end)
end
end