Für Web-Anwendungen in Tcl steht eine Reihe von Techniken zur Verfügung. Neben einfachen CGI-Skripten, Tcl-Modulen für den Apache oder umfangreichen Application-Servern bietet sich der Tclhttpd an. Der komplett in Tcl geschriebene Webserver kann auf eine lange Entwicklungsgeschichte zurückblicken, entsprechend ausgereift ist er heute. Er dient mit seinen vielen Funktionen als Basis für ausgefeilte Web-Anwendungen. Dieser Artikel zeigt verschiedene Wege, wie man mit seiner Hilfe HTML-Seiten erzeugen kann oder Anfragen bearbeitet.
Ursprung des Tclhttpd waren 175 Zeilen Tcl, die Brent Welch Mitte der 90er Jahre geschrieben hat. Inzwischen ist der Code auf etwa 12000 Zeilen angewachsen, die umfangreiche Tcllib ist in dieser Zählung noch gar nicht berücksichtigt. Diese stabile Basis unterstützt den schnellen Weg zur Anwendung auf viele Arten. Tclhttpd kann:
- Statische Webseiten ausliefern,
- Server Side Includes ausführen,
- einzelne URLs, ganze Verzeichnisse oder verschiedene MIME-Typen mit Tcl-Skripten verknüpfen,
- Tcl-Code in HTML einbetten,
- Cookies setzen und lesen,
- Sessions verwalten,
- Benutzer authentifizieren,
- Formulare auswerten,
- Files auf den Server laden (Upload),
- E-Mail unterstützen.
Ziel der Entwicklung war nie, mit dem Platzhirsch Apache zu konkurrieren. Wer mit vielen hundert Anfragen pro Sekunde rechen muss, ist mit Tcl-Modulen wie »mod_tcl«[5] oder »mod_websh«[6] im Apache sicherlich besser bedient. Wer jedoch in erster Linie an eine Web-Anwendung für klein- bis mittelvolumige Websites denkt, dem bietet Tclhttpd eine solide Grundlage.
Für kleine und große Projekte geeignet
Verstecken muss sich Tclhttpd aber auch nicht, immerhin ist er der Server für [www.tcl.tk]. Diese Seite bewältigt ein beachtliches Volumen. Andere große Anwendungen sind ein weltweites Netz für meteorologische Daten von Flugplätzen oder das Medusa-Projekt[4], das auf eine umfangreiche Datenbank zugreift. Hört man sich bei den Anwendern um, dann sind es aber vor allem interne Projekte, die auf dieser Basis durchgeführt werden.
Die Tclhttpd-Quellen sind bei Sourceforge zu finden[1]. Dort gibt es zwei Versionen: die All-inclusive-Variante »tclhttpd-3.2-dist« samt Tcl, Thread und Tcllib[3] und die aktuelle Version »tclhttpd-3.3.1«. Der Vorteil des älteren Pakets ist die einfache Installation. Bis zum komplett laufenden Webserver genügen folgende Schritte:
# tar -xzf tclhttpd3.2-dist.tar.gz
# cd tclhttpd3.2-dist/tclhttpd3.2
# make
# make install
# cd bin
# wish httpd.tcl
Running with 256 file descriptor limit
httpd started on port 8015
Ein beliebiger Browser zeigt dann unter der Adresse »http://localhost:8015« die mitgelieferten Beispiele an, sie illustrieren einige der Möglichkeiten des Pakets. Der Server wird mit der Datei »tclhttpd .rc« konfiguriert, ein Beispiel findet sich in Listing 1.
Am Anfang eigener Entwicklungen bietet es sich an, den Inhalt des Beispiel-Verzeichnisses zu verwenden, um das Control-Panel und die Statistiken zu behalten. Mit dem Control-Panel lassen sich vom Browser aus Variablen abfragen oder Bibliotheken neu laden. Beides ist beim Debugging sehr praktisch.
Der Tclhttpd kann den Inhalt seiner Webseiten dynamisch zur Laufzeit erstellen. Dazu unterstützt er mehrere Verfahren. Die einfachste Variante wird mit »Direct_Url« konfiguriert: Der Server leitet dann alle Anfragen für eine URL an die konfigurierte Tcl-Prozedur. Im Gegensatz zu CGI-Skripten startet er dafür keinen separaten Prozess, die Prozedur läuft direkt im Server. Sie kann daher auch Variablen aus dem Server verwenden, etwa für Zähler oder um Datenbankverbindungen offen zu halten.
Listing 1: Tclhttpd-Konfiguration
01 # Beispielhafte Konfiguration
02
03 # httpd läuft als User 500 in Gruppe 100
04 Config uid 500
05 Config gid 100
06
07 # httpd hört auf Port 8015, normaler Hostname
08 Config host [info hostname]
09 Config port 8015
10
11 # Eigene Skripts im Verzeichnis .../custom
12 Config library [file join [Config home] .. custom]
13
14 # HTML-Dateien liegen in /usr/local/httpd/htdocs
15 Config docRoot /usr/local/httpd/htdocs
16
17 # Keine Threads erzeugen
18 Config threads 0
19 Config main [file join [Config home] httpdthread.tcl]
20
21 # Logfile: /usr/local/httpd/log
22 Config LogFile /usr/local/httpd/log
23
24 Config LogFlushMinutes 0