Wednesday, October 6, 2010

Mime-stream

Sain lõpuks ometi tööle enam-vähem töötava mime formaadis striimi parseri. See tähendab, et ühest otsast visatakse mime-formaadis kirja sisu parserile jaokaupa ette ja teisest otsast tuleb struktureeritud objekt välja. Kui keegi viitsib jälge ajada, siis detaile saab näha siin.

Momendil on kõige suuremaks teoreetiliseks probleemiks, kui mime boundary satub kogemata poolikuna edastatavate andmete hulka. See tähendab, et andmed tulevad umbes 10kB juppidena ning on vähemalt teoreetiline võimalus, et see vajalik serva tähis tuleb pooleldi ühe ja pooleldi teise andmehulgaga. Niikaua aga kui seda ei juhtu, tundub kõik toimivat.

Kirja manustes olevate binaarsete andmetega ei tehta tegelikult hetkel veel midagi, loetakse ainult baitide arv kokku, kuid edaspidi hakkab minema binary stream otse faili (GridFS) ning e-kirja andmete objektis asendatakse manuse sisu võtmega manuse juurde GridFS andmebaasis. Nii ei ole vaja tervet manusefaili korraga mällu lugeda (see aga tähendab, et manuste suurus ei ole põhimõtteliselt oluline - katsetasin näiteks 16 MB manuse vastuvõtmist ja erilist koormust ei paistnud see tekitavat).

Avastasin ka, et juhul kui kiri sisaldab manuseid, kipuvad mitmedki e-posti kliendid panema kogu kirja sisu nested multipart bloki sisse. Välise kirja sees on veel üks väiksem kiri, mis siis sisaldab tegelikku kirja sisu. Sellisel juhul välises kirjas on a) vaid text/plain sisublokk või b) ei ole üldse midagi ja kogu kirja sisu tuleb multipart blokist otsida.

Igatahes, tundub, et kõik suuremad probleemid on praeguseks suunal saatja -> vastuvõttev server -> kliendile edastamine lahendatud. Lõpliku lahenduseni on veel palju maad, kuid see on rohkem juba tegemise vaev.