Packages
timber
0.3.0
3.1.2
3.1.1
3.1.0
3.0.0
3.0.0-alpha.3
3.0.0-alpha.2
3.0.0-alpha.1
2.8.4
2.8.3
2.8.2
2.8.1
2.8.0
2.7.0
2.6.1
2.6.0
2.5.6
2.5.5
2.5.4
2.5.3
2.5.2
2.5.1
2.5.0
2.4.5
2.4.4
2.4.3
2.4.2
2.4.1
2.4.0
2.3.4
2.3.3
2.3.1
2.3.0
2.2.1
2.2.0
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.2
2.0.1
2.0.0
2.0.0-rc7
2.0.0-rc6
2.0.0-rc5
2.0.0-rc4
2.0.0-rc3
2.0.0-rc2
2.0.0-rc1
1.1.18
1.1.17
1.1.16
1.1.15
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
🌲 Great Elixir Logging Made Easy. Official Timber.io Integration.
Current section
Files
Jump to
Current section
Files
lib/timber/events/http_response_event.ex
defmodule Timber.Events.HTTPResponseEvent do
@moduledoc """
The HTTP response event tracks outgoing HTTP responses.
Timber can automatically track response events if you
use a `Plug` based framework through `Timber.Plug`.
"""
@type t :: %__MODULE__{
description: String.t,
bytes: non_neg_integer,
headers: headers,
status: pos_integer,
time_ms: non_neg_integer
}
@type headers :: %{
cache_control: String.t,
content_disposition: String.t,
content_length: non_neg_integer,
content_type: String.t,
location: String.t
}
defstruct [:description, :bytes, :headers, :status, :time_ms]
@recognized_headers ~w(
cache_control
content_disposition
content_length
content_type
location
)
def new(opts) do
event = struct(__MODULE__, opts)
description = "Sent #{event.status} in #{event.time_ms}ms"
%__MODULE__{event | description: description}
end
@doc """
Takes a list of two-element tuples representing HTTP response headers and
returns a map of the recognized headers Timber handles
"""
@spec headers_from_list([{String.t, String.t}]) :: headers
def headers_from_list(headers) do
Enum.filter_map(headers, &header_filter/1, &header_to_keyword/1)
|> Enum.into(%{})
end
@spec headers_from_list({String.t, String.t}) :: boolean
defp header_filter({name, _}) when name in @recognized_headers, do: true
defp header_filter(_), do: false
@spec header_to_keyword({String.t, String.t}) :: {atom, String.t}
defp header_to_keyword({name, value}), do: {String.to_existing_atom(name), value}
end