View Source Tesla.Middleware behaviour (tesla v1.8.0)

The middleware specification.

Middleware is an extension of basic Tesla functionality. It is a module that must implement Tesla.Middleware.call/3.

Middleware options

Options can be passed to middleware in second param of Tesla.Builder.plug/2 macro:

plug Tesla.Middleware.BaseUrl, "https://example.com"

or inside tuple in case of dynamic middleware (Tesla.client/1):

Tesla.client([{Tesla.Middleware.BaseUrl, "https://example.com"}])

Ordering

The order in which middleware is defined matters. Note that the order when sending the request matches the order the middleware was defined in, but the order when receiving the response is reversed.

For example, Tesla.Middleware.DecompressResponse must come after Tesla.Middleware.JSON, otherwise the response isn't decompressed before it reaches the JSON parser.

Writing custom middleware

Writing custom middleware is as simple as creating a module implementing Tesla.Middleware.call/3.

See Tesla.Middleware.call/3 for details.

Examples

defmodule MyProject.InspectHeadersMiddleware do
  @behaviour Tesla.Middleware

  @impl true
  def call(env, next, _options) do
    IO.inspect(env.headers)

    with {:ok, env} <- Tesla.run(env, next) do
      IO.inspect(env.headers)
      {:ok, env}
    end
  end
end

Summary

Callbacks

Invoked when a request runs.

Callbacks

Link to this callback

call(env, next, options)

View Source
@callback call(env :: Tesla.Env.t(), next :: Tesla.Env.stack(), options :: any()) ::
  Tesla.Env.result()

Invoked when a request runs.

  • (optionally) read and/or writes request data
  • calls Tesla.run/2
  • (optionally) read and/or writes response data

Arguments

  • env - Tesla.Env struct that stores request/response data
  • next - middlewares that should be called after current one
  • options - middleware options provided by user