Current section

Files

Jump to
timber lib timber events http_server_request_event.ex
Raw

lib/timber/events/http_server_request_event.ex

defmodule Timber.Events.HTTPServerRequestEvent do
@moduledoc """
The `HTTPServerRequestEvent` tracks *incoming* HTTP requests. This gives you structured
insight into the HTTP requests coming into your app.
Timber can automatically track incoming HTTP requests if you use a `Plug` based framework.
See `Timber.Integrations.ContextPlug` and `Timber.Integerations.EventPlug`. Also, the
`README.md` outlines how to set these up.
"""
alias Timber.Utils.HTTPEvents, as: UtilsHTTPEvents
@type t :: %__MODULE__{
body: String.t | nil,
host: String.t,
headers: map | nil,
method: String.t,
path: String.t,
port: pos_integer | nil,
query_string: String.t | nil,
request_id: String.t | nil,
scheme: String.t
}
@enforce_keys [:host, :method, :scheme]
defstruct [:body, :host, :headers, :method, :path, :port, :query_string, :request_id, :scheme]
@doc """
Builds a new struct taking care to:
* Parsing the `:url` and mapping it to the appropriate attributes.
* Normalize header values so they are consistent.
* Normalize the method.
* Removes "" or nil values.
"""
@spec new(Keyword.t) :: t
def new(opts) do
opts =
opts
|> Keyword.delete(:body) # Don't store the body for now. We store the params in the ControllerCallEvent. We can re-enable this upon request.
|> Keyword.update(:headers, nil, fn headers -> UtilsHTTPEvents.normalize_headers(headers) end)
|> Keyword.update(:method, nil, &UtilsHTTPEvents.normalize_method/1)
|> Keyword.merge(UtilsHTTPEvents.normalize_url(Keyword.get(opts, :url)))
|> Keyword.delete(:url)
|> Enum.filter(fn {_k,v} -> !(v in [nil, ""]) end)
struct!(__MODULE__, opts)
end
@doc """
Message to be used when logging.
"""
@spec message(t) :: IO.chardata
def message(%__MODULE__{method: method, path: path}),
do: [method, " ", path]
end