Portail / Sujets autour de la programmation / Programmation C/C++ sous Linux / Serveur d'application avec Qt 6 / Documentation technique(Sommaire)

Particularités de la classe QHttpServer.

Mise à jour du 03/08/2024.

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

Plate-forme de test.

Les premiers tests de la classe WebSite via l'application pas étaient surprenant dans la mesure où les fichiers du projet Bootstrap étaient chargés mais non appliqués par le navigateur.

Pour y voir plus clair, il est nécessaire d'analyser les blocs HTTP, en-têtes comprises. Pour cela, nous avons utilisé le navigateur FireFox en lui déclarant un proxy. Ce proxy est constitué de l'application mitmproxy. A l'instar de l'application fiddler sous Windows, ce proxy capture les échanges HTTP et donne le détail d'un bloc HTTP quelconque en regroupant chaque échange (requête et réponse) sur une même ligne.

Comme ce proxy est sur la machine locale, il n'est pas possible d'utiliser des URL avec localhost. En effet, une requête qui utilise localhost ne sort pas de la boucle locale (interface de bas niveau) et n'est donc pas capturée par le proxy. Il faut donc utiliser l'adresse IP d'une des interfaces de haut niveau de la machine.

Comme on veut limiter l'utilisation du proxy au seul projet en test (sinon on a des problèmes avec le protocole HTTPS), on ne configure pas le proxy au niveau du système mais au niveau du navigateur utilisé pour ces tests. Dans notre cas, nous utilisons FireFox dont la configuration manuelle du proxy est aisée.

En-têtes HTTP.

Dès que nous avons mis en oeuvre la plate-forme décrite ci-dessus, on s'est aperçu que l'en-tête Content-Type existait deux fois. De même, l'en-tête Content-Length apparait alors qu'elle n'avait pas été fixée.

L'nalyse du code a rapidement montré que la seconde en-tête est ajoutée via l'exécution de la méthode HttpResponse::fromHttpResponse() qui transforme un objet de classe HttpResponse en un objet de classe QHttpServerResponse.

En fait c'est le constructeur de la classe QHttpServerResponse(const QByteArray&, ...) qui ajoute la seconde en-tête Content-Type. Toutefois, comme le type MIME est détecté via le contenu du corps transmis au constructeur, il est souvent erroné. Ainsi un contenu CSS est vu comme text/plain et non pas comme text/css. Les fichiers JavaScript sont également mal interprétés.

Ainsi, lorsque l'on souhaite préciser le contenu de l'en-tête Content-Typeon doit supprimer cette en-tête une fois l'objet QHttpServerResponse créé, puis, ajouter alors cet en-tête avec sa bonne valeur.

L'en-tête Content-Length est ajoutée par l'infrastructure au moment de l'envoi. Elle est forcément exacte et ne doit donc pas être précisée.

Deux conlusions s'imposent ici :

  1. Lorsque deux en-têtes ou plus de même nom existent, c'est la dernière qui est prise en compte par FireFox.
  2. Sur la plupart des navigateurs, si le type MIME associé à une ressource CSS ou JavaScript n'est pas respectivement text/css ou text/javascript, ces ressources sont ignorées.

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