HTTP und Socket-Probleme



  • Servus,

    ich habe einen Webserver in C++ implementiert. Die Socket Kommunikation klappt einwandfrei. Ich warte auf einen hereinkommende Verbindung auf Port 80 und arbeite den HTTP Request ab. Danach mach ich den Socket mit close() wieder zu und warte auf einen neuen Request.

    Nun hab ich 2 Probleme

    Da ich natürlicherweise bei Fehlerfällen auch die entsprechenden Status-Codes im HTTP-Protokoll zurückgeben will sende ich z.B. bei einem File das nicht auf dem Server liegt folgenden Header zuerst über den Socket zurück:

    HTTP/1.0 404 Not Found
    Connection: close
    Date: Datum
    Server: myHTTP Server v.0.0.1
    Content-Type: text/html
    "leerzeichen"
    

    und danach eine von mir in HTML geschriebene Seite über den selben Socket jedoch in einem anderen Funktionsaufruf zurück. So zeigt mir der IE nicht die von mir erstellte Seite an, sondern eine Browser-Fehlerseite. Der Firefox zeigt schön brav meine generierte Seite.

    Kann man das im IE steuern oder ihm explizit verbieten eigene Fehlerseiten zu verwenden ???

    Wenn ich über POST Daten sende und den Request am Server verarbeite läuft dieselbe Logik mit den Sockets. Wenn ich hier die Fehlerseite zurückschicke wird sie genau wie vorher im IE ausgetauscht und im Firefox angezeigt. Mache ich dann jedoch den Socket zu, sagen mir beide Browser "Verbindung unterbrochen - Die Verbindung zum Server wurde zurückgesetzt". Klar wurde sie zurückgesetzt. ICh bin ja fertig!!! Aber was hab ich vergessen?

    Wann kann ich den Socket zumachen?

    Gruß
    Spanky



  • Also Problem 1 ist gelöst. Der Firefox zeigt nun brav meine Seiten mit dem Fehlercode an. Den IE muss ich wohl austricksen, da er partout (<- wie schreibt man das) die eigenen Fehlerseiten nimmt. Ich umgehe das indem ich im immer ein 200 OK schicke und dann meine Fehlerseite.....he,he

    Mein 2. Problem besteht jedoch weiterhin. Die Anwendung lääuft auf dem Server durch, und in dem Moment in dem ich den Socket zu mache kommt die Fehlermeldung im Browser.

    Kann es vielleicht daran liegen, dass der Browser ein Connection: Keep-Alive schickt? Ich antworte ja mit HTTP/1.0 und mit Connection: Close da ich Keep-Alive nicht implementiert hab...kann aber eigentlich nicht sein, beim GET-Request ignoriere ich das ja auch...



  • Nach der letzten Headerzeile musst Du genau ein CR-LF-CR-LF schicken und dann Socket schliessen. Zeilen im HTTP-Header müssen mit CR-LF abgeschlossen werden und nach den Headern muß genau eine leere Zeile kommen.



  • Das Problem is fast gelöst. Dem Firefox hat schonmal nur noch ein Content-length gefehlt. Das ist auch glaube ich RFC konformer...

    For compatibility with HTTP/1.0 applications, HTTP/1.1 requests
    containing a message-body MUST include a valid Content-Length header
    field unless the server is known to be HTTP/1.1 compliant.

    Nach der letzten Headerzeile musst Du genau ein CR-LF-CR-LF

    Genau das meinte ich ja mit *Leerzeile*

    Ich schick in meiner letzten Zeile in der ich den Content-length hinzufüge ein

    sprintf(tmpStr, "Content-length: %ld\n\n", contentLength);
    

    Den tmpStr häng ich an meinen Output-String an und schicke ihn vor dem Datenblock über den Socket zurück....


Anmelden zum Antworten