The servlet interceptor is the bridge between the Java Servlet API and Pedestal’s interceptor chain. It is created when an application calls api:create-server[] or api:create-servlet[]; ultimately, the function api:service-fn[], calls api:http-interceptor-service-fn[ns=io.pedestal.http.impl.servlet-interceptor], results in the ::http/service-fn context map key; this is a function that accepts the servlet, servlet request and servlet response (as defined by the Servlet API) and executes an interceptor chain, as a chain provider, to handle an incoming HTTP request.
The service function performs the following tasks:
Sets up the context-map.adoc and request-map.adoc
Executes the interceptor queue (:enter, then :leave)
Catches any exceptions that aren’t handled by error-handling.adoc within the interceptors
Writes the final response, using the response-map.adoc
Part of this work is accomplished by adding new keys to the default context map; beyond that, additional interceptors are prepended:
The stylobate interceptor primarily handles otherwise uncaught unhandled exceptions that occur during interceptor chain execution.
Responsible for converting the :response key in the context, when present, into a response delivered to the client; this may include async streaming.
In very rare cases, different interceptors may provide different parts of response. Ultimately, the response must be a valid Ring response, but different interceptors may provide different parts of the response (the :body or certain values in the :headers map).
If your application requires this, be very careful about early termination.
Put the initial value into the response map in the last :enter function, then use the :leave functions to refine that value.
Put the initial value into the context under a different key and refine that value in either :enter or :leave functions. When the response is complete, transfer the response map to the :response key.
Can you improve this documentation?Edit on GitHub
cljdoc is a website building & hosting documentation for Clojure/Script libraries
× close