Sven Rautenberg: HTTP-Proxyserver programmieren

Beitrag lesen

Moin!

GET -> Server sendet HEADER
Pause, weil der Proxy erstmal 4096 Byte in String wandelt, eine Ersetzung durchführt, wieder in Byte[] wandelt ...
-> Server sendet 4096 Byte BODY

Meine Vermutung war nun, dass diese Pause zu lang ist.

Kann ich nicht nachvollziehen, warum das so sein sollte. Denn es gibt überall Puffer dazwischen, die den Effekt einerseits dramatischer machen können, andererseits ihn auch ausgleichen.

Der Header ist ja kein einzelnes Datenpaket, was man schon mal vorab wegschicken könnte, sondern direkt im Anschluß kommt der Body. Folglich wird, in Puffern und Datenpaketen gerechnet, der Header wirklich erst dann ankommen, wenn noch soviel Body hinterherkommt, dass ein Paket voll ist. Oder (was natürlich auch geht) es werden halbvolle Pakete nach einer gewissen Zeit verschickt.

Das alles hat aber gegenüber den höheren Protokollschichten transparent zu sein. Eine TCP-Verbindung kann stundenlang offen sein, ohne dass irgendein Datenaustausch stattfindet, aber der Empfänger noch auf Daten wartet.

Die letzte, jetzt funktionierende, Lösung ist, wie ich es verstanden habe, diese Arbeitsweise des Proxys bei text/html:

-alles Zeilenweise einlesen und dabei gleich manipulieren
-HEADER komplettieren mit neuer Content-Length(??)
-HEADER senden
-BODY senden

Da würde ich ganz schlicht behaupten, dass der einzige und wichtigste Aspekt die Korrektur des Headers auf korrekte Werte ist. Das zeilenweise Durchreichen hingegen würde ich eher für uninteressant halten.

Allerdings: Man kann eine Content-Length für den vorliegenden Fall eines manipulierenden Proxys natürlich erst dann berechnen, wenn die komplette Ressource einmal eingelesen wurde, dann die Ersetzungsoperationen durchgeführt werden, und dann die neue Länge ermittelt wird.

Die Alternative wäre (sofern das laut Standard möglich ist), die Content-Length im Response komplett wegzulassen und dann einfach solange Daten zu senden, wie Originaldaten reinkommen.

- Sven Rautenberg

--
ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|