pl: multipart/form-data

Beitrag lesen

--boundary
Content-Type: image/gif name="bild" filename="foo.gif"

BINARY
--boundary

und das wird insofern umständlich als dass der Parser über die BINARY hinaus lesen muss, solage nämlich bis er wieder eine --boundary im Puffer hat.

Die meisten Parser benutzen dafür sogenannte Tokenizer, die den Text in logische Einheiten gliedern.

Ein echter Serializer macht es im konkreten Fall so (deserialize):

  • Länge des mitgelieferten Boundary-String ermitteln ($blen = length $boundary_string)
  • lese $blen aus STDIN, stehe danach vor einem Zeilenumbruch,
  • lese nun in Schritten von genau 1 byte weiter um den nächsten Zeilenumbruch zu finden,
  • wenn ich den Zeilenumbruch habe, parse ich die bisherigen Daten name=; filename=; Content-Type...
  • erstelle nun ein tmp/-Handle, lese aus STDIN in Schritten von 1 Byte weiter und kopiere die gelesenen Bytes in das /tmp-Handle
  • beende das Lesen aus STDIN, wenn ich im Puffer den Boundary-String entdecke,
  • schneide den Boundary-String vom /tmp-Handle ab
  • sichere die gewonnenen Daten in meinem Parser-Objekt
  • wiederhole den hier beschriebenen Algorithnmus solange, bis keine Daten mehr kommen.

Da ich mich in STDIN nicht per seek() bewegen kann, kopiere ich STDIN nach IO::String bevor ich überhaupt anfange. Das /tmp-Handle kann ebenfalls ein IO::String-Objekt sein oder eine temporäre Datei.

Übrigens: Eine Boundary zu setzen die mit haufenweise Bindestrichen beginnt, ist irgendwie auch bescheuert weil 2 Bindestriche sowohl vorn als auch hinten angefügt werden (viel Spaß beim Debuggen). pl