Portail / Sujets autour de la programmation / Programmation C/C++ sous Linux / Serveur d'application avec Qt 6 / Concepts généraux(Sommaire)

Comment et pouquoi se passer du routage.

Mise à jour du 28/07/2024.

Ce qui est écrit ici est relatif à la version 6.5.3 de Qt.

Difficultés liées au routage.

Le routage est très pratique lorsque l'on connaît à l'avance les URL ou la structure des ces URL. Un des avantages du routage et que toute requête qui ne répond pas à une "route" est ignorée ce qui accroit fortement la sécurité du serveur. Son inconvénient est qu'il est très difficile à utiliser par des serveurs génériques qui, par définition, ne connaissent pas à l'avance la structure des URL à gérer par le serveur.

L'emploi de la clause <arg> traite cette difficulté lorsque l'on connaît la structure des URL mais pas leur contenu. Ainsi si vous déclarer la route <arg>/<arg>, un URL de type /doc/app sera traité mais /doc/app/index.css sera ignoré.

Une solution pratique serait de faire appel à des expressions régulières au sein du chemin de routage mais ce fonctionnement n'est pas (encore) supporté.

Technique hors routage.

L'idée première est de récupérer directement les requêtes HTTP afin d'effectuer son propre filtrage. Comme tout objet Qt, on pense immédiatement aux signaux mais en étudiant d'un peu plus près la documentation de la classe QHttpServer on constate qu'il n'y en a plus (le premières version Qt de la classe en proposaient). La logique veut que l'on regarde alors la hiérarchie d'héritage pour voir si une classe ancêtre ne dispose pas de ce moyen.

Malheureusement le seul signal de la classe QAbstractHttpServer (seule classe ancêtre en dehors de la classe QObject) concerne les WebSockets. Toutefois, on se rend compte que cette classe est abstraite car elle dispose de deux méthodes virtuelles pures protégées. Or la méthode handleRequest(const QHttpServerRequest&, QHttpServerResponder&) : bool correspond exactement à notre besoin de capture des requêtes entrantes. En outre, la documentation précise : Surchargez cette fonction pour gérer chaque requête entrante, l'examiner puis retourner la réponse appropriée via le répondeur. Renvoie true si la requête a été traitée avec succès. Si cette méthode renvoie false, la méthode missingHandler() (seconde méthode virtuelle pure) sera appellée par la suite.

C'est très exactement ce que nous souhaitons faire et nous tenons là le moyen de contourner le routage. Il suffit de créer un objet "serveur" qui hérite de la classe QAbstractHttpServer et implémente les deux méthodes virtuelles.

Rédaction par Jean-Marie Piatte (1983-2021)