--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