Basisklassen zum Modul jdk.httpserver
ulrich
2024-01-24 9d3717abd59e1672f5d8d7888ce613afdc7fb3c5
src/de/uhilger/httpserver/base/handler/FileHandler.java
@@ -21,10 +21,10 @@
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import de.uhilger.httpserver.base.HttpHelper;
import de.uhilger.httpserver.base.actor.FileActor;
import java.io.File;
import java.io.IOException;
import java.util.logging.Logger;
/**
 * Die Klasse FileHandler dient zur Auslieferung von Dateiinhalten über
@@ -39,14 +39,9 @@
 */
public class FileHandler implements HttpHandler {
  /* Der Logger fuer diesen FileHandler */
  private static final Logger logger = Logger.getLogger(FileHandler.class.getName());
  /* Headernamen */
  public static final String RANGE_HEADER = "Range";
  public static final String CONTENT_RANGE_HEADER = "Content-Range";
  //public static final String ACCEPT_RANGES_HEADER = "Accept-Ranges";
  //public static final String LAST_MODIFIED_DATE_HEADER = "Last-Modified";
  public static final String CONTENT_TYPE = "Content-Type";
  public static final String CONTENT_LENGTH = "Content-Length";
@@ -59,30 +54,19 @@
  public static final int SC_UNPROCESSABLE_ENTITY = 422;
  /* String Konstanten */
  //public static final String STR_BYTES = "bytes";
  public static final String STR_SLASH = "/";
  public static final String STR_BLANK = " ";
  public static final String STR_DASH = "-";
  public static final String STR_COMMA = ",";
  public static final String STR_DOT = ".";
  //public static final String STR_NOT_FOUND = " not found.";
  //public static final String LM_PATTERN = "EEE, dd MMM yyyy HH:mm:ss zzz";
  public static final String RANGE_PATTERN = "[^\\d-,]";
  public static final String WELCOME_FILE = "index.html";
  /* Ablageort fuer Webinhalte */
  protected final String fileBase;
  /**
   * Ein neues Objekt der Klasse FileHandler erzeugen
   *
   * @param absoluteDirectoryPathAndName der absolute Pfad und Name des
   * Ordners im Dateisystem, der die Inhalte enthaelt, die von diesem
   * Handler ausgeliefert werden sollen
   */
  public FileHandler(String absoluteDirectoryPathAndName) {
    this.fileBase = absoluteDirectoryPathAndName;
  }
  public static final String ATTR_FILE_BASE = "fileBase";
  /* moegliche Dateinamen, wenn kein Name angegeben wurde */
  public static final String ATTR_WELCOME_FILES = "welcomeFiles";
  /**
   * Die Datei ermitteln, die sich aus dem angefragten URL ergibt, prüfen,
@@ -95,41 +79,25 @@
   */
  @Override
  public void handle(HttpExchange e) throws IOException {
    String fName = getFileName(e);
    String fName = new HttpHelper().getFileName(e);
    if (fName.startsWith(STR_DOT)) {
      HttpResponder fs = new HttpResponder();
      fs.sendNotFound(e, fName);
    } else {
      File fileToDeliver = new File(e.getHttpContext().getAttributes().get(ATTR_FILE_BASE).toString(), fName);
      Headers headers = e.getRequestHeaders();
      if (headers.containsKey(RANGE_HEADER)) {
        FileActor fa = new FileActor();
        fa.serveFileParts(e, new File(fileBase, fName));
        new FileActor().serveFileParts(e, fileToDeliver);
      } else {
        if (fName.length() < 1 || fName.endsWith(STR_SLASH)) {
          fName += WELCOME_FILE;
          HttpHelper helper = new HttpHelper();
          File welcomeFile = helper.tryWelcomeFiles(e, fName);
          if(welcomeFile != null) {
            fileToDeliver = welcomeFile;
          }
        }
        HttpResponder fs = new HttpResponder();
        fs.serveFile(e, new File(fileBase, fName));
        new HttpResponder().serveFile(e, fileToDeliver);
      }
    }
  }
  /**
   * Den Namen der gew&uuml;nschten Datei aus der HTTP-Anfrage ermitteln
   *
   * @param e das Objekt mit Methoden zur Untersuchung der Anfrage sowie zum
   * Anfertigen und Senden der Antwort
   * @return Name der gew&uuml;nschten Datei
   */
  public String getFileName(HttpExchange e) {
    String ctxPath = e.getHttpContext().getPath();
    String uriPath = e.getRequestURI().getPath();
    logger.info(uriPath);
    return uriPath.substring(ctxPath.length());
  }
  public String getFileBase() {
    return this.fileBase;
  }
}
}