cgi und cin



  • Hallo,

    ich habe ein html-Formular und möchte die Eingabe über cgi auslesen. Nach einer Eingabe lädt der Browser allerdings nur, ich vermute, dass es was mit dem cin zu tun hat. Bei einem fixen string wie z.B. "Hallo" ist die Ausgabe korrekt.

    Weiß jemand woran das liegt?

    Grüße

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>Formular</title>
    </head>
    <body>
    <h1>Ein Formular</h1>
    <form action="cgi-bin/formular-verarbeiter.cgi" method="post">
    <p>
    Eingabe:
    <input name="EingabeFeld" size="40"></p>
    <p>
    <input type="submit" value="Formulardaten senden">
    </form>
    </body>
    </html>
    
    #include <iostream>
    using namespace std;
    
    int main(){
    cout << "Content-type: text/html" << endl;
    cout << endl;
    
    string eingabe;
    cin >> eingabe;
    
    cout << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">" << endl;
    cout << "<html><head><title>CGI-C++ FormularVerarbeiter</title></head>" << endl;
    cout << "<body><h1>Formular-Verarbeiter</h1>" << endl;
    cout << "empfangen:" << endl;
    cout << "<p>" << endl;
    cout << eingabe << endl; 
    cout << "</body></html>" << endl;
    }
    


  • Das ist so weit von einem funktionierenden CGI-Skript entfernt, dass ich da nur empfehlen kann, Dich erst mal ein wenig in CGI einzuarbeiten. Bei CGI bekommst Du die Eingaben eben nicht über die Standardeingabe sondern über Umgebungsvariablen.


  • Mod

    Ist schon einige Jahre her dass ich direkt CGI Anwendungen geschrieben habe - aber IIRC kommt POST schon per stdin und in der Umgebungsvariable CONTENT_LENGTH steht die Länge der Daten die per stdin kommen...

    Oder verwechsle ich da gerade etwas?



  • Oha - richtig - ist ja ein POST request. Das hatte ich tatsächlich übersehen.



  • Wie bereits gesagt musst du Content-Length auslesen und eben so viele Zeichen lesen.


  • Mod

    Ich hab in einem alten Code von mir folgenden Schnipsel gefunden:

    std::size_t size=std::atoi(GetEnvironment("CONTENT_LENGTH"));
                input.reserve(size);
                std::fread(input.c_str(),1,size,stdin);
                Parser(input.c_str(),method::post).parse(postVars);
    

    uU ist das Problem dass cin auf ein Leerzeichen wartet, dass aber nie kommt und daher blockiert. Das ist aber nur geraten.

    PS:
    input ist hier kein std::string


Anmelden zum Antworten