CGI Common Gateway Interface


WWW-Server bieten zunächst die Möglichkeit HTML-Seiten zu finden und dann mit Hilfe von TCP/IP zum WWW-Client zu transportieren.

Das Common Gateway Interface, kurz CGI, eines WWW-Servers ermöglicht es zudem beliebige vorbereitete Programme auszuführen. Diese Programme erhalten Eingabeinformationen vom WWW-Client und können HTML Daten an den WWW-Client zurück liefern.

Wir werden in diesem Tutorial die wichtigsten Fähigkeiten und Eigenschaften des CGI besprechen. Der Inhalt ist wie folgt:

Inhalt

  1. Einleitung
  2. Benutzung
  3. Beispiele
  4. Spezifikation

Einleitung

Was ist das CGI ?

Das Common Gateway Interface, kurz CGI, eines WWW-Servers ermöglicht es beliebige vorbereitete externe Programme auszuführen. Es spezifiziert die erforderlichen Schnittstellen für die Eingabe bzw. Weiterleitung von Informationen vom WWW-Client zum Programm und für die Rückgabe von Informationen an den WWW-Client.

Wozu kann das CGI verwendet werden ?

Die Hauptanwendung besteht in der Bereitstellung von HTML Informationen on the fly, d.h. in der direkten Generierung von HTML-Seiten aus Informationen, die nicht als HTML-Seiten vorliegen.

Viele Information liegen weder zur Zeit, noch werden sie in Zukunft als HTML Dokumente vorliegen, zum Beispiel PostScript- oder Word- Dokumente, SQL Datenbanken oder Volltext Dokumenten-Systeme. Andere Informationen können überhaupt nicht als statische Informationen abgelegt werden, zum Beispiel interaktive Antworten auf eine Anfrage eines WWW-Clients.

In all diesen Fällen bietet das GCI eine standardisierte Lösung an. Einige praktische Beispiele sind:

Wie sehen CGI Programme aus ?

Zunächst sind CGI Programme normale Programme, die selbstständig von dem Betreibssystem des WWW-Servers ausgeführt werden können. Diese Programme können in fast jeder gängigen Programmiersprache geschrieben sein, die auf dem Betriebssystem des WWW-Servers ausgeführt werden kann. Die einzigen Bedingungen die die Programmiersprache für die zur Zeit gängigen WWW-Swerver erfüllen muß sind
  1. die Möglichkeit Umgebungsvariablen (environment variablen) zu lesen,
  2. die Möglichkeit von der Standart-Eingabe (stdin) zu lesen und
  3. die Möglichkeit auf die Standart-Ausgabe (stdout) zu schreiben.
Zusätzlich muß die Sprache natürlich auch zur Lösung der eigentlichen Aufgabe geeignet sein.

Verbreitete Programmiersprachen sind etwa die folgenden

Die interpretierten oder halb-interpretierten Sprachen werden meist bevorzugt verwendet.

Wer hat CGI entwickelt ?

Im wesentlichen waren es die Autoren der ersten WWW-Server, die sich über die Spezifikation des Interfaces verständigt und dann festgeschreiben haben. Um nur einige zu nennen Die aktuelle Version der Spezifikation ist CGI/1.1.

Benutzung

Neben der Kenntnis der HTML Sprache und der gewählten Implementierungssprache muß für die Benutzung des CGI bekannt sein wie die Informationen zwischen dem WWW-Client, WWW-Server und dem CGI Program ausgetauscht werden soll.

Die Auswahl eines bestimmten CGI-Programs geschiet wie üblich durch Angabe in einem URL.

http://server-ip/path/cgi-prog/path-info?query-string

