Hallo Leute,
Ich habe folgendes Problem mit einem CGI-Skript:
Fall 1: Wenn ich mein CGI meinem eignen Rechner (SuSE 7.3, Kernel 2.4.10, i386) compiliere kann ich meinen Vektor aus einer Datei auslesen und initialisieren (char* initvek(char *, int, char *, char *, FILE *);) und auf der Webseite ausgeben (void ausgabe(char*, int, int, char *);). Wenn ich nun die Animation starten möchte bekomme ich einen Fehler durch den Webserver (The server encountered an internal error or misconfiguration and was unable to complete your request.).
Fall 2: Wenn ich mein CGI auf iaix5.informatik.htw-dresden.de compiliere kann ich alle Funktionen (Animation Start, Animaton Stop) nutzen und die Seite wird auch regelmässig geladen was über die Funktion void ausgabe(...) realisiert wird. Allerdings habe ich jetzt das Problem das mein Vektor nicht mehr initialisiert wird (wird nicht aus Datei ausgelesen) und damit immer eine leere Seite neu geladen wird. Im 2. Fall wird die Variable env mit den richtigen Werten belegt was ich durch eine Testfunktion überprüft habe. Die Ausgabefunktion wird auch korekt aufgerufen was ich mit einem Testwert überprüft habe.
Das CGI ist unter www.htw-dresden.de/~s9247/index.html zu erreichen.
Wo kann jetzt das Problem liegen das abhängig vom Ort der Compilierung immer nur ein Teil des Skriptes funktioniert? Welcher Teil des Quellcodes wird evtl. zur Problemlösung benötigt? Die Rechte auf dem Webserver für die einzulesende Datei und die Temporäre Datei sind richtig gesetzt.
Mit freundlichen Grüssen Clemens Altenburger
On Fri, Feb 01, 2002 at 02:09:53PM +0100, Clemens Altenburger wrote:
Hallo Leute,
Ich habe folgendes Problem mit einem CGI-Skript:
[schnibbl]
Das Programm ist erreichbar und macht auch etwas. Was es macht weiß ich leider nicht.
Programmiere doch eine Test-Klasse die die Funktionalität deines Programms testet. Schreib es so, dass du auf der Kommandozeile testen kannst ob das Programm funktioniert oder nicht.
thomas
Am Freitag, 1. Februar 2002 17:57 schrieben Sie:
Das Programm ist erreichbar und macht auch etwas. Was es macht weiß ich leider nicht.
Das Programm soll die Entwicklung von Zellstadien dynamisch als Website generieren. (Das Bionikanimation "Life" wurde 1970 vom britischen Mathematiker J.H. Conway erfunden. Wir betrachten einen zweidimensionalen Vektor mit n*m Elementen des Typs char. Enthält eine Zelle ein Leerzeichen, dann ist sie "tot". Es handelt sich um eine "lebende" Zelle, wenn in ihr ein "*" eingetragen ist. Mehrere benachbarte lebende Zellen bilden einen Organismus.)
Programmiere doch eine Test-Klasse die die Funktionalität deines Programms testet. Schreib es so, dass du auf der Kommandozeile testen kannst ob das Programm funktioniert oder nicht.
thomas
Ich habe nun mit verschiedenen Test die Funktionalität meines Programmes überprüft und auf der Kommandozeile funktioniert es ohne Probleme. Aber ich bekomme weiterhin noch einige Fehler wenn ich es als CGI starten möchte. Dazu habe ich mir die Apache logfiles angesehen und folgendes herausgefunden was ich nicht verstehe.
apache access_log:
127.0.0.1 - - [04/Feb/2002:21:18:25 +0100] "POST /cgi-bin/bionik.cgi HTTP/1.1" 200 5851 127.0.0.1 - - [04/Feb/2002:21:18:38 +0100] "GET /cgi-bin/bionik.cgi?3 HTTP/1.1" 500 610
Die Aufrufe der POST Methode funktionieren einwandfrei und werden ordentlich ausgeführt.
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
Nun habe ich mal Google gefragt was dieser Fehler bedeuten soll. Dabei bin ich darauf gestossen das zum grössten Teil falsche Rechte für Dateien für diesen Fehler verantwortlich sind. Das Programm benötigt eigentlich nur 3 Dateien die im cgi-bin Verzeichnis liegen und folgende Rechte haben:
-rwxr-xr-x 1 root root 31040 Feb 4 21:17 bionik.cgi* # das CGI-Skript -rwxr-xr-x 1 root root 384 Jan 30 15:48 config.001* # die Ausgangskonfiguration -rwxrwxrwx 1 root root 384 Feb 4 21:13 dat.tmp* #die temporäre Datei zum Zwischenspeichern des Vektors
Habt Ihr Ideen wo und wie ich weiter nach der Fehlerursache suchen kann?
Grüsse Clemens
Hallo,
On Mon, Feb 04, 2002 at 09:40:20PM +0100, Clemens Altenburger wrote:
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 Nun habe ich mal Google gefragt was dieser Fehler bedeuten soll. Dabei bin ich darauf gestossen das zum grössten Teil falsche Rechte für Dateien für diesen Fehler verantwortlich sind. Das Programm benötigt eigentlich nur 3 Dateien die im cgi-bin Verzeichnis liegen und folgende Rechte haben: Habt Ihr Ideen wo und wie ich weiter nach der Fehlerursache suchen kann?
Ich hatte kürzlich ein ähnliches Problem. Wenn Du dem Script über die GET-Methode einen String übergibst - wie tust Du den auswerten? Kann es sein, dass sich Dein Programm beim Aus- werten schon aufhängt und irgenwelches Unbrauchbares Zeugs an den Apache liefert? 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. (Das war übrigens das Problem bei meinem Script: ich hatte eine Fehlermeldung nach stdout abgesetzt bevor ich den Content- String ausgegeben habe). Achso, und an der HTW gibt es zwei verschiedene Webserver-Systeme. Auf www.informatik.htw-dresden.de läuft Linux und auf www.htw-dresden.de AIX. Das Programm muss deshalb auf der Plattform übersetzt werden, von deren Domain Du das Script dann aufrufen willst.
Gruß, Matthias
Am Montag, 4. Februar 2002 22:00 schrieben Sie:
Ich hatte kürzlich ein ähnliches Problem. Wenn Du dem Script über die GET-Methode einen String übergibst - wie tust Du den auswerten? Kann es sein, dass sich Dein Programm beim Aus- werten schon aufhängt und irgenwelches Unbrauchbares Zeugs an den Apache liefert? 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.
Das könnte das Problem sein. Bei mir sieht es im Moment so aus:
int main() { ..... if((env=getenv("QUERY_STRING"))==0) env=""; ..... switch (env[0]) { case '1': vekTest(vek, anz, breite); ausgabe(vek, anz, breite, env); // (*1 initvek(vek, anz, tmpFile, "w", confFile); break; ..... } return 0; } (*1 erst hier erfolgt die Ausgabe:
void ausgabe(char *vek, int anz, int breite, char *env) { .... puts("Content-Type: text/html\n"); puts("<html><head>"); if (env[0]=='1') puts("<meta http-equiv="refresh" content="1; URL="http://www.htw-dresden.de/~s9247/cgi-bin/bionik.cgi?1%5C%22%3E"); 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>"); }
Ich werde wohl die Funktion teilen müssen und den Seitenkopf in eine extra Funktion packen die ich dann vor Auswertung der env Variable in die main Funktion eingliedere. Danke erst mal für den Tip ich meld mich wenns funktioniert oder auch nicht.
Grüsse Clemens
Hallo Clemens,
On Tue, Feb 05, 2002 at 12:21:53AM +0100, Clemens Altenburger wrote:
[...] void ausgabe(char *vek, int anz, int breite, char *env) { .... puts("Content-Type: text/html\n"); puts("<html><head>");
Dein HTTP-Header sieht damit in etwa so aus: ----schnipp---- Content-Type: text/html <html><head> ... ----schnapp---- Ja, das HTML-Zeugs wird bei Dir dem HTTP-Header zugeordnet, was natuerlich schiefgehen muss.
Ergaenze in dem Programm noch ein \n nach "Content-Type: text/html\n", und schon ist der Header zu Ende und der Apache versteht die Welt wieder.
Im Ernstfall schadet ein Blick in RFC 2616 nicht, dort wird HTTP/1.1 definiert.
Gruss
Holger
Am Dienstag, 5. Februar 2002 19:17 schrieben Sie:
Ergaenze in dem Programm noch ein \n nach "Content-Type: text/html\n", und schon ist der Header zu Ende und der Apache versteht die Welt wieder.
Im Ernstfall schadet ein Blick in RFC 2616 nicht, dort wird HTTP/1.1
Ich denke \n\n bringt keinen Effekt da andere CGI's auch mit nur einem \n nach text/html laufen aber ich werd mir die RFC's mal anschauen, bringen wohl auch andere nützliche Informationen für mich.
Grüsse Clemens
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On Tuesday 05 February 2002 23:00, Clemens Altenburger wrote:
Am Dienstag, 5. Februar 2002 19:17 schrieben Sie:
Ergaenze in dem Programm noch ein \n nach "Content-Type: text/html\n", und schon ist der Header zu Ende und der Apache versteht die Welt wieder.
Im Ernstfall schadet ein Blick in RFC 2616 nicht, dort wird HTTP/1.1
Ich denke \n\n bringt keinen Effekt da andere CGI's auch mit nur einem \n nach text/html laufen aber ich werd mir die RFC's mal anschauen, bringen wohl auch andere nützliche Informationen für mich.
Was CGI liefern muss sieht so aus:
- -------- Content-Type: mime/type
Content Content ... - --------
Was es ausserdem liefern kann, so: - -------- HTTP/1.1 200 OK Content-Type: mime/type Location: /redirect.php Cookie: mycookie=somedata ....
<html><body> If your browser doesn't redirect automagically <a href="/redirect.php">click here.</a> </body></html> - ---------
Nach den Headern _muss_ also eine leere Zeile kommen, sonst weiss der Server/Browser nicht wo die Header aufhoeren (ausser mit Syntax-Ratespielen).
Konrad
- -- BOFH excuse #147:
Party-bug in the Aloha protocol.
On Tue, Feb 05, 2002 at 07:17:58PM +0100, Holger Dietze wrote:
Dein HTTP-Header sieht damit in etwa so aus: ----schnipp---- Content-Type: text/html
<html><head> ... ----schnapp---- Ja, das HTML-Zeugs wird bei Dir dem HTTP-Header zugeordnet, was natuerlich schiefgehen muss.
Ergaenze in dem Programm noch ein \n nach "Content-Type: text/html\n", und schon ist der Header zu Ende und der Apache versteht die Welt wieder.
Im Ernstfall schadet ein Blick in RFC 2616 nicht, dort wird HTTP/1.1 definiert.
Ohne nachgelesen zu haben: Wie man in einem CGI-Skript Infos für den HTTP-Header vom eigentlichen Dokument trennt, steht höchstwahrscheinlich nicht in einem RFC zu HTTP sondern in einer Doku zu CGI drin.
Reinhard
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On Wednesday 06 February 2002 02:53, Reinhard Foerster wrote:
On Tue, Feb 05, 2002 at 07:17:58PM +0100, Holger Dietze wrote:
Dein HTTP-Header sieht damit in etwa so aus: ----schnipp---- Content-Type: text/html
<html><head> ... ----schnapp---- Ja, das HTML-Zeugs wird bei Dir dem HTTP-Header zugeordnet, was natuerlich schiefgehen muss.
Ergaenze in dem Programm noch ein \n nach "Content-Type: text/html\n", und schon ist der Header zu Ende und der Apache versteht die Welt wieder.
Im Ernstfall schadet ein Blick in RFC 2616 nicht, dort wird HTTP/1.1 definiert.
Ohne nachgelesen zu haben: Wie man in einem CGI-Skript Infos für den HTTP-Header vom eigentlichen Dokument trennt, steht höchstwahrscheinlich nicht in einem RFC zu HTTP sondern in einer Doku zu CGI drin.
Doch steht drin, weil CGI dem Server schon protokoll-konforme Daten liefern muss. Apache ergaenzt dann nur noch ein paar Header.
Konrad
- -- BOFH excuse #80:
That's a great computer you have there; have you considered how it would work as a BSD machine?
On Wed, Feb 06, 2002 at 05:55:11AM +0100, Konrad Rosenbaum wrote:
Ohne nachgelesen zu haben: Wie man in einem CGI-Skript Infos für den HTTP-Header vom eigentlichen Dokument trennt, steht höchstwahrscheinlich nicht in einem RFC zu HTTP sondern in einer Doku zu CGI drin.
Doch steht drin, weil CGI dem Server schon protokoll-konforme Daten liefern muss. Apache ergaenzt dann nur noch ein paar Header.
Manno, musst du immer streiten? Ja, das CGI-Skipt muß "protokoll-konforme Daten liefern" - aber eben nach dem Protokoll von CGI und nicht von HTTP.
Es mag dir ja wie Krümelkackerei vorkommen, aber es steht natürlich NICHT im HTTP-RFC. Es geht hier nur um CGI. CGI könnte z.B. auch so definiert sein, daß alles vor einer Zeile ~+#_klirr_bumm_knall_#*~ vom Webserver in den Header der HTTP-Antwort übernommen wird. CGI könnte auch so definiert sein, daß man gar keine Header der HTTP-Antwort manipulieren kann. Wie es wirklich geht, steht _nicht_ im HTTP-RFC sondern in http://hoohoo.ncsa.uiuc.edu/cgi/out.html ---- Parsed headers The output of scripts begins with a small header. This header consists of text lines, in the same format as an HTTP header, terminated by a blank line (a line with only a linefeed or CR/LF). ----- Da und nirgends anders. Der Inhalt der "Header" hat also wie in HTTP definiert auszusehen. Die Trennung vom Rest ist in dem Zitat festgelegt.
Natürlich is die Trennung Header/Body für CGI "zufällig" genauso wie im HTTP definiert. Das tut nichts zur Sache. Du könntest genauso falsch behaupten, die Trennung komme vom SMTP oder sei gottgegeben.
Reinhard
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On Wednesday 06 February 2002 11:19, Reinhard Foerster wrote:
On Wed, Feb 06, 2002 at 05:55:11AM +0100, Konrad Rosenbaum wrote:
Doch steht drin, weil CGI dem Server schon protokoll-konforme Daten liefern muss. Apache ergaenzt dann nur noch ein paar Header.
Manno, musst du immer streiten? Ja, das CGI-Skipt muß "protokoll-konforme Daten liefern" - aber eben nach dem Protokoll von CGI und nicht von HTTP.
Reinhard, wir reden ueber Apache. Da sind CGI Output und HTTP Output identisch. Die CGI Input Schnittstelle sieht logischerweise anders aus (sie enthaelt noch einige Infos vom Server).
Warum also nicht den HTTP-RFC lesen? Nur so als Frage.
[re-sort]
Ohne nachgelesen zu haben: Wie man in einem CGI-Skript Infos für den HTTP-Header vom eigentlichen Dokument trennt, steht höchstwahrscheinlich nicht in einem RFC zu HTTP sondern in einer Doku zu CGI drin.
solche Antworten sind aber auch nicht sonderlich hilfreich...
Konrad
- -- BOFH excuse #16:
somebody was calculating pi on the server
On Wed, Feb 06, 2002 at 07:32:10PM +0100, Konrad Rosenbaum wrote:
Reinhard, wir reden ueber Apache. Da sind CGI Output und HTTP Output identisch.
Argl. So ein Müll. Schau dir bitte ab, was Apache per HTTP ausliefert, wenn das CGI-Skipt nichts weiter als ------- Content-type: text/plain
*blubber* -------- ausgibt. Wenn das für dich identisch ist hast du ein ernstes Problem.
Warum also nicht den HTTP-RFC lesen? Nur so als Frage.
Ich brauche ihn nicht zu lesen. Da steht sowieso nix zu CGI drin. Wenn es um CGI geht lese ich genausowenig HTTP-RFCs wie ich ich sie bei der Suche nach einem Rezept für Plaumenkuchen lesen würde.
Wenn du aber in diesem RFC wider Erwarten was über das Format von CGI-Output findest kannst du es mir gern schicken.
[re-sort]
Ohne nachgelesen zu haben: Wie man in einem CGI-Skript Infos für den HTTP-Header vom eigentlichen Dokument trennt, steht höchstwahrscheinlich nicht in einem RFC zu HTTP sondern in einer Doku zu CGI drin.
solche Antworten sind aber auch nicht sonderlich hilfreich...
Du unternimmst ja nichtmal den Versuch, das von mir in der letzten Mail geschriebene nachzuvollziehen. Das ist eine Write-Only-Diskussion deinerseits. Nicht sonderlich erheiternd für mich.
Reinhard
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>
On Thu, Feb 07, 2002 at 07:29:49PM +0100, Clemens Altenburger wrote:
Am Montag, 4. Februar 2002 22:00 schrieben Sie:
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
Muß nicht als erstes kommen. Du schreibst mit puts(), das geht nach STDIO, wird gepuffert. Sollte irgendwo jemand auf die Idee kommen, nach STDERR zu schreiben, wird das eher am Ausgang erscheinen (wird allerdings meistens umgelitten in den error_log des Webservers).
fork() oder system() sind auch so Kandidaten, deren nachfolgende Ausgabe gerne mal das überholen, was vorher mit puts() geschrieben wurde ...
Mach' doch mal nach dem ersten puts("Content-Type: text/html\n\n") ein flush auf STDIO.
Quellcode in diese Mail einfügen vielleicht hat ja jemand Lust sich daran
Uhhh -- das sieht mir nicht sehr leserlich aus. Könnte ja fast ein Perl-Script sein ;-)
Heiko
Am Freitag, 8. Februar 2002 00:01 schrieben Sie:
Muß nicht als erstes kommen. Du schreibst mit puts(), das geht nach STDIO, wird gepuffert. Sollte irgendwo jemand auf die Idee kommen, nach STDERR zu schreiben, wird das eher am Ausgang erscheinen (wird allerdings meistens umgelitten in den error_log des Webservers).
fork() oder system() sind auch so Kandidaten, deren nachfolgende Ausgabe gerne mal das überholen, was vorher mit puts() geschrieben wurde ...
Mach' doch mal nach dem ersten puts("Content-Type: text/html\n\n") ein flush auf STDIO.
Ich habe das jetzt folgendermassen angestellt:
int main() { ...... puts("Content-Type: text/html\n\n"); ffp=fopen("flushdat","w"); fflush(ffp); ..... }
Allerdings wird nix in die Datei hineingeschrieben währenddem ich das CGI ausführe. Was mache ich falsch? Oder heisst das jetzt das der Puffer leer ist und gar kein String vom CGI übermittelt wird?
Uhhh -- das sieht mir nicht sehr leserlich aus. Könnte ja fast ein Perl-Script sein ;-)
Programmiere seit 4 Monaten C und hab mir noch nicht den besten Stil angewöhnt :-).
Grüsse Clemens
On Fri, Feb 08, 2002 at 04:52:33PM +0100, Clemens Altenburger wrote:
Mach' doch mal nach dem ersten puts("Content-Type: text/html\n\n") ein flush auf STDIO.
puts("Content-Type: text/html\n\n"); ffp=fopen("flushdat","w"); fflush(ffp);
Er meinte vielmehr:
puts(...); fflush(stdout);
man stdout
Eric
lug-dd@mailman.schlittermann.de