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.