Middleware classes
==================

MicroPie defines abstract base classes for writing middleware.  Use
these classes to intercept requests, implement custom routing,
authentication, logging and other cross‑cutting concerns.  See the
:doc:`../howto/middleware` guide for practical examples.

HttpMiddleware
--------------

.. class:: HttpMiddleware

   Base class for HTTP middleware.  Subclasses must implement two
   asynchronous methods:

   .. method:: before_request(request)

      Called before the HTTP handler runs.  *request* is the
      :class:`~micropie.Request` object.  Return a dictionary
      ``{"status_code": status, "body": body, "headers": headers}``
      to short‑circuit the request and send a response immediately.
      Fields are optional and default to the current status/body and an
      empty header list.  To continue processing, return ``None``.

   .. method:: after_request(request, status_code, response_body, extra_headers)

      Called after the handler has completed but before the response
      is sent.  You may return a dictionary with updated
      ``status_code``, ``body`` and ``headers``.  Return ``None`` to
      leave the response unchanged.

WebSocketMiddleware
-------------------

.. class:: WebSocketMiddleware

   Base class for WebSocket middleware.  Subclasses must implement
   these methods:

   .. method:: before_websocket(request)

      Called before a WebSocket handler runs.  *request* is a
      :class:`~micropie.WebSocketRequest` object.  Return a dictionary
      ``{"code": code, "reason": reason}`` to reject the connection
      with the given close code and reason.  Return ``None`` to allow
      the connection.

   .. method:: after_websocket(request)

      Called after the WebSocket handler completes.  Use this to
      release resources or log activity.  Return value is ignored.
