FileURIHandler.java

package fr.umlv.ji.tcp.server.http;
import java.io.*;
import java.util.*;
import java.text.*;
import java.net.URI;
import java.util.logging.Logger;
import java.util.prefs.Preferences;
/** Gestionnaire de requête pour les fichiers statiques. */
class FileURIHandler extends URIHandler {
  // Divers attributs de la classe
  protected String root;
  protected MIMEHelper helper;
  private DateFormat df =
    new SimpleDateFormat("EEE, d MMM yyyy hh:mm:ss z", Locale.US);
  /** Initialisation du gestionnaire. */
  public FileURIHandler(HTTPService httpservice) throws IOException {
    service = httpservice;
    // Récupération du répertoire racine
    String s = service.getPreferences().get("rootDirectory", ".docs");
    root = (new File(s)).getCanonicalPath();
    helper = service.getMIMEHelper();
  }
  /** Réponse à la méthode GET. */
  public void get(Request request, Response response) throws IOException {
    service.getLogger().info("Request URI is: " + request.getURI());
    String s = request.getURI().getPath();
    File file = new File(root, s);
    // Si le fichier est un répertoire, retourner le fichier
    // index.html dans ce répertoire
    if (file.isDirectory()) {
      file = new File(file, "index.html");
    }
    file = file.getCanonicalFile();
    s = file.toString();
    // Vérifie que le fichier est accessible et qu'il fait bien partie
    // d'un sous-répertoire de la racine
    if (!file.exists()||
    !file.canRead()||
    !s.startsWith(root)) {
      response.setError(Response.NOT_FOUND);
    } else {
      response.setContentType(helper.guessContentType(s));
      response.setContentLength(file.length());
      Date d = new Date(file.lastModified());
      response.setHeader("Last-Modified",df.format(d));
      response.setInputStream(new FileInputStream(file));
    }
  }
}