Packages
tesla
0.7.2
1.20.0
1.18.3
1.18.2
1.18.1
1.18.0
1.17.0
1.16.0
1.15.3
1.15.2
1.15.1
1.15.0
1.14.3
1.14.2
1.14.1
1.14.0
1.13.2
1.13.1
1.13.0
1.12.3
1.12.2
1.12.1
1.12.0
1.11.2
1.11.1
1.11.0
1.10.3
1.10.2
1.10.1
1.10.0
1.9.0
1.8.1
retired
1.8.0
1.7.0
1.6.1
1.6.0
1.5.1
1.5.0
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.3
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.0
1.0.0
1.0.0-beta.1
0.10.0
0.9.0
0.8.0
0.7.2
0.7.1
0.7.0
0.6.0
0.5.2
0.5.1
0.5.0
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.2.2
0.2.1
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
HTTP client library, with support for middleware and multiple adapters.
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/tesla/middleware/logger.ex
defmodule Tesla.Middleware.Logger do
require Logger
def call(env, next, _opts) do
{time, env} = :timer.tc(Tesla, :run, [env, next])
_ = log(env, time)
env
rescue
ex in Tesla.Error ->
stacktrace = System.stacktrace()
_ = log(env, ex)
reraise ex, stacktrace
end
defp log(env, %Tesla.Error{message: message}) do
Logger.error "#{normalize_method(env)} #{env.url} -> #{message}"
end
defp log(env, time) do
ms = :io_lib.format("~.3f", [time / 1000])
message = "#{normalize_method(env)} #{env.url} -> #{env.status} (#{ms} ms)"
cond do
env.status >= 400 -> Logger.error message
env.status >= 300 -> Logger.warn message
true -> Logger.info message
end
end
defp normalize_method(env) do
env.method |> to_string() |> String.upcase()
end
end
defmodule Tesla.Middleware.DebugLogger do
require Logger
def call(env, next, _opts) do
env
|> log_request
|> log_headers("> ")
|> log_params("> ")
|> log_body("> ")
|> Tesla.run(next)
|> log_response
|> log_headers("< ")
|> log_body("< ")
rescue
ex in Tesla.Error ->
stacktrace = System.stacktrace()
_ = log_exception(ex, "< ")
reraise ex, stacktrace
end
def log_request(env) do
_ = Logger.debug "> #{env.method |> to_string |> String.upcase} #{env.url}"
env
end
def log_response(env) do
_ = Logger.debug ""
_ = Logger.debug "< HTTP/1.1 #{env.status}"
env
end
def log_headers(env, prefix) do
for {k,v} <- env.headers do
_ = Logger.debug "#{prefix}#{k}: #{v}"
end
env
end
def log_params(env, prefix) do
for {k,v} <- env.query do
_ = Logger.debug "#{prefix} Query Param '#{k}': '#{v}'"
end
env
end
def log_body(%Tesla.Env{} = env, _prefix) do
Map.update!(env, :body, & log_body(&1, "> "))
end
def log_body(nil, _), do: nil
def log_body([], _), do: nil
def log_body(%Stream{} = stream, prefix), do: log_body_stream(stream, prefix)
def log_body(stream, prefix) when is_function(stream), do: log_body_stream(stream, prefix)
def log_body(data, prefix) when is_binary(data) or is_list(data) do
_ = Logger.debug ""
_ = Logger.debug prefix <> to_string(data)
data
end
def log_body_stream(stream, prefix) do
_ = Logger.debug ""
Stream.each stream, fn line -> Logger.debug prefix <> line end
end
defp log_exception(%Tesla.Error{message: message, reason: reason}, prefix) do
_ = Logger.debug prefix <> message <> " (#{inspect reason})"
end
end