2013-05-24 19 views
5

Als HTTP 1.1-Server, antworte ich auf eine GET-Anforderung mit Statuscode 200 OK, dann starten Sie die Daten an den Client gesendet. Während dieses Sendevorgangs tritt ein Fehler auf und ich kann den Vorgang nicht beenden.HTTP: Fehler bei der Antwort nach Statuscode 200 OK

Ich kann keine neuen Statuscode als Endstatus Code bereits gesendet wurde.

Wie verhalte ich mich, der Kunden wissen zu lassen, ist ein Fehler aufgetreten, und ich kann nicht mit dieser HTTP-Anforderung weitergehen?

ich nur eine Lösung vorstellen kann: die Steckdose in der Nähe, aber es ist nicht perfekt: Es bricht die Keep-Alive-Funktion und keine eindeutige Erklärung des Fehlers an den Client gegeben wird.

Der HTTP-Standard scheint anzunehmen, dass der Server bereits weiß genau, was zu antworten, bevor er antworten beginnt. Aber das ist nicht immer der Fall. Beispiele: Ich gebe eine sehr große Datei (mehrere GB) von der Festplatte zurück, und ich bekomme einen IO-Fehler während des Lesens der Datei. Gleiches Beispiel mit einem großen DB-Dump.

Ich kann nicht meine ganze Antwort im Speicher konstruieren dann senden Sie es.

Der HTTP 1.1-Standard hilft für eine solche Verwendung mit der chunked Transfer-Codierung: Ich muss nicht einmal die endgültige Größe wissen, bevor Sie mit dem Senden der Antwort beginnen. Diese Verwendung ist also nicht von HTTP 1.1 ausgeschlossen.

+3

Es gibt einen Content-Length-Header, Kunde sollte wissen, welche Menge an Daten, die sie angeblich zu empfangen. Ich kann mir keinen anderen Weg vorstellen, aber ich gebe zu, dass ich nie überprüft habe, ob etwas passiert, nachdem die Datei übertragen wurde, kein "End-of-Transmission" -Head-Header, den ich gewusst hätte. Ich würde wetten Server ist egal egal, es ist HTTP-Client-Geschäft zu überprüfen, schließlich ist es der Client, der ursprünglich Ressource angefordert. –

+0

_know_ Sie haben den Inhalt vor dem Senden von '200'. Ja, die Pufferung verbraucht mehr Ressourcen (hauptsächlich Speicher), behebt jedoch diese Art von Dingen. Und mehrere 'GB's schreit zu mir' http' kann ein ungeeigneter Transport sein .... – Wrikken

+0

@Piotr Wadas: Der Inhaltslängen-Header kann nicht zurückgegeben werden, wenn wir die Antwortgröße nicht im Voraus wissen. Chunked Transfer Encoding existiert für diesen speziellen Zweck, scheint aber keine Möglichkeit zu bieten zu sagen "es gibt jetzt einen Fehler". – user1409932

Antwort

1

Schließlich fand ich eine mögliche Lösung hierfür: HTTP 1.1 Trailer headers.

In Chunked-codierten Körpern ermöglicht HTTP 1.1 dem Absender, Daten nach dem letzten (leeren) Chunk in Form eines Headerblocks hinzuzufügen. Die Spezifikation weist auf einige Anwendungsfälle hin, wie z. B. die fliegende Ausgabe eines md5 des Körpers und das Senden nach dem Körper, damit der Client seine Integrität überprüfen kann.

ich denke, es für die Fehlerberichterstattung verwendet werden könnte, auch wenn ich nichts über diese Art von Nutzung gefunden.

Die Fragen, die ich mit diesem zu sehen sind:

  • dies erfordert chunked Codierung (aber es ist nicht viel von einem Problem)
  • Anhänger unterstützen wahrscheinlich sehr gering ist:
    • serverseitige (Es könnte umgangen werden, indem manuell die Chunked-Codierung erstellt wird, aber da es nach der Inhaltscodierung (gzip) angewendet wird, würde es viel Neuimplementierung erfordern.
    • clientseitig (Fehler behoben nur in 2010 in curl zum Beispiel)
    • und Proxies (das könnte dann verliert die Anhänger, wenn nicht richtig implementiert)