Modifiez le serveur pour qu'il effectue le typage des ressources. Pour cela, on utilisera le fichier
mimetypes (lisible comme le fichier de configuration par java.io.Properties.load())
contenant la liste des extensions possibles et les mime type associés. Le nom de ce fichier sera
indiqué dans le fichier de configuration (champ MimeTypeFile). Si l'extension du fichier
demandé n'est pas connue, le serveur renverra un mime type par défaut (e.g.: text/plain)
indiqué dans le fichier de configuration (champ DefaultMimeType).
3. Traitement multi-thread
Actuellement, le serveur ne peut traiter qu'une requête à la fois. Pour pourvoir traiter plusieurs
requêtes simultanément, nous allons créer des objets capables de prendre en charge les requêtes
et qui s'executeront dans différentes threads . Ces objets seront des instances d'une nouvelle
classe : httpd.HttpConnection. Pour que ces instances soient threadables, cette classe doit
implémenter l'interface java.lang.Runnable. Une grande partie du code de la classe Httpd sera
delocalisée dans cette nouvelle classes (au sein de la méthode run()).
La boucle de traitement des requêtes (située dans la classe Httpd) devient alors :
Ouvrir une socket sur le port indiqué
Boucle infinie
Attendre une requête
Récuperer la socket de travail
Créer une instance de HttpConnection avec en parametre la socket et la
configuration
Fin de boucle
La méthode run() de la classe HttpConnection contient le reste du traitement :
Lire le contenu de la requête
Analyser la requête
Construire la réponse adaptée
Renvoyer la réponse
Fermer la socket
4. Journalisation des accés
On souhaite pouvoir suivre l'ensemble des requêtes auquelles repond notre serveur. Pour cela, on
enregistre chaque requête traitée dans un fichier de journalisation. Les enregistrement sont de la
forme :
[adresse IP du client] [date] [requête] [status de la reponse]
Exemple :
[127.0.0.1] [Sat Mar 08 14:51:47] [GET /icons/dir.gif HTTP/1.0] [200]
[128.93.7.60] [Sat Mar 08 14:53:44] [GET /docs/index.html HTTP/1.0] [404]
Ecrivez une classe httpd.HttpLog de la forme :
package httpd;
class HttpLog {