
Echte Online-Gefühle schafft das Perl-Skript nph-slowdown.pl auch ohne Netzwerkverbindung. Einmal installiert, kann man das Erscheinen lokaler Web-Seiten mit typischer Modemgeschwindigkeit erleben. Einfach den Dateinamen in ein HTML-Formular eintippen, abschicken, und das Warten kann beginnen. Auf der Stück für Stück im Browser sichtbar werdenden Seite sind alle Links auf das Skript umgeleitet, so daß man sich praktisch in einer Simulation befindet. Sinn macht das freilich nur mit lokalen Dateien, bei Netzzugriffen wünscht wohl niemand eine zusätzliche Verzögerung.
Da es sich um ein CGI-Skript handelt, muß neben Perl ein lokaler HTTP-Daemon vorhanden sein. Es nutzt CGI.pm, um an die Eingaben aus dem HTML-Formular zu gelangen. Dieses (slowdown.html) ist die Ausgangsbasis der Simulation, man kann dort Geschwindigkeit und Anfangsverzögerung einstellen. Die Startdatei ist mit ihrem vollen lokalen Pfad im entsprechenden Feld anzugeben. Das Formular muß übrigens nicht unbedingt im Dokumentenbaum des Servers liegen. Es ist nur dann anzupassen, wenn das eigene CGI-Verzeichnis nicht cgi-bin heißt oder der Rechner nicht weiß, daß er selbst 'localhost' ist. Durch die Verwendung von method=GET kann man während der Simulation Geschwindigkeit und Verzögerung ändern, ohne auf die Formularseite zurückzukehren. Dazu ist einfach der Wert im URL zu ändern und die Seite neu zu laden.
Neben slowdown.html ist auch nph-slowdown.pl zu installieren, und zwar im CGI-Verzeichnis des Servers, wo es mit Lese- und Ausführungsrecht für others auszustatten ist. Die ersten Zeilen muß man eventuell den eigenen Gegebenheiten anpassen. Die Option pseudokeepalive schaltet die einstellbare Anfangswartezeit bei Inline-Images ab - so wie im realen Web-Leben mit Keepalive nicht für jede Grafik eine neue Verbindung aufgebaut wird.
Obwohl kein Zufallsgenerator seinen Einfluß ausübt und das Skript nur stur im Sekundenrhythmus einige Bytes überträgt, entsteht der realistische Eindruck eines langsamen Ladevorganges. Allerdings gibt es einige theoretische Einschränkungen hinsichtlich der Realitätsnähe: So liefert das Skript zum Beispiel jedes übertragene Bild mit der konfigurierten Geschwindigkeit. Fordert also der Browser mehrere Bilder gleichzeitig an, addieren sich die Übertragungsraten und übersteigen zusammen den eingestellten Wert. Modemtypische Kompression, die vor allem bei Textdateien wirkt, und nur, wenn tatsächlich das Modem den Engpaß darstellt, wird ebenfalls außer acht gelassen.
Links auf Verzeichnisse sind nur verwendbar, wenn sie mit einem '/' enden beziehungsweise die Default-Datei im Link angegeben ist. Eins von beiden sollte in sauberem HTML aber ohnehin der Fall sein, um Redirects zu vermeiden, die der Server für ein Verzeichnis ohne abschließenden Schrägstrich schickt.
Zuerst gelangt das Skript mit $query->import_names("Q") aus CGI.pm an die nötigen Parameter. Es lädt die verlangte Datei und sorgt unter Umständen erstmals für eine künstliche Verzögerung, in der es noch gar nichts an den Browser sendet. Danach werden, im Falle einer HTML-Datei, unter anderem alle Links ausgetauscht. Nicht mehr eine Datei ist jetzt Ziel des Links, sondern das Skript selbst, allerdings mit dem Namen der ursprünglichen Datei sowie Anfangsverzögerung und Geschwindigkeit als Parametern. Ein Klick auf einen Link hat damit den gleichen Effekt wie das Abschicken des entsprechend ausgefüllten HTML-Formulars.
Das Austauschen der Links und der Bilder-Tags erledigen ab Zeile 36 die für Perl typischen regulären Ausdrücke. Die erste Substitution filtert eine eventuell vorhandene Positionsangabe hinter # heraus. Prinzipiell funktionieren nämlich Links, die auf eine konkrete Stelle in einem anderen Dokument verweisen (<a href="datei.html#stelle1">...</a>), bei CGI-Skripts nicht. In solchen Fällen liefert das Skript die Datei, ohne daß der Browser die entsprechende Stelle automatisch anspringt. Am Ende der Zeile bewirkt der /e-Modifier den Aufruf von nohashes(); dessen Rückgabewert baut der Ausdruck in den neuen Link ein.
Hier und bei den folgenden Substitutionen kommt außerdem der /x-Modifier zum Einsatz, der die Quelle besser lesbar macht - im linken Teil ignoriert Perl dadurch Leerzeichen, Tabulatoren, Newlines und Kommentare. Der /i-Modifier schaltet die Unterscheidung zwischen Groß- und Kleinschreibung ab, mit /s darf der Tag sogar über mehrere Zeilen gehen - HTML-konform. Schließlich sorgt /g für den Austausch aller Fundstellen, nicht nur der ersten.
Es folgen zwei weitere Änderungen: Die erste schreibt Links mit absoluter Dateiadressierung um, die zweite solche mit relativer. Die nächsten vier Befehle haben die gleiche Funktion, nur wirken sie auf Inline- und auf Hintergrundbilder. Um das Ersetzen nicht noch komplizierter zu machen, behandelt das Skript mailto- und externe Links (http://...) nicht gesondert. Es ersetzt diese einfach ebenfalls, so daß sie ihre Funktionsfähigkeit verlieren. Da die durch diese Anpassungen erzeugte Datei länger ist als das Original, kann es bei vorwiegend aus Links bestehenden Seiten zu einer spürbaren Vergrößerung kommen, die sich auf die Übertragungszeit auswirkt.
Das Skript ermittelt die Größe der Datei und gibt sie mit einem sinnvollen Content-Type und 'HTTP/1.0 200 OK' aus (ab Zeile 56). Letzteres ist hier nur nötig, weil das Programm zwangsläufig als nph-Skript verwirklicht ist. 'nph' steht für 'non-parsed header': Der Server läßt das Skript alle Header selber ausgeben, nicht nur den Content-Type und ähnliches. Wichtiger ist, daß der Server auf das übliche Puffern verzichtet, was dazu führen würde, daß erst lange Zeit gar nichts kommt - und dann alles auf einmal. Der Dateiname ist übrigens Programm: Am vorangestellten 'nph-' erkennt der Server erst, daß es sich um ein solches Skript handelt. Obwohl das Skript nicht alle Möglichkeiten ausschöpft, die Realität exakt zu simulieren, kommen die typischen Geschwindigkeitsprobleme des Web zum Ausdruck: Grafiken brauchen nicht nur lange Ladezeiten, sie verzögern auch die Anzeige der ganzen Seite, wenn man ihnen kein width und height mit auf den Weg gibt.
Stimmen die Höhen- und Breitenangaben übrigens mal nicht, kann es passieren, daß man sich unfreiwillig eine Miniatur bastelt: Wer lokal testet, glaubt, es ginge um ein verkleinertes und damit schnell zu übertragendes Bild. Erst im Netz oder in der Simulation via Skript sieht man, daß es sich um ein großes, vom Browser verkleinertes Bild mit entsprechend langen Ladezeiten handelt. Von oben bis unten mit einer Tabelle aufgeteilte lange Seiten entpuppen sich ebenfalls als frustrierend, zeigt der Browser sie doch erst an, wenn er den </table>-Tag zu Gesicht bekommt.
Daniel Naber
ist Zivildienstleistender in einem Behindertenheim und arbeitet nebenbei für die Bielefelder Firma Unicorn Design als CGI-Programmierer.
Dieser Text ist der Zeitschriften-Ausgabe 11/1997 von iX entnommen.
iOS, Android, Windows Phone 7 und HTML5 - das neue Sonderheft von heise Developer führt Einsteiger und Profis in die Programmierung mobiler Geräte ein.