Am Montag, 4. Februar 2002 22:00 schrieben Sie:
Sobald Daten an den URL-String angehängt werden (GET-Methode) bekomme ich folgenden Fehler. apache error_log: [Mon Feb 4 21:18:38 2002] [error] [client 127.0.0.1] Premature end of script headers: /usr/local/httpd/cgi-bin/bionik.cgi
Ganz am Anfang des Programmes sollte bedingungslos "Content-Type: text/html\n" ausgegeben werden, damit der Apache überhaupt weiß, was jetzt für Daten kommen.
Ich habe nun die Ausgabe des Content-Types mit in die main Funktion genommen und so wird dieser auf jeden Fall als erstes an den WebServer übermittelt. Der alte Fehler (s.o.) bleibt aber bestehen. Ich werde mal meinen gesamten Quellcode in diese Mail einfügen vielleicht hat ja jemand Lust sich daran auszuprobieren. Die zugehörige HTML-Datei die das CGI aufruft ist unter http://www.htw-dresden.de/~s9247/steuer.htm zu finden (bzw. index.html beinhaltet das frameset).
<cgi quellcode> #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "cgi-lib.h"
char* vekTest(char *, int, int); void ausgabe(char*, int, int, char *); char* initvek(char *, int, char *, char *, FILE *); char* initvek_zufall(char *, int, int); void edit(char *vek, int anz, int breite, char *env);
int main() { int anz=384,breite=32,i,j,d,anzahlSterne,percent; char *file, *tmpFile="dat.tmp", *mode, *s, *env, *prozent; char vek[384]={'*'}; FILE *confFile; LIST *head; puts("Content-Type: text/html\n\n"); if((env=getenv("QUERY_STRING"))==0) env=""; head = cgi_input_parse(); s=find_val(head,"aktion"); if(strcmp("laden",s)==0) { file=find_val(head,"datei"); initvek(vek, anz, file, "r", confFile); ausgabe(vek, anz, breite, env); initvek(vek, anz, tmpFile, "w", confFile); } else initvek(vek, anz, tmpFile, "r", confFile); if(strcmp("speichern",s)==0) { file=find_val(head,"datei"); initvek(vek, anz, file, "w", confFile); ausgabe(vek, anz, breite, env); } if(strcmp("zufall",s)==0) { prozent=find_val(head,"prozent"); if(strlen(prozent)==1) percent=prozent[0]-48; if(strlen(prozent)==2) percent=((prozent[0])-48)*10+(prozent[1]-48); initvek_zufall(vek, anz, percent); initvek(vek, anz, file, "w", confFile); ausgabe(vek, anz, breite, env); } switch (env[0]) { case '1': vekTest(vek, anz, breite); ausgabe(vek, anz, breite, env); initvek(vek, anz, tmpFile, "w", confFile); break; case '2': ausgabe(vek, anz, breite, env); break; case '3': vekTest(vek, anz, breite); ausgabe(vek, anz, breite, env); initvek(vek, anz, tmpFile, "w", confFile); break; case '4': edit(vek, anz, breite, env); if(strlen(env)==1) break; if(strlen(env)==2) i=env[1]-48; if(strlen(env)==3) i=((env[1])-48)*10+(env[2]-48); if(strlen(env)==4) i=(env[1]-48)*100+(env[2]-48)*10+(env[3]-48); if(vek[i]==' ') vek[i]='*'; else vek[i]=' '; /**initvek(vek, anz, tmpFile, "w", confFile);**/ edit(vek, anz, breite, env); break; } return 0; }
char* vekTest(char *vek, int anz, int breite) { char vekSicher[384]={' '}; int i, merke; for(i=0;i<anz;i++) { merke=0; if(vek[i]=='*') { if((vek[i-breite+1]=='*') && (i>breite-1) && ((i+breite+1)%breite)) merke++; if((vek[i-breite]=='*') && (i>breite-1)) merke++; if((vek[i-breite-1]=='*') && (i>breite) && ((i+breite)%breite)) merke++; if((vek[i-1]=='*') && (i>0) && ((i+breite)%breite)) merke++; if((vek[i+1]=='*') && ((i+breite+1)%breite)) merke++; if((vek[i+breite-1]=='*') && (i<anz) && ((i+breite)%breite)) merke++; if((vek[i+breite]=='*') && (i<anz)) merke++; if((vek[i+breite+1]=='*') && (i<anz-1) && ((i+breite+1)%breite)) merke++; if((merke==0)||(merke==1)||(merke>3)) vekSicher[i]=' '; else vekSicher[i]='*'; } if(vek[i]==' ') { if((vek[i-breite+1]=='*') && (i>breite-1) && ((i+breite+1)%breite)) merke++; if((vek[i-breite]=='*') && (i>breite-1)) merke++; if((vek[i-breite-1]=='*') && (i>breite) && ((i+breite)%breite)) merke++; if((vek[i-1]=='*') && (i>0) && ((i+breite)%breite)) merke++; if((vek[i+1]=='*') && ((i+breite+1)%breite))merke++; if((vek[i+breite-1]=='*') && (i<anz) && (((i+breite)%breite))) merke++; if((vek[i+breite]=='*') && (i<anz)) merke++; if((vek[i+breite+1]=='*') && (i<anz-1) && ((i+breite+1)%breite)) merke++; if(merke==3) vekSicher[i]='*'; else vekSicher[i]=' '; } } for(i=0;i<anz;i++) vek[i]=vekSicher[i]; return vek; }
char *initvek(char *vek, int anz, char *tmpFile,char *mode, FILE *confFile) { int i; if((confFile=fopen(tmpFile, mode))==0) ausgabe(vek,anz,0,"f"); if(mode=="r") { for(i=0;i<anz;i++) vek[i]=fgetc(confFile); fclose(confFile); } if(mode=="w") { for(i=0;i<anz;i++) fputc(vek[i],confFile); fclose(confFile); } return vek; }
char *initvek_zufall(char *vek, int anz, int percent){ int anzahlSterne,i,d; long sek; anzahlSterne=(anz/100)*percent; time(&sek); srand(sek); for(i=0;i<=anzahlSterne;i++) { d=rand()%anz; if(!(vek[d]=='*')) vek[d]='*'; else i--; } for(i=0;i<anz;i++) { if(!(vek[i]=='*')) vek[i]=' '; } return vek; }
void ausgabe(char *vek, int anz, int breite, char *env) { int i; char html; puts("<html><head>"); if (env[0]=='1') puts("<meta http-equiv="refresh" content="1; URL="../cgi-bin/bionik.cgi?1">"); puts("<title>Bionik CGI</title></head><body><center>\n"); if (env[0]=='f') puts("Konnte angegebene Datei nicht öffnen"); else { puts("<table border=1>"); for(i=0;i<anz;i++) { if(!((i+breite)%breite)) puts("<tr>"); if((i+1)%breite) { html=vek[i]; if (!(html=='*')) puts("<td> </td>"); else {puts("<td>");putchar(vek[i]);puts("</td>");} } else { html=vek[i]; if (!(html=='*')) { puts("<td> </td></tr>"); } else { puts("<td>"); putchar(vek[i]); puts("</td></tr>"); } } } } puts("</table>"); puts("</center></body></html>"); }
void edit(char *vek, int anz, int breite, char *env) { int i,veki; char html; puts("Content-Type: text/html\n\n"); puts("<html><head>"); puts("<title>Bionik CGI</title></head><body><center>\n"); puts("<table border=1>"); for(i=0;i<anz;i++) { if(!((i+breite)%breite)) puts("<tr>"); if((i+1)%breite) { html=vek[i]; if (!(html=='*')) printf("<td><a href="../cgi-bin/bionik.cgi?%d"> </a></td>",i); else { printf("<td><a href="../cgi-bin/bionik.cgi?%d">",i); putchar(vek[i]); puts("</a></td>"); } } else { html=vek[i]; if (!(html=='*')) { printf("<td><a href="../cgi-bin/bionik.cgi?%d"> </a></td></tr>",i); } else { printf("<td><a href="../cgi-bin/bionik.cgi?%d">",i); putchar(vek[i]); puts("</td></tr>"); } } } puts("</table>"); puts("</center></body></html>"); } </cgi quellcode>