J'ai créé une application C++ en utilisant WinSck, qui a un petit serveur (gère seulement quelques fonctionnalités dont j'ai besoin) implémenté par le serveur http. Ceci est utilisé pour communiquer avec le monde extérieur en utilisant des requêtes http. Cela fonctionne, mais parfois les requêtes ne sont pas gérées correctement, car l'analyse échoue. Maintenant, je suis tout à fait sûr que les demandes sont correctement formées, puisqu'elles sont envoyées par les principaux navigateurs web comme firefox/chrome ou perl/C# (qui ont des modules http/dll). Après un certain débogage, j'ai découvert que le problème était en fait de recevoir le message. Lorsque le message arrive dans plus d'une partie (il n'est pas lu dans un appel recv()
), l'analyse échoue parfois. J'ai traversé de nombreux essais sur la façon de résoudre cela, mais rien ne semble assez fiable. Ce que je fais maintenant, c'est que je lis dans les données jusqu'à ce que je trouve "\r\n\r\n"
séquence qui indique la fin de l'en-tête. Si WSAGetLastError()
signale quelque chose d'autre que 10035 (connexion fermée/échec) avant qu'une telle séquence soit trouvée, je rejette le message. Quand je sais que j'ai tout l'en-tête je l'analyse et cherche des informations sur la longueur du corps. Cependant, je ne suis pas sûr si cette information est obligatoire (je ne pense pas) et que devrais-je faire s'il n'y a pas de telles informations - cela signifie-t-il qu'il n'y aura pas d'organe? Un autre problème est que je ne sais pas si je devrais chercher un "\r\n\r\n"
après le corps (si sa longueur est supérieure à zéro).Comment analyser correctement les requêtes HTTP entrantes
Est-ce que quelqu'un sait comment analyser de manière fiable un message http?
Remarque: je sais qu'il existe des implémentations de serveurs http là-bas. Je veux le mien pour diverses raisons. Et oui, réinventer la roue est mauvais, je le sais aussi.
À moins que vous ne le fassiez pour le plaisir, regardez le lien http-analyseur que Jack a fourni ci-dessous. Il semble brillant, et ne prétend pas détourner votre socket/quoi que ce soit. –
@Matt Joiner: je l'ai regardé et il semble en effet très bien. Mais j'ai vraiment besoin d'écrire le mien qui supporte juste une fraction de toutes les fonctionnalités http et en même temps connaît quelques commandes spéciales. Si j'avais besoin d'un serveur http complet, je n'écrirais certainement pas le mien. – PeterK
Gardez à l'esprit que le code fourni est __tiny__ et ne vous oblige à rien. Vous pouvez l'arrêter, l'ignorer et l'emballer comme bon vous semble en personnalisant les quelques rappels qu'il fournit. Je sympathise avec le désir de faire les choses vous-même, mais cela vous évitera des heures de débogage et des bugs en raison d'une entrée imprévue plus tard. –