Skip to content

Instantly share code, notes, and snippets.

@MiguelCastillo
Last active September 18, 2021 18:42
Show Gist options
  • Select an option

  • Save MiguelCastillo/ee10faeb81eec5471ac1 to your computer and use it in GitHub Desktop.

Select an option

Save MiguelCastillo/ee10faeb81eec5471ac1 to your computer and use it in GitHub Desktop.
Multipart parse
function multipart(parts, done) {
this.boundary = multipart.generateBoundary();
this.parts = [];
this.filecount;
var readycount = Object.keys(parts).length;
function updateReady() {
readycount--;
if (!readycount) {
done();
}
}
for (var name in parts) {
if (parts.hasOwnProperty(name)) {
this.append(name, parts[name], updateReady);
}
}
}
multipart.prototype.append = function(name, value, done) {
var part = new multipart.part(name);
var filereader;
this.parts.push(part);
if (typeof(value) === "string") {
part.setValue(value);
return done();
}
if (typeof(value.type) === "string") {
if (!/^text/.test(value.type)) {
part.setHeader("Content-Transfer-Encoding", "binary");
}
part.setHeader("Content-Type", value.type);
}
if (typeof(value.name) === "string") {
this.filecount++;
part.setFilename(value.name);
filereader = new FileReader();
filereader.onload = function(evt) {
part.setValue(evt.target.result);
return done();
};
filereader.readAsBinaryString(value);
}
return part;
};
multipart.prototype.serialize = function() {
var body = '',
boundary = this.boundary,
result = {};
this.parts.forEach(function(part) {
body += '--' + boundry + "\r\n" + 'Content-Disposition: form-data; name="' + part.getName() + '";';
if (part.isFile()) {
body += ' filename="' + part.getFilename() + '"';
}
body += "\r\n";
for (var header in part.headers) {
body += header + ": " + part.headers[header] + "\r\n";
}
body += "\r\n" + part.getValue() + "\r\n";
});
result.body = body + '--' + result.boundry + '--';
result.length = result.body.length;
result.type = 'multipart/form-data; boundary=' + boundry;
return result;
};
multipart.generateBoundary = function() {
return "--------------" + Math.floor(Math.random()*1000000000);
};
/**
* Part object
*/
multipart.part = function(name) {
this.name = name;
this.headers = {};
};
multipart.part.prototype.getName = function() {
return this.name;
};
multipart.part.prototype.setValue = function(value) {
this.value = value;
};
multipart.part.prototype.getValue = function() {
return this.value;
};
multipart.part.prototype.setFilename = function(filename) {
this.filename = filename;
};
multipart.part.prototype.getFilename = function() {
return this.filename;
};
multipart.part.prototype.isFile = function() {
return !!this.filename;
};
multipart.part.prototype.setHeader = function(name, value) {
this.headers[name] = value;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment