diff --git a/src/core/lib/Mime.mjs b/src/core/lib/Mime.mjs
index dfe5e5de..5bdd59ce 100644
--- a/src/core/lib/Mime.mjs
+++ b/src/core/lib/Mime.mjs
@@ -24,9 +24,10 @@ class Mime {
this.mimeObj = Mime._parseMime(input);
}
- //TODO: Generator?
/**
* Extract data from mimeObjects and return object array containing them.
+ * extractData([["testa", "header", "subheader"], ["testb", "header"]]) would
+ * returns an array of objects {fields: {testa: "somestringornull", testb: "somestringornull"}, header: "somestringornull", body: "somestringornull"}
*
* @param {string[][]} headerObjects
* @param {boolean} header
@@ -116,11 +117,12 @@ class Mime {
throw new OperationError("Invalid mulitpart section no boundary");
}
const sections = [];
-
- Mime._splitMultipart(mimeObj.body, boundary).forEach(function(mimePart) {
- sections.push(Mime._parseMime(mimePart));
- }, sections);
- mimeObj.body = sections;
+ for (const val of Mime._splitMultipart(mimeObj.body, boundary)) {
+ sections.push(Mime._parseMime(val));
+ }
+ if (sections.length) {
+ mimeObj.body = sections;
+ }
}
return mimeObj;
}
@@ -135,7 +137,7 @@ class Mime {
static walkMime(mimeObj, method, recursive=true) {
const contType = Mime._extractField(mimeObj, "content-type");
method(mimeObj);
- if (recursive && mimeObj.body && contType && contType.startsWith("multipart/")) {
+ if (recursive && mimeObj.body && Array.isArray(mimeObj.body) && contType && contType.startsWith("multipart/")) {
mimeObj.body.forEach(function(obj) {
Mime.walkMime(obj, method);
});
@@ -181,8 +183,6 @@ class Mime {
});
}
-
- //TODO: Allow only a header as input
/**
* Breaks the header from the body and parses the header. The returns an
* object or null. The object contains the raw header, decoded body, and
@@ -280,7 +280,6 @@ class Mime {
return null;
}
- //TODO: turn into generator function
/**
* Splits a Mime document by the current boundaries and attempts to account
* for the current new line size which can be either the standard \r\n or \n.
@@ -289,11 +288,11 @@ class Mime {
* @param {string} boundary
* @return {string[]}
*/
- static _splitMultipart(input, boundary) {
- const output = [];
+ static *_splitMultipart(input, boundary) {
const newline = input.indexOf("\r") >= 0 ? "\r\n" : "\n";
- const boundaryStr = newline.concat("--", boundary);
- const last = input.indexOf(boundaryStr, "--");
+ const boundaryStr = "--".concat(boundary);
+ const boundaryStrEnd = newline.concat(boundaryStr);
+ const last = input.indexOf(boundaryStrEnd.concat("--"));
let begin = 0;
for (let end = 0; end !== last; begin = end) {
begin = input.indexOf(boundaryStr, begin);
@@ -301,13 +300,12 @@ class Mime {
break;
}
begin += boundaryStr.length;
- end = input.indexOf(boundaryStr, begin);
+ end = input.indexOf(boundaryStrEnd, begin);
if (end <= begin) {
break;
}
- output.push(input.substring(begin, end));
+ yield input.substring(begin, end);
}
- return output;
}
}
diff --git a/src/core/operations/ParseIMF.mjs b/src/core/operations/ParseIMF.mjs
index 83fd81b8..9df69d31 100644
--- a/src/core/operations/ParseIMF.mjs
+++ b/src/core/operations/ParseIMF.mjs
@@ -18,11 +18,11 @@ class ParseIMF extends Operation {
*/
constructor() {
super();
- this.name = "Parse Internet Message Format";
+ this.name = "Parse IMF";
this.module = "Default";
- this.description = ["Parse an IMF formatted messages following RFC5322.",
+ this.description = ["Parse an Internet Message Format (IMF) messages following RFC5322.",
"
",
- "Parses an IMF formated message. These often have the file extention ".eml"e; and contain the email headers and body. The output will be a file list of the root header and decoded mime parts.",
+ "Parses an IMF formated message. These often have the file extention ".eml" and contain the email headers and body. The output will be a file list of the root header and decoded mime parts.",
].join("\n");
this.infoURL = "https://tools.ietf.org/html/rfc5322";
this.inputType = "string";
@@ -30,7 +30,7 @@ class ParseIMF extends Operation {
this.presentType = "html";
this.args = [
{
- "name": "Decode Mime Encoded Words",
+ "name": "Decode Encoded-Words",
"type": "boolean",
"value": false
}
@@ -61,7 +61,7 @@ class ParseIMF extends Operation {
const dataObj = eml.extractData(fields);
let subject = null;
const retval = [];
- if (dataObj.length) {
+ if (dataObj.length >= 1) {
subject = dataObj[0].fields.subject;
if (dataObj[0].header) {
retval.push(new File([dataObj[0].header], "Header.txt", {type: "text/plain"}));