io.pedestal.interceptor

Public API for creating interceptors, and various utility fns for common interceptor creation patterns.

*default-handler-names*

dynamic

added in 0.8.0

If true (the default) then functions converted to interceptor will get a default interceptor name based on the function class name.

If false, for compatibility, the interceptor will have no :name.

The system property io.pedestal.interceptor.disable-default-handler-names (or environment variable PEDESTAL_DISABLE_DEFAULT_HANDLER_NAMES) if true, will default this to false.

component->interceptor

added in 0.8.0

(component->interceptor interceptor-name component)

Converts a component record into an interceptor. The component must implement at least one of the Handler, OnEnter, OnLeave, or OnError protocols.

A component can implement the IntoInterceptor protocol and base the -interceptor method on this function.

Returns an interceptor record.

definterceptor

macro

added in 0.8.0

(definterceptor record-name fields & opts+specs)

Defines an interceptor as a Clojure record. This is specifically useful for components.

The interceptor’s name will be the record’s name as a namespace qualified keyword.

After the optional options map, and before the normal protocol/method specs, additional methods may be added:

  • (handle [this context])
  • (enter [this context])
  • (leave [this context])
  • (error [this context exception])

For each of these, definterceptor will provide the matching protocol.

Example:

(definteceptor upcase []

  (enter [_ context] (update-in context [:request :query-params :id] string/upper-case)))

The class name will match the record-name (which is typically kebab-cased). That is (definterceptor foo-bar ...) will generate the same class name as (defrecord foo-bar ...) even though this is not the normal Pascal Case naming convention for most records.

The record implements the IntoInterceptor protocol; see component->interceptor.

The normal map->record and ->record construction functions are generated.

Handler

protocol

added in 0.8.0

members

handle

(handle _ request)

Handles a request map and returns a response map, or a channel that conveys the response map.

interceptor

(interceptor t)

Given a value, produces and returns an Interceptor (Record)

t can be anything that extends the IntoInterceptor protocol; notably, this includes functions, which will be wrapped as interceptors, but act as handlers (a handler receives the request map and returns the response map).

interceptor-name

(interceptor-name n)

Ensures that an interceptor name (to eventually be the :name key of an Interceptor) is either a keyword or nil. Generally, interceptor names should be namespace-qualified keywords.

interceptor?

(interceptor? o)

Returns true if object o is an instance of the Interceptor record; the result of invoking interceptor.

IntoInterceptor

protocol

Conversion into Interceptor, ready for execution as part of an interceptor chain.

members

-interceptor

(-interceptor t)

Given a value, produce an Interceptor Record.

OnEnter

protocol

added in 0.8.0

members

enter

(enter _ context)

Corresponds to the :enter phase of a standard interceptor; passed the context and returns the (new) context, or a core.async channel that will convey the new context.

OnError

protocol

added in 0.8.0

members

error

(error _ context exception)

Corresponds to the :error phase of a standard interceptor; passed the context and an exception, and returns the (new) context, or a core.async channel that will convey the new context.

OnLeave

protocol

added in 0.8.0

members

leave

(leave _ context)

Corresponds to the :leave phase of a standard interceptor; passed the context and returns the (new) context, or a core.async channel that will convey the new context.

valid-interceptor?

(valid-interceptor? o)