Der vordere Teil entspricht wie bei HTML-Seiten der Zugriffsmethode (http:), dann dem Servername bzw. dessen IP-Adresse (//server-ip) (u.U. mit Portangabe), gefolgt von dem Pfad zur Resource (path). Der Pfad für CGI-Programme beginnt meist mit cgi-bin. Zulässige Pfade müssen bei der Konfiguration des WWW-Servers (bei httpd in der httpd.conf) angegeben werden.

Dann folgt der Name des CGI-Programs cgi-prog. Eine Namensendung auf .pl deutet z.B. auf ein Perl Program hin. Die weiteren Bestandteile /path-info?query-string werden wir im folgenden ausführlicher besprechen.

Ein Hinweis ist zum Verständnis noch wichtig:

mit dem URL können nicht direkt Kommandozeilenparameter an das CGI Program übergeben werden.

D.h. es ist nicht möglich für das CGI Programm cgi-prog arg1 arg2 zu schreiben und zu erwarten, daß arg1 bzw. arg2 als Argumente für das CGI Program verwendet werden. Die Informationen an das CGI Program werden auf anderem Wege weitergegeben.

Wir besprechen im folgenden zuerst die Übertragung der Informationen vom WWW-Server zum CGI Program, dann die Übertragung der Informationen vom CGI Program zum WWW-Server und WWW-Client und schließlich die Aufbereitung und das Senden der Informationen vom WWW-Client über den WWW-Server zum CGI-Program.

Wie wird Information vom Server empfangen ?

Die Information vom Server kann auf 3 Arten empfangen werden, und zwar mit Die Query-String Methode benutzt den Teil des URL, der dem ersten ? folgt.

http://server-ip/path/cgi-prog/path-info?query-string

Die Zeichenkette query-string wird dem CGI Program in der Umgebungsvariablen QUERY_STRING zur Verfügung gestellt. Sie ist im normalen URL Kodierungsschema verschlüsselt. D.h. Leerzeichen (Blanks) werden in + verwandelt und spezielle Zeichen werden in hexadezimaler Form %xx angegeben. Zur Benutzung dieser Informationen muß diese Zeichenkette wieder dekodiert werden.

Die Angabe des Query-Strings kann von Hand erfolgen, oder sie kann vom WWW-Client generiert werden. Zum Beispiel die HTML Keywörter <ISINDEX> und <FORM> generieren diese Information automatisch. Wie der Name schon sagt wird der Query-String hauptsächlich zur Übermittlung einer Anfrage, bzw. eines Anfragestrings an das GCI Program genutzt.

Die Path-Info Methode benutzt den Teil des URL, der zwischen dem Namen des CGI Programs cgi-prog und dem ersten ? steht.

http://server-ip/path/cgi-prog/path-info?query-string

Die Zeichenkette /path-info wird dem CGI Program in der Umgebungsvariablen PATH_INFO zur Verfügung gestellt. Sie ist nicht im URL Schema kodiert.

Die Angabe der Path-Info Zeichenkette muß explizit vorgenommen werden. Der wichtigste Verwendungszweck ist die Angabe von Kontextinformationen für das CGI Program. Zum Beispiel werden gerne Grundinformationen wie die aktuelle verwendete Sprache in Path-Info übergeben /cgi-prog/language=english?query-string.

Da es bei manchen Betriebssystemen Beschränkungen in der zulässigen Länge von Umgebungsvariblen gibt, wurde eine weiter Methode der Informationsübermittlung spezifiziert: direkt von der Stdin "Datei". Dabei wird die sonst in QUERY_STRING stehende Zeichenkette per Pipe gesendet und kann vom CGI Program direkt von Stdin gelesen werden. Die Information ist wie im QUERY_STRING im normalen URL Kodierungsschema verschlüsselt und sie muß zur Benutzung erst dekodiert werden.

Die Auswahl dieser Methode geschiet im WWW-Client mit dem HTML <FORM> Keyword und dem zusätzlichen Parameter METHOD="POST". Laut Angaben der CGI Entwickler soll diese Methode in Zukunft nur noch verwendet werden, d.h. die Infromationsübergabe per QUERY_STRING soll nicht mehr verwendet werden.

Die Länge des QUERY_STRING sowie die Anzahl der Bytes in Stdin werden in der Umgebungsvariablen CONTENT_LENGTH angegeben. Die Abfrage auf End-of-File für Stdin ist nicht definiert und funktioniert somit nicht.

Wie wird Information zum Server gesendet ?

Die Rückgabe von Informationen an den WWW-Server und damit an den WWW-Client ist relativ einfach: es wird die Stdout "Datei" verwendet. Die Schwierigkeiten liegen nur darin, das die "Datei" ein bestimmtes Format haben muß.

Die ersten beiden Zeilen, der sog. Header, muß aus ASCII Text bestehen. Die zweite Zeile muß gegenwärtig leer sein (und zeigt so das Ende des Headers an), die erste Zeile muß entweder einen MIME Typ oder einen Ort spezifizieren.

Der MIME Inhaltstyp wird mit dem Keyword Content-type: angegeben, gefolgt von einem gültigen MIME-Typ und einem gültigen MIME-Subtyp. Also etwa wie folgt

Content-type: m-type/m-stype

Beispiele für MIME Typen sind text/html für HTML Text oder text/plain für einfachen ASCII Text. Der Rest der "Datei" muß dann natürlich aus Informationen von diesem Typ bestehen. Auf dem selben Weg können auch Graphiken, Sound und Videos gesendet werden.

Die Ortsangabe erfolgt mit dem Keyword Location:, gefolgt von einem gültigen URL. Zum Beispiel wie folgt

Location: ftp://host/dir/dateix.txt

In diesem Fall erzeugt der WWW-Client nach Erhalt dieses Headers eine FTP-Verbindung und besorgt sich die Information von dort.

Wie wird Information vom Client aufbereitet ?

Wie schon oben erwähnt ist das wichtigste Verfahren, um Informationen an CGI Programme zu senden, die Verwendung von Formularen. Formulare werden durch das HTML <FORM> Keyword angegeben. Das FORM Keyword hat zwei Parameter, die die Übertragung regeln.

Die Daten des Formulars werden in beiden Fällen wie folgt an das CGI Program gegeben. Das Formular definiert mit dem NAME Keyword Namen für Eingabefelder. Beim Absenden des Formulars wird der Inhalt der jeweiligen Eingabefelder zusammen mit dem Namen gesendet. Dies geschiet als Folge von

name=content

Paaren, die durch & getrennt sind. name bezeichnet den in NAME=name definierten Feldnamen und content ist der Inhalt des Eingabefeldes. Der Name und der Inhalt wird automatisch entsprechend dem normalen URL Kodierungsschema verschlüsselt. Im CGI Program wird dann diese Folge dekodiert und es kann entsprechend der Inhalte verfahren werden.

Weitere Informationen sind der Spezifikation des FORM Keywords der HTML Defnition zu entnehmen. Zur Dekodierung existieren oft schon fertige Prozeduren in den entsprechenden Programmiersprachen.


Beispiele

Das CGI Program hat etwa den folgenden Grundaufbau für den Empfang der Informationen.

  1. Feststellen der Übertragungsmethode durch Ansehen der Umgebungsvariablen REQUEST_METHOD. Mögliche Werte sind GET, POST und HEAD.
  2. Lesen von CONTENT_LENGTH Bytes von QUERY_STRING oder Stdin.
  3. Standart URL Dekodierung der Zeichenkette.
  4. Aufspaltung der Zeichenkette entlang &.
  5. Aufspaltung der resultierenden Paare name=content entlang =.
  6. Verwenden der so aufbereiteten Informationen im Program.

Ein Perl Skript, das die empfangenen Variablen und Werte in HTML codiert und an den Absender zurück schickt wird in dem Abschnitt zu Perl besprochen.


Spezifikation

Die Spezifikation von CGI 1.0 oder 1.1 umfaßt folgende Punkte:

Alle Spezifikationen der Version 1.1 sollen auch von zukünfigen Erweiterungen erfüllt werden.

Die für die Benutzung wichtigsten Definitionen haben wir bereits besprochen. Für die Vollständige Spezifikation sei auf die orginal URLs der CGI Definition verwiesen.