Les HOOKS (ou intercepteurs d’évènements) permettent d’exécuter du code automatiquement à des moments clés du cycle de vie d’une requête LightREST.

Ils servent à gérer proprement tous les traitements transverses (non métier), sans polluer le code des routes : sécurité, logs, métriques, traçage, normalisation des réponses, gestion centralisée des erreurs, etc.

Un handler de Hook reçoit en paramètre une structure EventInfo qui contient :
– Le type de l’évènement intercepté
– l’objet lrRequest de la requête en cours (dont il peut renseigner le membre CustomData à l’attention de handlers qui seront exécutés ultérieurement)
– l’objet lrResponse (à compléter éventuellement)
– un éventuel message (pour les événements EVE_INFO, EVE_WARNING, EVE_ERROR et EVE_PANIC)
– le Tag de la route en cours d’exécution

Un handler de Hook renvoie une valeur de type EventReturn :
– EVE_OK : le traitement de la route continue normalement
– EVE_ABORT : le traitement est interrompu. Le contenu de la réponse (headers+body) est envoyé au client (avec une probable erreur HTTP)
– EVE_REPLACE : utilisé pour un événement EVE_BEFORE_HANDLER il permet de court-circuiter l’exécution du handler par défaut de la route en cours

Le projet WinDev LightRestHooksDemo (présent dans la distribution à partir de la v3.2) illustre les fondamentaux des Hooks.


Intérêt

Un hook est une fonction appelée par LightREST à un instant précis du traitement d’une requête.

Il permet notamment de :


Avantages clés


Cycle de vie d’une requête et position des hooks

Le traitement typique d’une requête REST suit ce schéma :

  1. Ouverture d’une connexion (EVE_CONNECT)
  2. Réception de la requête REST (EVE_RECEIVED)
  3. Exécution du hook avant handler (EVE_BEFORE_HANDLER)
  4. Exécution du handler de route
  5. Exécution du hook après handler (EVE_BEFORE_HANDLER)
  6. Ajout des éventuels headers automatiques (niveau serveur et route)
  7. Exécution du hook avant envoi de la réponse (EVE_RESULT)
  8. Envoi du résultat au client REST

En cas d’erreur (erreur applicative, panic, timeout…), des hooks spécifiques peuvent être exécutés afin de produire une réponse cohérente et effectuer les nettoyages nécessaires.

⚠️ Certains hooks peuvent être exécutés même si le client a déjà coupé la connexion (timeout d’écriture, socket fermé).


Principe

Règles importantes


Evénements du mécanisme de hooks

Les Hooks peuvent être déclarés niveau Serveur et/ou Route selon leur type. Un même événement « Hooké » sur les 2 niveaux sera d’abord exécuté sur l’objet Serveur et ensuite sur l’objet Route.

Plusieurs événements peuvent être attachés à un même Hook (par exemple un même handler pourra gérer EVE_ERROR, EVE_WARNING et EVE_PANIC).

EVE_INFOHook serveur. Information sur l’exécution
EVE_STARTINGHook serveur. En cours de démarrage
EVE_STARTEDHook serveur. Démarré
EVE_STOPPINGHook serveur. En cours d’arrêt
EVE_STOPPEDHook serveur. Arrêté
EVE_CONNECTHook serveur. Nouvelle connexion (permet par exemple de filtrer les connexions par adresse IP)
EVE_RECEIVEDHook serveur et route. Réception d’une requête REST
EVE_AUTH_FAILEDHook serveur et route. Authentification échouée
EVE_BEFORE_HANDLERHook serveur et route. Avant exécution de la route
EVE_AFTER_HANDLERHook serveur et route. Après exécution de la route
EVE_RESULTHook serveur et route. Avant envoi du résultat (étape ultime pour vérifier, compléter, chiffrer, signer, filtrer, limiter, journaliser, …) la réponse avant envoi au client.
EVE_ERRORHook serveur. Erreur lors de l’exécution
EVE_WARNINGHook serveur. Warning lors de l’exécution
EVE_PANICHook serveur. Erreur grave lors de l’exécution

Exemple