Michael Schröpl: Ungepufferter POST-Request

Beitrag lesen

Ist es möglich, mit Perl einen ungepufferten POST-Request durchzuführen?
Im folgendem Beispiel wird zuerst STDIN eingelesen und erst dann der Request durchgeführt.
Bei grösseren Datenmengen ist dies aber nicht optimal.
Kennt jemand eine Möglichkeit, dieses Problem zu lösen?

Also irgendwo mehrere Schichten tiefer als LWP::UserAgent wird diese Kommunikation doch sicherlich mit TCP/IP-Sockets, Schleifen, Abfrage von Returncodes usw. ablaufen, also wahrscheinlich mit der Übertragung vieler einzelner Pakete.
Wenn Du Dir die Mühe machen willst, den Source-Code dieser Ebenen (den hast Du ja in Form der Module) zu verstehen, kannst Du sicherlich den POST-Aufruf mit einer dieser niedrigeren Ebenen abwickeln und verschränkt dazu Deine Datei einlesen.

Das macht aber nur dann Sinn, wenn Dir der Adreßraum für die Datei ausgeht (oder die Maschine sich zu Tode swappt). Wie groß sind denn Deine Datenmengen?

Und wem postest Du Deine Daten zu? Wenn das eine eigene Anwendung ist, dann kannst Du natürlich ein eigenes handshake-Protokoll aufmachen:

    1. Aufruf der URI ohne CGI-Parameter: Der Partner liefert Dir eine (eindeutige) Handle zurück. (Das Ganze soll ja parallel für mehrere Benutzer funktionieren.)
    1. und weitere Aufrufe, mit handle plus Paketnummer als zwei CGI-Parameter und einem Datenpaket (CGI-Multipart): Du sendest dein Paket, der Partner speichert es ab in eine Datei, deren Name das handle enthält. (Der Partner kann dabei zusätzlich darüber Buch führen, ob Du die Pakete lückenlos in korrekter Reihenfolge sendest ...)
  • Letzter Aufruf mit handle und Paketnummer "0": Der Partner schließt die Datenannahme ab und beginnt mit seiner Verarbeitung.

Dabei hast Du natürlich etwas Overhead für die einzelnen Verbindungsaufnahmen ... aber es ist so sicher schneller geschrieben als LWP::UserAgent zu lesen.

Und es ist fehlertoleranter bei großen Datenmengen: Wenn irgendwas nicht funktioniert, kannst Du eine eigene Fehlerbehandlung realisieren, statt daß alles verloren ist. Beispielsweise irgendwann später einfach die Übertragung wieder aufnehmen, denn der Partner weiß ja noch, wo er aufgehört hat, wenn er sich Deine Paketnummern gemerkt hat, und durch die handle findet er auch die passende Datei wieder.