Packages
timber
0.3.2
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_request_event.ex
defmodule Timber.Events.HTTPRequestEvent do
@moduledoc """
The HTTP request event tracks incoming HTTP requests
Timber can automatically track incoming HTTP requests if
you use a `Plug` based framework through the `Timber.Plug`.
"""
@type t :: %__MODULE__{
host: String.t | nil,
description: String.t | nil,
headers: headers | nil,
method: method | nil,
path: String.t | nil,
port: pos_integer | nil,
scheme: scheme | nil,
query_params: %{String.t => String.t} | nil,
}
@type method :: :connect | :delete | :get | :head | :options | :post | :put | :trace
@type scheme :: :https | :http
@type headers :: %{
content_type: String.t | nil,
remote_addr: String.t | nil,
referrer: String.t | nil,
request_id: String.t | nil,
user_agent: String.t | nil
}
defstruct [:host, :headers, :method, :path, :port, :scheme, :query_params, :description]
@recognized_headers ~w(
content-type
referrer
remote-addr
user-agent
x-request-id
)
def new(opts) do
event = struct(__MODULE__, opts)
method =
event.method
|> Atom.to_string()
|> String.upcase()
description = "#{method} #{event.path}"
%__MODULE__{event | description: description}
end
@doc """
Takes a list of two-element tuples representing HTTP request 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({"content-type", content_type}), do: {:content_type, content_type}
defp header_to_keyword({"referrer", referrer}), do: {:referrer, referrer}
defp header_to_keyword({"user-agent", user_agent}), do: {:user_agent, user_agent}
defp header_to_keyword({"remote-addr", ip}), do: {:remote_addr, ip}
defp header_to_keyword({"x-request-id", id}), do: {:request_id, id}
@spec method_from_string(String.t) :: method
def method_from_string(method) do
String.downcase(method)
|> String.to_existing_atom()
end
end