package javacodebook.thread.httpserver;

import java.net.*;
import java.io.*;

/**
 * Der Hauptthread des HTTP-Servers. Er nimmt Anfragen von Clients entgegen und
 * leitet diese weiter an einen RequestHandler. Jede einzelne Anfrage wird in
 * einem eigenen Thread bearbeitet. Damit wird sichergestellt, das Anfragen von
 * mehreren Clients gleichzeitig beantwortet werden können.
 *
 * @author Mark Donnermeyer
 */
public class TinyHttpDaemon extends Thread {
    private int     port;
    private String  docRoot;
    
    /**
     * Damit der HTTP-Server arbeiten kann braucht er die Information, auf
     * welchem Port der Server horchen soll und wo die HTML-Seiten liegen.
     */
    public TinyHttpDaemon(String docRoot, int port) {
        this.docRoot = docRoot;
        this.port = port;
    }
    
    public void run() {
        ServerSocket socket;
        Socket request;
        RequestHandler handler;
        
        System.out.println("Starte HttpDaemon ...");
        try {
            socket = new ServerSocket(this.port);
        }
        catch (Exception e) {
            System.err.println(
                "Konnte HttpDaemon nicht starten. " +
                "Fehlermeldung: " + e.getMessage()
            );
            return;
        }
        
        // Die Hauptroutine des HTTP-Servers
        System.out.println("HttpDaemon bereit.");
        while(true) {
            try {
                // Der Aufruf von accept() blockiert solange, bis sich ein
                // neuer Client mit einem Request an den Server wendet
                request = socket.accept();
                
                // Für jeden Request wird ein neuer Thread erzeugt.
                handler = new RequestHandler(this.docRoot, request);
                handler.start();
            }
            catch (Exception e) {
                System.err.println(
                    "Konnte Anfrage nicht bearbeiten. " +
                    "Grund: " + e.getMessage()
                );
            }
        }
    }
}