In der Regel möchte man in einem Skript die Daten aus einem Formular auswerten. Ein einfaches Exemplar zeigt Listing 2. Die dortige HTML-Datei erstellt ein Formular, das den Vor- und Nachnamen seines Benutzers erfragt und diesen dann per Get-Methode an das Lua-Skript »antwort.lua
«
schickt.
Listing 2
Datei frage.html mit einem Formular
Dessen Inhalt zeigt Listing 3. Zunächst setzt die »handler()
«
-Funktion den MIME-Typ auf »text/html
«
und baut dann mit mehreren »r.puts()
«
den Anfang eines HTML-Dokuments zusammen. Anschließend muss sie an die Daten aus dem Formular gelangen. Dabei hilft wieder das Request-Objekt. Seine Methode »r:parseargs()
«
liefert alle per Get-Methode gesendeten Parameter in einer sogenannten Tabelle zurück. Diese Datenstruktur kennen andere Programmiersprachen auch als assoziatives Array oder Dictionary.
Listing 3
Formularauswertung antwort.lua
Die von »parseargs()
«
zurückgelieferte Tabelle besitzt für jedes Formularfeld einen Eintrag mit dem Namen des Feldes und dem darin abgelegten Wert. Um an den Vor- und Nachnamen zu kommen, durchläuft die folgende »for
«
-Schleife die komplette Tabelle. Die »pairs()
«
-Funktion hilft ihr dabei, indem Sie auf den jeweils nächsten Eintrag in der Tabelle zeigt. In der Variablen »k
«
landet dabei der Name des Formularfeldes, in »v
«
sein entsprechender Inhalt.
Die If-Abfrage prüft, ob es sich um den Vornamen handelt. Wenn ja, wandert er in die Variable »vorname
«
. Analog speichert die Variable »nachname
«
den Nachnamen. Variablen darf man in Lua einfach immer direkt benutzen und in ihnen zudem beliebige Werte abladen.
Lua-Kenner dürften an dieser Stelle einwenden, dass man sich die ganze Schleife auch sparen und etwa per:
alleparameter = r:parseargs(); vorname = alleparameter["vorname"]
direkt den Vornamen aus der Tabelle holen könnte. Dies führt jedoch zu einer Fehlermeldung, wenn der Vorname aus irgendeinem Grund gar nicht übertragen wurde.
Nachdem in Listing 3 der Vorname und Nachname in ihren entsprechenden Variablen liegen, setzt sie die Funktion »string.format()
«
zu einer neuen Zeichenkette zusammen. Die Platzhalter »%s
«
tauscht »string.format()
«
dabei gegen die Inhalte der Variablen »vorname
«
und »nachname
«
. Das Ergebnis landet wiederum in »r:puts()
«
und somit dem fertigen HTML-Dokument (Abbildung 2). »string.format()
«
stammt übrigens aus Luas Standardbibliothek »string
«
, die der Befehl »require
«
ganz am Anfang hinzuholt.
Listing 3 funktioniert nur, wenn das Skript die Formularinhalte per Get erhält. Sofern die Post-Methode zum Einsatz kommt, liefert »r:parsebody()
«
alle gewünschten Daten. Die verwendete HTTP-Methode verrät »r.method
«
. Damit lässt sich dann eine Fallunterscheidung wie in Listing 4 basteln. Obwohl sie so auch die offizielle »mod_lua
«
-Dokumentation vorschlägt, produzierte »parsebody()
«
in unseren Tests nur eine Fehlermeldung. Ein Blick in den Quellcode von »mod_lua
«
offenbarte, dass die Funktion zumindest unter Apache 2.4.2 noch gar nicht implementiert ist. Alle weiteren Funktionen und Attribute des Request-Objekts listet übrigens in der offiziellen Dokumentation des Moduls der Abschnitt "Data Structures" auf [7].
Listing 4
Unterscheidung Post und Get in Lua