/*
** This file is part of Filius, a network construction and simulation software.
**
** Originally created at the University of Siegen, Institute "Didactics of
** Informatics and E-Learning" by a students' project group:
** members (2006-2007):
** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding,
** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer
** supervisors:
** Stefan Freischlad (maintainer until 2009), Peer Stechert
** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de>
** and Stefan Freischlad
** Filius is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 2 of the License, or
** (at your option) version 3.
**
** Filius is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
** PURPOSE. See the GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with Filius. If not, see <http://www.gnu.org/licenses/>.
*/
package filius.software.www;
import filius.Main;
import filius.software.clientserver.ServerMitarbeiter;
import filius.software.system.Datei;
import filius.software.transportschicht.TCPSocket;
/*
*
*/
public class WebServerMitarbeiter extends ServerMitarbeiter {
/**
* Konstruktor: setzt den webserver, socket und webkonfig. startet
* anschließend den Thread
*/
public WebServerMitarbeiter(WebServer server, TCPSocket socket) {
super(server, socket);
}
private HTTPNachricht verarbeiteAnfrage(HTTPNachricht anfrage) {
Main.debug.println("INVOKED ("+this.hashCode()+", T"+this.getId()+") "+getClass()+" (WebServerMitarbeiter), verarbeiteAnfrage("+anfrage+")");
HTTPNachricht antwort;
WebServerPlugIn plugin;
String dateipfad;
Datei datei;
String tmp = null;
antwort = new HTTPNachricht(HTTPNachricht.SERVER);
if (anfrage.getPfad().equals("/")) {
dateipfad = "index.html";
}
else if (anfrage.getPfad().startsWith("/")) {
dateipfad = anfrage.getPfad().substring(1);
}
else {
dateipfad = anfrage.getPfad();
}
// add subdirectory in front of 'dateipfad' according to vhost settings
String vHostRelPath = ((WebServer) server).vhostPrefix(anfrage.getHost());
if(!vHostRelPath.endsWith("/")) vHostRelPath+="/";
dateipfad = vHostRelPath + dateipfad;
if (dateipfad.startsWith("/")) {
dateipfad = dateipfad.substring(1);
}
plugin = ((WebServer) server).holePlugin(dateipfad);
if (plugin != null) {
if (anfrage.getMethod().equals(HTTPNachricht.POST)) {
tmp = plugin.holeHtmlSeite(anfrage.getDaten());
}
else {
tmp = plugin.holeHtmlSeite(null);
}
if (tmp != null) {
antwort.setDaten(tmp);
antwort.setContentType(HTTPNachricht.TEXT_HTML);
antwort.setStatusCode(200);
}
else {
antwort.setStatusCode(500);
}
}
else {
datei = ((WebServer) server).dateiLiefern(dateipfad);
if (datei != null) {
antwort.setDaten(datei.getDateiInhalt());
if (datei.getName().endsWith("html")) {
antwort.setContentType(HTTPNachricht.TEXT_HTML);
antwort.setStatusCode(200);
}
else if (datei.getName().endsWith("png")) {
antwort.setContentType(HTTPNachricht.IMAGE_PNG);
antwort.setStatusCode(200);
}
else if (datei.getName().endsWith("bmp")) {
antwort.setContentType(HTTPNachricht.IMAGE_BMP);
antwort.setStatusCode(200);
}
else if (datei.getName().endsWith("gif")) {
antwort.setContentType(HTTPNachricht.IMAGE_GIF);
antwort.setStatusCode(200);
}
else if (datei.getName().endsWith("jpg")) {
antwort.setContentType(HTTPNachricht.IMAGE_JPG);
antwort.setStatusCode(200);
}
else {
antwort.setStatusCode(415);
}
}
else {
antwort.setStatusCode(404);
}
}
return antwort;
}
protected void verarbeiteNachricht(String nachricht) {
Main.debug.println("INVOKED ("+this.hashCode()+", T"+this.getId()+") "+getClass()+" (WebServerMitarbeiter), verarbeiteNachricht("+nachricht+")");
HTTPNachricht anfrage, antwort;
anfrage = new HTTPNachricht(nachricht);
if (anfrage.getMethod().equals(HTTPNachricht.GET)
|| anfrage.getMethod().equals(HTTPNachricht.POST)) {
antwort = verarbeiteAnfrage(anfrage);
}
else {
antwort = new HTTPNachricht(HTTPNachricht.SERVER);
antwort.setStatusCode(501);
}
sendeNachricht(antwort.toString());
}
}