C++ CGI-Plugins am Webserver debuggen
« | 02 Feb 2025 | »Man konnte doch schon in den 80er Jahren C-Programme auf Webservern ausführen, die Webseiten und anderen Schnick-Schnack generierten.
Heute scheint das vergessen, aber es klappt immer noch … mit etwas Hilfe.
Unter CGI verstehen heute alle nur noch
Computer Generated Imagery,
also Computer-Grafiken.
Doch die ersten Webentwickler verstanden darunter das
Common Gateway Interface,
also eine Schnittstelle, wie ein Webserver externe Programme aufrufen konnte,
um dort Inhalte dynamisch generieren zu lassen.
CGI
Die Idee war simpel: Ein Prozess wurde mit einer Reihe spezieller
Umgebungsvariablen gestartet, die als Input dienen sollten und der Prozess
schrieb auf STDOUT, was als HTTP-Content zurückgegeben werden sollte.
Der Webserver übernahm also das Parsen der HTTP-Anfrage, startete den Prozess
mit den Parametern und leitete dessen Output mit geringen Protokollzusätzen
an die Clients weiter.
Die Prozesse konnten - wie auf POSIX
Systemen üblich - echte native Programme oder Shell-Scripts sein, die ja mit
dem Interpret auch wie native Programme nach außen wirkten.
So entstand die erste große Reihe von dynamischen Web-Content durch Sprachen wie Perl oder PHP.
Im Laufe der Zeit wurde das Konzept der separaten Prozesse aber als veraltet
angesehen und durch neuere Verfahren wie
FastCGI ersetzt.
Mit FastCGI wird ein Prozess nur einmal gestartet und kommuniziert mit dem
HTTP-Server über Sockets. Somit können Zustände im RAM bleiben und ein
Prozess kann auch mehrere Anfragen parallel (multithreaded) bearbeiten.
Einsatz mit C++
Ich setzte CGI mit C++ schon vor
12 Jahren ein, um ferige Datensätze aus Auswertungen und graphische
Darstellung aus einer Desktop-UI ins Web zu verlagern.
Weil CGI-Parameter einfach per
getenv() gelesen
und der HTTP Output per std::cout geschrieben werden kann, konnte ich
Datensätze mit wenigen Zeilen Code als JSON Objekte ausgeben und an den
Client zurücksenden lassen.
Das Thema Authentifizierung übernahm der WebServer (IIS unter Windows, Apache unter Linux) und ich schrieb noch schnell ein paar Zeilen mit statischem HTML-Code um die per JSON gelieferten Daten “bunt” anzeigen zu können.
In Sachen Deployment is “das Web” natürlich jeder Desktop-App überlegen, und somit konnte ich die Vorteile zweier Welten nutzen:
- Fertige C++ Libs lieferten bereits die gewünschten Ergebnisse und mussten nur als JSON Datensatz formatiert werden
- HTML Seiten schreiben sich schneller als native Desktop-Apps. Jeder geänderte Buchstabe um UI kann mit einem F5 sofort angezeigt werden … das spart viel Zeit, wenn man nicht dauernd was neu kompilieren muss.
Fazit
Meine Webserver unterstützen alle (mit ein paar Config-Anpassungen)
CGI-Programme.
Folglich könnte ich auch hier wieder GATE Plugins schreiben, die Features
für das Web offenlegen.
Das könnte eine hervorragende Ergänzung zu WASM sein, denn während WASM moderne Browser voraussetzt, kann ein simples CGI-Tool auch klassischen HTML-Code generieren, der auf Browsern von vor 20 Jahren lauffähig ist.