Piotr,
Can you provide an enhanced unit with your fixes ?
Remember that the fixes should not break existing code !
--
[EMAIL PROTECTED]
http://www.overbyte.be
- Original Message -
From: "Piotr Hellrayzer Da³ek" <[EMAIL PROTECTED]>
To: "TWSocket"
Sent: Saturday, July 30, 2005 4:20 PM
Subject: [twsocket] [TMimeDec] Preamble and Epilogue
> Hi!
>
> TMimeDec does NOT ignore MIME preamble and epilogue, so it fails to decode
> correctly complex multipart message from RFC 2049 Appendix A. Specifically,
> when it sees ending boundary ("--boundary--") it starts another part.
>
> Disabling preamble parsing as text/plain is very simple, just have to
> check in OnHeaderEnd if the ContentType starts with "multipart/" - if so,
> we have to ignore next "part". With preambles and epilogues of embedded
> parts is far worse. Let's see the ProcessPartLine:
>
> procedure TMimeDecode.ProcessPartLine; { ##ERIC }
> var
> Len : Integer;
> t : Integer;
> s : String;{ ##ERIC }
> begin
> { Check if end of part (boundary line found) }
> if (FCurrentData <> nil) and (FCurrentData^ <> #0) then begin
> s := LowerCase(StrPas(FCurrentData));
> if (s = FBoundary) then begin
> PreparePart;
> exit;
> end
> else if (s = (FBoundary + '--')) then begin
> FEndOfMime := TRUE;
> PreparePart;
> exit;
> end
> else begin
> for t := 0 to FEmbeddedBoundary.Count - 1 do begin
> if (s = FEmbeddedBoundary[t]) or
>(s = (FEmbeddedBoundary[t] + '--')) then begin
> { we now have to wait for the next part }
> PreparePart;
> exit;
> end
> end;
> end;
> end;
> [..]
>
> What do we see? When we hit epilogue of *the message*, we get information
> about that we're done with MIME (whatever that should mean...). We don't
> get *any* information if we crossed the ending boundary ("--boundary--")
> and start parsing epilogue. TMimeDec simply starts another part! My fix:
>
> procedure TMimeDecode.ProcessPartLine; { ##ERIC }
> var
> Len : Integer;
> t : Integer;
> s : String;{ ##ERIC }
> begin
> { Check if end of part (boundary line found) }
> if (FCurrentData <> nil) and (FCurrentData^ <> #0) then begin
> s := LowerCase(StrPas(FCurrentData));
> if (s = FBoundary) then begin
> PreparePart;
> exit;
> end
> else if (s = (FBoundary + '--')) then begin
> FPartOpened := False; //phd
> TriggerPartEnd; //phd
> exit;
> end
> else begin
> for t := 0 to FEmbeddedBoundary.Count - 1 do begin
> if s = FEmbeddedBoundary[t] then begin //phd
> PreparePart; //phd
> Exit; //phd
> end else if s=(FEmbeddedBoundary[t] + '--')) then begin
> FPartOpened := False; /phd
> TriggerPartEnd; //phd
> exit; //phd
> end
> end;
> end;
> end;
> [..]
>
> And I propose that we throw away that FEndOfMime. From my point of view,
> it's useless, and still eats that byte or four (if compiler aligns variables
> on dword boundaries).
>
> --
> Piotr "Hellrayzer" Dalek
> Author of ICS-Based Hellcore Mailer - an Outlook Express killer
> http://www.hcm.prv.pl
> [EMAIL PROTECTED]
>
> --
> Najlepszy serwis MOTO w Polsce! >>> http://link.interia.pl/f18a8
>
> --
> To unsubscribe or change your settings for TWSocket mailing list
> please goto http://www.elists.org/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be
>
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be