Http Status Code 413 und die Browser

Wieder mal stundenlang gejagt und bei der Lösung in lautes Fluchen ausgebrochen. Das Szenario: Ein Webserver mit Apache, welcher mit einem LimitRequestBody von 10MB konfiguriert ist. Das sorgt dafür, dass der Apache z.B. den Upload einer Datei von 11MB mit dem Http Status Code 413 (Request Entity Too Large) ablehnt.

Schön und gut. Im lokalen Entwicklungsnetz klappt das auch alles ganz wunderbar und alle Browser zeigen das vom Apache beigefügte ErrorDocument auch brav an. Die Webanwendung im Browser kann das dann auswerten (z.B. im Title-Tag nach 413 suchen) und dem Nutzer mitteilen, dass er leider, leider das Upload-Limit ignoriert habe.

In der realen Welt klappt das dann nun gar nicht: Sobald der Server im bösen Internet ist, passiert folgendes: Die Browser (mit der löblichen Ausnahme von Opera) laden und laden und laden – und behaupten dann schlussendlich, dass der Server nicht erreichbar wäre (Internet Explorer, Firefox, Safari – alles dasselbe). Was passiert da? Ganz einfach: Die Browser senden ein erstes TCP-Paket, in welchem steht, dass sie 11MB hochzuladen gedenken. Der Server antwortet augenblicklich mit HTTP Status Code 413. Opera macht es als einziger richtig und bricht den Upload augenblicklich ab. Alle anderen Browser ignorieren dies völlig und senden fröhlich die gesamte Datei an den Server.

Was dann passiert, kann ich nur vermuten: Erst nachdem sie die Datei komplett an den Server gesendet haben, scheinen sie nachzuschauen, was denn eigentlich vom Server zurückgekommen ist. Ging der Upload schnell genug, bemerken sie die zunächst ignorierte Antwort offenbar doch noch und geben das beigefügte ErrorDocument aus. Dauerte der Upload etwas zu lange (vielleicht länger als die TTL der Antwort?), meinen sie, das der Server nun gar nicht reagiert hätte und behaupten „Server nicht erreichbar“.

Na toll.