mirror of https://github.com/adamdruppe/arsd.git
Remove an allocation when decoding base64
This commit is contained in:
parent
97313ae98e
commit
a2bec4b4fa
29
email.d
29
email.d
|
@ -9,6 +9,9 @@ pragma(lib, "curl");
|
||||||
import std.base64;
|
import std.base64;
|
||||||
import std.string;
|
import std.string;
|
||||||
import std.range;
|
import std.range;
|
||||||
|
import std.utf;
|
||||||
|
import std.array;
|
||||||
|
import std.algorithm.iteration;
|
||||||
|
|
||||||
import arsd.characterencodings;
|
import arsd.characterencodings;
|
||||||
|
|
||||||
|
@ -866,18 +869,10 @@ class IncomingEmailMessage {
|
||||||
break;
|
break;
|
||||||
case "base64":
|
case "base64":
|
||||||
if(textMessageBody.length) {
|
if(textMessageBody.length) {
|
||||||
// alas, phobos' base64 decoder cannot accept ranges, so we have to allocate here
|
textMessageBody = textMessageBody.decodeBase64Mime.convertToUtf8Lossy(charset);
|
||||||
char[] mmb;
|
|
||||||
mmb.reserve(textMessageBody.length);
|
|
||||||
foreach (char ch; textMessageBody) if (ch > ' ' && ch < 127) mmb ~= ch;
|
|
||||||
textMessageBody = convertToUtf8Lossy(Base64.decode(mmb), charset);
|
|
||||||
}
|
}
|
||||||
if(htmlMessageBody.length) {
|
if(htmlMessageBody.length) {
|
||||||
// alas, phobos' base64 decoder cannot accept ranges, so we have to allocate here
|
htmlMessageBody = htmlMessageBody.decodeBase64Mime.convertToUtf8Lossy(charset);
|
||||||
char[] mmb;
|
|
||||||
mmb.reserve(htmlMessageBody.length);
|
|
||||||
foreach (char ch; htmlMessageBody) if (ch > ' ' && ch < 127) mmb ~= ch;
|
|
||||||
htmlMessageBody = convertToUtf8Lossy(Base64.decode(mmb), charset);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -1172,6 +1167,20 @@ string encodeBase64Mime(const(ubyte[]) content, string LINESEP = "\r\n") {
|
||||||
return cast(immutable(char[]))content.chunks(SOURCE_CHUNK_LENGTH).base64encode.join(LINESEP);
|
return cast(immutable(char[]))content.chunks(SOURCE_CHUNK_LENGTH).base64encode.join(LINESEP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Base64 range decoder UFCS helper.
|
||||||
|
alias base64decode = Base64.decoder;
|
||||||
|
|
||||||
|
/// Base64 decoder, ignoring linebreaks which are mandated by RFC2045
|
||||||
|
immutable(ubyte[]) decodeBase64Mime(string encodedPart) {
|
||||||
|
return cast(immutable(ubyte[])) encodedPart
|
||||||
|
.byChar // prevent Autodecoding, which will break Base64 decoder. Since its base64, it's guarenteed to be 7bit ascii
|
||||||
|
.filter!((c) => c != '\r')
|
||||||
|
.splitter!((c) => c == '\n')
|
||||||
|
.joiner
|
||||||
|
.base64decode
|
||||||
|
.array;
|
||||||
|
}
|
||||||
|
|
||||||
/+
|
/+
|
||||||
void main() {
|
void main() {
|
||||||
import std.file;
|
import std.file;
|
||||||
|
|
Loading…
Reference in New Issue