Algorithmen und Datenstrukturen

| Algorithmen & Datenstrukturen Programmieren 1 von Prof. Jürgen Plate

# Programmierübungen in "C"

## Common Gateway Interface

Das Common Gateway Interface (CGI) beschreibt nur ein Protokoll, nicht eine bestimmte Programmiersprache. CGI-Programme lassen sich somit in jeder auf dem Server verfügbaren Programmiersprache erstellen. Häufig wird jedoch die Sprache Perl verwendet, da sie plattformübergreifend verfügbar ist und sich besonders zur Manipulation von Texten eignet - und das ist meist die Hauptanwendung für CGI-Programme. Ein CGI-Programm (wegen der Interpretersprache Perl auch oft "CGI-Script" genannt) ist nichts besonderes. Es ist ein Programm, das von der Standardeingabe (stdin) lesen und auf die Standardausgabe (stdout) schreiben kann. Wer in der Lage ist, ein solches Programm zu schreiben, kann auch CGI-Scripts erstellen.

CGI ist, wie gesagt, keine Sprache. Es ist vielmehr ein einfaches Protokoll, das der Kommunikation zwischen HTML-Formularen und einem Programm dient. Ein CGI-Script kann in jeder Sprache geschrieben sein. Diese Kurzanleitung konzentriert sich daher auch auf die Verarbeitung von HTML-Forms. Einige Details werden nicht behandelt, dafür kommt man um so schneller zum Ziel und deckt 90% der üblichen Anwendungen ab.

Ein CGI-Script führt die folgenden typischen Schritte aus:

