Difficultées rencontrées
Etude des sources d'Apache
L'examen des sources d'apache, notamment du module mod_example qui explique comment ajouter un module, nous a permis de comprendre comment Apache fonctionne.
Ainsi, les différentes procédures d'un modules sont appelées par le serveur dans un ordre précis. Certaines de ces procédures (comme l'initialisation) ne sont appelées qu'une seule fois au début, et d'autre à chaque traitement de requête. Pour éviter de surcharger le serveur, ces procédures sont exécutées par un des fils du serveur, que l'on ne connait pas à l'avance.
Conséquences sur le module Firewall
Le module Firewall doit permettre de compter le nombre de requêtes par minutes en provenance de hosts quelconques sur une URL donnée du serveur. Pour cela, on a besoin d'une table de hashage dans laquelle on stocke les temps auxquels les URLS ont été accédées pour un host donné. On a donc une structure de file (dynamique) contenant le temps de la requête.
Or cette structure ne peut être globale au module car les procédures de traitement des requêtes s'effectuent dans les fils du serveur (fork). On a donc autant de table de hashage (avec leur files) que de fils.
La solution évidente était de créer une zone de mémoire partagée à l'initialisation du module.
Or la réservation de cette mémoire se fait de façon statique (taille connue à l'avance), ce qui empeche l'utilisation des files (dynamiques).
Solution adoptée
Dans un premier temps, nous avons pensé utiliser un tableau pour implémenter la file. Le problème est que la dimension de ce tableau (le nombre de requêtes avec leur temps associé) n'est pas connu à l'avance. Nous avons donc opté pour une structure qui compte le nombre de requêtes sans stocker le temps. On stocke le temps auquel a été faite la première requête, et à chaque nouvelle requête, on incrémente le compteur si le temps de la nouvelle requête est compris dans l'intervalle autorisé (passé en configuration). Si on fait plus de requêtes que le nombre autorisé pendant cet intervalle, on renvoie une erreur. Si le temps de la nouvelle requête est supréieur à l'intervalle, on remet le compteur a zéro.