diff --git a/multipart.js b/multipart.js index 1efecfe..260db84 100644 --- a/multipart.js +++ b/multipart.js @@ -18,6 +18,7 @@ */ exports.Parse = function(multipartBodyBuffer,boundary){ var process = function(part){ + //console.log('part', part); // will transform this object: // { header: 'Content-Disposition: form-data; name="uploads[]"; filename="A.txt"', // info: 'Content-Type: text/plain', @@ -30,25 +31,32 @@ exports.Parse = function(multipartBodyBuffer,boundary){ var b = JSON.parse(k[1].trim()); var o = {}; Object.defineProperty( o , a , - { value: b, writable: true, enumerable: true, configurable: true }) + { value: b, writable: true, enumerable: true, configurable: true }); return o; } - var header = part.header.split(';'); - var file = obj(header[2]); - var contentType = part.info.split(':')[1].trim(); + var header = part.header.split(';'); + var file = obj(header[2] ? header[2] : 'filename=\"NOT_A_FILE\"'); + var contentType = (part.info) ? (part.info.split(':')[1].trim()) : 'text/plain'; Object.defineProperty( file , 'type' , { value: contentType, writable: true, enumerable: true, configurable: true }) - Object.defineProperty( file , 'data' , - { value: new Buffer(part.part), writable: true, enumerable: true, configurable: true }) - return file; + + if(contentType === 'text/plain') { + Object.defineProperty( file , 'data' , + { value: new Buffer(part.value), writable: true, enumerable: true, configurable: true }) + } else { + Object.defineProperty( file , 'data' , + { value: new Buffer(part.part), writable: true, enumerable: true, configurable: true }) + } + return file; } var prev = null; var lastline=''; var header = ''; var info = ''; var state=0; var buffer=[]; + var value = ''; var allParts = []; - for(i=0;i 0 ? multipartBodyBuffer[i-1] : null; var newLineDetected = ((oneByte == 0x0a) && (prevByte == 0x0d)) ? true : false; @@ -76,6 +84,7 @@ exports.Parse = function(multipartBodyBuffer,boundary){ if((3 == state) && newLineDetected){ state=4; buffer=[]; + value = lastline; lastline=''; }else if(4 == state){ @@ -83,9 +92,9 @@ exports.Parse = function(multipartBodyBuffer,boundary){ if(((("--"+boundary) == lastline))){ var j = buffer.length - lastline.length; var part = buffer.slice(0,j-1); - var p = { header : header , info : info , part : part }; + var p = { header : header , info : info , part : part , value : value }; allParts.push(process(p)); - buffer = []; lastline=''; state=5; header=''; info=''; + buffer = []; lastline=''; state=5; header=''; info=''; value=''; }else{ buffer.push(oneByte); } @@ -105,8 +114,8 @@ exports.Parse = function(multipartBodyBuffer,boundary){ exports.getBoundary = function(header){ var items = header.split(';'); if(items) - for(i=0;i= 0){ var k = item.split('='); return (new String(k[1])).trim(); @@ -125,12 +134,16 @@ exports.DemoData = function(){ body += "111Y\r\n"; body += "111Z\rCCCC\nCCCC\r\nCCCCC@\r\n\r\n"; body += "------WebKitFormBoundaryvef1fLxmoUdYZWXp\r\n"; - body += "Content-Disposition: form-data; name=\"uploads[]\"; filename=\"B.txt\"\r\n"; + body += "Content-Disposition: form-data; name=\"testMessage\";\r\n"; + body += "\r\n\r\n"; + body += "test message 123456\r\n"; + body += "------WebKitFormBoundaryvef1fLxmoUdYZWXp\r\n"; + body += "Content-Disposition: form-data; name=\"uploads[]\"; filename=\"C.txt\"\r\n"; body += "Content-Type: text/plain\r\n", body += "\r\n\r\n"; - body += "@22X"; - body += "222Y\r\n"; - body += "222Z\r222W\n2220\r\n666@\r\n"; + body += "@CCC"; + body += "CCCY\r\n"; + body += "CCCZ\rCCCW\nCCC0\r\n666@\r\n"; body += "------WebKitFormBoundaryvef1fLxmoUdYZWXp--\r\n"; return (new Buffer(body,'utf-8')); // returns a Buffered payload, so the it will be treated as a binary content.