1. Lesen der vom Clienten erzeugten Daten (entweder von der Parameterzeile des Programms oder von `der Standardeingabe.`
2. Verarbeiten der Daten
3. Schreiben einer Antwort in HTML auf `die Standardausgabe`.

Eine URL für ein CGI-Script sieht genau wie eine normale URL aus. Wie weiß der Server aber, daß es sich um eine ausführbare Datei und nicht um eine normale HTML-Seite handelt? Das ist ganz einfach. In der Konfigurationsdatei wurde eine Exec-Regel definiert. Sie zeigt auf das Verzeichnis, in dem sich die Scripte befinden.

Sofort stellt sich die Frage, "Wie kann man dem Script Anfragen mitteilen?". Dazu müssen einfach Parameter durch ein Fragezeichen getrennt an die URL angehängt werden (kann man bei Google gut studieren). Alternativ werden die Daten aus einem Formular an die Standardeingabe eines Programms geschickt. In einer Parameterzeile dürfen keine Leerzeichen stehen, weshalb sie durch ein "+"-Zeichen ersetzt werden. Sonderzeichen (Code > 127) werden durch ein Prozentzeichen (%) und den hexadezimalen Code des Zeichens ersetzt. Man kann also z. B. für ein Shop-Programm ein Bestell-Link der folgenden Form in eine Webseite einfügen:

    <A HREF="http://shop.server.de/cgi-bin/shopper.pl?prodid=23481227">Bestellen</A>

Genauso häufig sind Daten, die durch die Eingabe in ein Formular erzeugt werden. Wenn der Client seine Daten übermittelt (Submit-Knopf im Formular), erhält das Script alle erzeugten Daten als einen Satz von Name-Wert-Paaren. Der Name ist jeweils der, den man beim `INPUT`-Tag (bzw. beim `SELECT`- oder `TEXTAREA`-Tag) festgelegt hat, die Werte sind das, was der Anwender ins Formular eingetragen oder gewählt hat. Dieser Satz von Name-Wert-Paaren wird in einem einzigen langen String übermittelt, den das CGI-Programm auflösen muß. Das ist nicht sehr kompliziert, und es gibt viele fertige Routinen dazu. Der Aufbau des Strings ist recht einfach:

         name1=wert1&name2=wert2&name3=wert3

Man muß den String also einfach beim &-Zeichen zerlegen. Dann erhält man die Paare

    name1=wert1
    name2=wert2
    name3=wert3

In den entstandenen Häppchen muß man nun noch

- alle "+"-Zeichen in Leerzeichen wandeln
- alle "%xx"-Sequenzen in einzelne Buchstaben mit dem ASCII-Wert "xx" wandeln. "xx" ist da bei eine Hexadezimalzahl (Beispiel: "%3D" wird zu "=")

Das kommt daher, das der übermittelte String in der URL des CGI-Programms codiert ist. Bei einer Form der Übermittlung zum Server wird er durch "?" getrennt an die URL angehängt, was Sie beispielsweise beim Bedienen einer Suchmaschine in der URL-Zeile des Browsers sehen kann. Der Anwender muß aber nach wie vor die Möglichkeit haben, &-Zeichen und Gleichheitszeichen zu übergeben - deshalb die Codierung durch "%xx". Die folgende Tabelle zeigt die Zeichencodierung:

Zeichen | Code | Zeichen | Code | Zeichen | Code | Zeichen | Code
--- | --- | --- | --- | --- | --- | --- | ---
Leerz. | + | ! | %21 | " | %22 | # | %23
$ | %24 | % | %25 | & | %26 | ' | %27
( | %28 | ) | %29 | + | %2B | , | %2C
/ | %2F | : | %3A | ; | %3B | < | %3C
= | %3D | > | %3E | ? | %3F | [ | %5B
\ | %5C | ] | %5D | ^ | %5E | " | %60
{ | %7B | | | %7C | } | %7D | ~ | %7E
° | %A7 | Ä | %C4 | Ö | %D6 | Ü | %DC
ß | %DF | ä | %E4 | ö | %F6 | ü | %FC

Von wo das CGI-Programm den Formularinhalt erhält, hängt von der Methode ab, mit der die HTTP-Form übermittelt wurde:

- Bei der GET-Methode wird die in der <FORM ACTION="URL"> angegebene URL genommen und die codierten Eingabedaten angehängt, getrennt durch ein "?". Dies könnte zum Beispiel so aussehen:

        http://.../cgi-bin/testcgi.pl?Text=Hallo+dies+ist+ein+Test&Zeichen=%25

  Diese URL wird beim Absenden der Anfrage auch durch den Browser angezeigt. Die Nachteile der GET-Methode sind leicht ersichtlich:
  Es eignet sich nur bei relativ geringen Datenmengen
  Die URLs werden unleserlich.
  Der Vorteil liegt darin, daß diese Darstellung für den CGI-Programmierer sehr hilfreich sein kann beim Debugging seinen Scriptes. Außerdem ist GET schneller als POST.
  Bei GET-Übermittlungen liegt das Ergebnis in der Environment-Variable `QUERY_STRING`.
  Normalerweise benutzt man `GET` um kleine Datenmengen zu übertragen, z. B. einen Suchbegriff - vielleicht mit ein paar Parametern versehen. Dabei dürfen nicht zu viele Daten übertragen werden, denn die Maximallänge der URL variiert von Browser zu Browser.
- Bei der POST-Methode bleibt die in <FORM ACTION="URL"> angegebene URL unverändert. Die Daten werden für den Benutzer unsichtbar an den Server übertragen. Dies hat aber den Nachteil, daß man die URL nicht bookmarken kann: Während man z. B. bei einer Suchmaschine, welche mit GET arbeitet, bestimmte Begriffe als Link in die Bookmarks eintragen kann, und so immer einen aktuellen Link auf einen Suchbegriff haben kann, kann man dies bei Post nicht machen.
  Bei POST-Übermittlungen muß man die Formulardaten von `STDIN` lesen. Die genaue Anzahl übermittelter Bytes steht dabei in der Variablen `CONTENT_LENGTH`.
  `POST` wird normalerweise dafür verwendet, dem Server eine größere Menge Daten zu übermitteln. Die Menge der übertragenen Daten ist im Gegensatz zu `GET` nicht begrenzt.

All das geschieht hinter den Kulissen. Für den CGI-Programmierer funktionieren `GET` und `POST` fast gleich und sind gleich einfach zu benutzen. Der Vorteil von `POST` ist, daß man beliebig viele Daten übertragen kann. Der Vorteil von GET ist, daß alle Daten in eine URL gebastelt sind - man kann auf sie also verweisen oder sie in die Bookmarks aufnehmen.

Hier sind noch einmal die Schritte aufgeführt, die ein CGI-Script normalerweise durchlebt, wenn es vom Benutzer aufgerufen wird:

- Der Benutzer füllt das Formular aus und schickt es ab. Das Formular kann natürlich auch auf einer HTML-Seite angeboten werden.
- Das Script verarbeitet die Parameter und gibt eine Ausgabe dazu aus.

Damit sind die wesentlichsten Merkmale eines CGI-Scriptes erklärt. Alles was man tun muß, um selber ein CGI-Script zu schreiben, ist diese Punkte umzusetzen. Wie man das am besten tun kann, soll in den folgenden Abschnitten näher erklärt werden.

Der Browser sendet die Anfrage an ein CGI-Programm genauso ab, wie die Anforderung eines HTML-Dokuments und er erwartet natürlich auch, daß der Server mit entsprechenden Daten antwortet. Bei CGI wird jedoch keine HTML-Seite gesendet, sondern das Programm erzeugt die Daten dynamisch. Als erstes gibt es die Zeile

    Content-Type: text/html

gefolgt von einer Leerzeile auf `die Standardausgabe` aus. Nun läßt es eine normale HTML-Antwort folgen, die es ebenfalls auf `die Standardausgabe` ausgibt. Wenn das Script beendet ist, sieht der Anwender die so erzeugte Seite. Das Script liegt in einem speziellen Verzeichnis auf dem Server (meist "cgi-bin"). Der Content-Type kann natürlich variieren, es sind alle gebräuchlichen und vom Browser akzepierten MIME-Typen erlaubt. Versuchen wir es mal mit einem einfachen Beispiel.

Das folgende Programm liefern jeweils nur ein "Hello World" als HTML-Seite.

    /************************************************/
    /**  hello.c -- simple "hello, world" fuer cgi **/
    /************************************************/
    #include <stdio.h>
    int main(void)
      {
      /** CGI response header **/
      printf("Content-type: text/html\n\n") ;
      /** HTML response page **/
      printf("<html>\n") ;
      printf("<head><title>CGI Output</title></head>\n") ;
      printf("<body>\n") ;
      printf("<h1>Hello, world.</h1>\n") ;
      printf("</body>\n") ;
      printf("</html>\n") ;
      return(0) ;
      }

Zum Inhaltsverzeichnis

###### Copyright © FH München, FB 04, Prof. Jürgen Plate

###### Letzte Aktualisierung: 02. May 2006