bingo
Home Index Zurück unbelegt



Beispiele zur CGI-Programmierung

Das verwendete Shell-Script :


#!/bin/csh -f # # Zuerst den Mime-Typ ausgeben # (nachfolgende Leerzeile nicht vergessen !) # echo "Content-Type: text/html" echo "" # # Anzeige der uebertragenen Daten # echo "<p>" echo "<b>REQUEST_METHOD</b> = &quot;$REQUEST_METHOD&quot; <br>" if ( $REQUEST_METHOD == "GET" ) then echo "<b>QUERY_STRING</b> = &quot;$QUERY_STRING&quot; <br>" else if ( $REQUEST_METHOD == "POST" ) then echo "<b>CONTENT_LENGTH</b> = &quot;$CONTENT_LENGTH&quot; <br>" endif # # Auspacken der empfangenen Daten (durch ein c-Programm) # echo "<p>" ./cgi-deco echo "<p>" # # Link zur rufenden Seite # if ( $?HTTP_REFERER ) then echo "<p><hr><center>[<a href=$HTTP_REFERER>Zurück</a>]</center>" endif
Eine Dokumentation aller für CGI defierten Environment-Variablen finden Sie in der CGI-Spezifikation.
Und hier sehen Sie, welche Werte diese Variablen auf dem bingo-Server annehmen können.


Das vom Script gerufene c-Programm zum Auspacken der Daten :


#include <stdio.h> #include <stdlib.h> #include <string.h> char cgi_method; int cgi_argc = 0; char **cgi_name; char **cgi_wert; main () { int ii; /* Normalerweise sollte ein CGI-Programm als erstes den Content-Type und eine Leerzeile rausschreiben : printf("Content-Type: text/html\n\n"); in unserem Beispiel hat das aber schon das shell-script getan */ /* Uebergabeparamter lesen und auspacken */ if(!cgi_init())exit(1); /* Ergebnis im HTML-format ausgeben */ printf("<br>Es wurden %d Parameter uebergeben !<p>\n", cgi_argc); for(ii=0; ii<cgi_argc; ii++) { printf("%s", cgi_name[ii]); if(cgi_wert[ii] != NULL)printf(" = &quot;%s&quot;", cgi_wert[ii]); printf("<br>\n"); } exit(0); } int cgi_init() { /* Uebergabeparamter lesen und auspacken */ char *ic, *kc, hex[3]; static char *input, *output; int ii, kk, ll; /* welche Methode ? */ if((ic=getenv("REQUEST_METHOD")) == NULL) { printf("Environment-Variable REQUEST_METHOD nicht definiert<br>\n"); return 0; } if(strncasecmp(ic, "GET", 3) == 0) { cgi_method='G'; } else if(strncasecmp(ic, "POS", 3) == 0) { cgi_method='P'; } else { printf("unzulaessiger Wert fuer REQUEST_METHOD = \"%s\"<br>\n", ic); return 0; } if(cgi_method == 'P') { /* Laenge der Eingabe-Zeichenkette */ if((ic=getenv("CONTENT_LENGTH")) == NULL) { printf("Environment-Variable CONTENT_LENGTH nicht definiert<br>\n"); return 0; } ll=atoi(ic); if((input=(char *)malloc(ll+1)) == NULL) { perror("malloc"); return 0; } /* Lesen von stdin */ ll=fread(input, 1, ll, stdin); input[ll]=0; output=input; } else { /* Lesen der Environmentvariablen */ if((input=getenv("QUERY_STRING")) == NULL) { printf("Environment-Variable QUERY_STRING nicht definiert<br>\n"); return 0; } ll=strlen(input); if((output=(char *)malloc(ll+1)) == NULL) { perror("malloc"); return 0; } } if(ll < 1) { cgi_argc=0; return 1; } /* Decodieren der uebermittelten Daten */ kk=0; cgi_argc=1; for(ii=0; ii<ll; ii++) { /* Uebersetzung */ switch (input[ii]) { case '&': /* Trennzeichen der einzelnen Argumente */ output[kk]=0; cgi_argc++; break; case '+': /* Leerzeichen */ output[kk]=' '; break; case '%': /* Hex-Code fuer Sonderzeichen */ hex[0]=input[++ii]; hex[1]=input[++ii]; hex[2]=0; output[kk]=(char)strtol(hex, NULL, 16); break; default: output[kk]=input[ii]; break; } kk++; } output[kk]=0; /* Tabelle der Namen und Werte aufbauen */ if((cgi_name=(char **)malloc(cgi_argc*sizeof(char *))) == NULL || (cgi_wert=(char **)malloc(cgi_argc*sizeof(char *))) == NULL) { perror("malloc"); return 0; } ic=output; for(ii=0; ii<cgi_argc; ii++) { cgi_name[ii]=ic; ic=ic+strlen(ic)+1; if((kc=strchr(cgi_name[ii], '=')) != NULL) { *kc=0; cgi_wert[ii]=kc+1; } else { cgi_wert[ii]=NULL; } } return 1; }


Home Index Zurück unbelegt

Erstellt von © Uwe Brinkmann - bingo e.V. - Stand 31.10.96