#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <FS.h> // muss vor <detail\RequestHandlersImpl.h> stehen
#include <detail\RequestHandlersImpl.h>

String ssid("your ssid");
String password("your password");

ESP8266WebServer webserver(80); // Webserver-Instanz für Port 80 erstellen

void notFound();      // Sendet "Not Found"-Seite
void handleUnknown(); // Liefert Web-Seiten aus dem SPIFFS

void setup()
{ Serial.begin(74880);

  Serial.println("\n");
  Serial.flush();
  delay(100);
  Serial.println("                            ");
  Serial.println("----------------------------");
  Serial.println("Project: ESP8266-MinWebServer");
 
  // Initialize file system.
  if (!SPIFFS.begin())
  { Serial.println("SPIFFS nicht initialisiert!");
    while (1)  // ohne SPIFFS geht es sowieso nicht...
    { yield();
    }
  }
  Serial.println("SPIFFS ok");

  // Mit WLAN verbinden
  Serial.println("Connecting to " + ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid.c_str(), password.c_str());
  while (WiFi.waitForConnectResult() != WL_CONNECTED)
  { Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }
  Serial.print("Connected to " + ssid + ", IP: " );
  Serial.println(WiFi.localIP());

  // Webserver initilaisieren
  // Lenkt die Abfrage unbekanter Dateien auf handleUnknown
  webserver.onNotFound(handleUnknown); 
  // Die Abfrage auf die reine URL '/' wird auf '/index.html' umgelenkt
  webserver.serveStatic("/", SPIFFS, "/index.html");

  webserver.begin(); // Web-Server starten
  Serial.println("HTTP Server running on Port 80");
}

void loop()
{ webserver.handleClient(); // auf neuen HTTP-Request prüfen
}


// Sendet "Not Found"-Seite
void notFound()
{ String HTML = F("<html><head><title>404 Not Found</title></head><body>"
                  "<h1>Not Found</h1>"
                  "<p>The requested URL was not found on this webserver.</p>"
                  "</body></html>");
  webserver.send(404, "text/html", HTML);
}

// Es wird versucht, die angegebene Datei aus dem SPIFFS hochzuladen
void handleUnknown()
{ String filename = webserver.uri();

  File pageFile = SPIFFS.open(filename, "r");
  if (pageFile)
  { String contentTyp = StaticRequestHandler::getContentType(filename);
    size_t sent = webserver.streamFile(pageFile, contentTyp);
    pageFile.close();
  }
  else
    notFound();
}