The log_level(%{method: \"HEAD\"}) clause never matched because
Plug.Head rewrites the method to \"GET\" before Plug.Telemetry's
register_before_send callback fires, so by log time conn.method is
\"GET\". Stash the original method in private before Plug.Head runs
and key the filter off it.
86 lines
3.1 KiB
Elixir
86 lines
3.1 KiB
Elixir
defmodule MicrowavepropWeb.Endpoint do
|
|
use Phoenix.Endpoint, otp_app: :microwaveprop
|
|
|
|
# The session will be stored in the cookie and signed,
|
|
# this means its contents can be read but not tampered with.
|
|
# Set :encryption_salt if you would also like to encrypt it.
|
|
@session_options [
|
|
store: :cookie,
|
|
key: "_microwaveprop_key",
|
|
signing_salt: "FBet7+Mi",
|
|
same_site: "Lax"
|
|
]
|
|
|
|
socket "/live", Phoenix.LiveView.Socket,
|
|
websocket: [connect_info: [session: @session_options]],
|
|
longpoll: [connect_info: [session: @session_options]]
|
|
|
|
# Serve at "/" the static files from "priv/static" directory.
|
|
#
|
|
# When code reloading is disabled (e.g., in production),
|
|
# the `gzip` option is enabled to serve compressed
|
|
# static files generated by running `phx.digest`.
|
|
plug Plug.Static,
|
|
at: "/",
|
|
from: :microwaveprop,
|
|
gzip: not code_reloading?,
|
|
only: MicrowavepropWeb.static_paths(),
|
|
raise_on_missing_only: code_reloading?
|
|
|
|
if code_reloading? do
|
|
plug Tidewave
|
|
end
|
|
|
|
# Code reloading can be explicitly enabled under the
|
|
# :code_reloader configuration of your endpoint.
|
|
if code_reloading? do
|
|
socket "/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket
|
|
plug Phoenix.LiveReloader
|
|
plug Phoenix.CodeReloader
|
|
plug Phoenix.Ecto.CheckRepoStatus, otp_app: :microwaveprop
|
|
end
|
|
|
|
plug Phoenix.LiveDashboard.RequestLogger,
|
|
param_key: "request_logger",
|
|
cookie_key: "request_logger"
|
|
|
|
plug Plug.RequestId
|
|
plug MicrowavepropWeb.Plugs.RemoteIp
|
|
# Plug.Head (below) rewrites method=HEAD to "GET" before
|
|
# Plug.Telemetry's register_before_send callback fires, so a
|
|
# `log_level(%{method: "HEAD"})` clause never matches. Capture
|
|
# the original method in private here so the log filter can still
|
|
# see HEAD requests and suppress them.
|
|
plug :stash_request_method
|
|
plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint], log: {__MODULE__, :log_level, []}
|
|
|
|
plug Plug.Parsers,
|
|
parsers: [:urlencoded, :multipart, :json],
|
|
pass: ["*/*"],
|
|
json_decoder: Phoenix.json_library()
|
|
|
|
plug Plug.MethodOverride
|
|
plug Plug.Head
|
|
plug Plug.Session, @session_options
|
|
plug MicrowavepropWeb.Router
|
|
|
|
@doc false
|
|
# Match on `request_path` rather than `path_info` because `Plug.forward/4`
|
|
# (used by `forward "/metrics", MetricsPlug` in the router) rewrites
|
|
# `path_info` to the unmatched remainder before dispatching to the
|
|
# forwarded plug. `MetricsPlug` calls `send_resp/2` inside that
|
|
# dispatch, so `Plug.Telemetry`'s `register_before_send` callback sees
|
|
# `path_info: []` / `script_name: ["metrics"]` and a clause keyed on
|
|
# `path_info` never matches. `request_path` is set once by the adapter
|
|
# and is stable across forward, so it's the reliable discriminator.
|
|
def log_level(%{request_path: "/health"}), do: false
|
|
def log_level(%{request_path: "/live"}), do: false
|
|
def log_level(%{request_path: "/metrics"}), do: false
|
|
def log_level(%{request_path: "/metrics/" <> _}), do: false
|
|
def log_level(%{private: %{original_method: "HEAD"}}), do: false
|
|
def log_level(_conn), do: :info
|
|
|
|
defp stash_request_method(conn, _opts) do
|
|
Plug.Conn.put_private(conn, :original_method, conn.method)
|
|
end
|
|
end
|