var parts = {};
stream.addListener('part', function(part) {
- var name = part.headers['Content-Disposition'].name;
+ var name = part.headers['content-disposition'].name;
var buffer = '';
part.addListener('body', function(chunk) {
return promise;
};
+// Temporarly until http.ServerRequest.headers are case-insensitive
+function getHeader(name, headers) {
+ var val;
+ for (var header in headers) {
+ if (header.toLowerCase() === name.toLowerCase()) {
+ val = headers[header];
+ break;
+ }
+ }
+ return val;
+};
+
exports.Stream = function(options) {
node.EventEmitter.call(this);
this.part = null;
if ('headers' in options) {
- var req = options, contentType = req.headers['Content-Type'];
+ var req = options, contentType = getHeader('content-type', req.headers);
if (contentType) {
contentType = contentType.split(/; ?boundary=/)
this.boundary = '--'+contentType[1];
}
- this.bytesTotal = req.headers['Content-Length'];
+ this.bytesTotal = getHeader('content-length', req.headers);
var self = this;
req
return;
} else if (offset > 0) {
var header = this.buffer.substr(0, offset).split(/: ?/);
- this.headers[header[0]] = header[1];
+ this.headers[header[0].toLowerCase()] = header[1];
this.buffer = this.buffer.substr(offset+2);
} else if (offset === false) {
return;
--- /dev/null
+exports.reply = ["--AaB03x\r",
+"content-disposition: form-data; name=\"reply\"\r",
+"\r",
+"yes\r",
+"--AaB03x\r",
+"content-disposition: form-data; name=\"fileupload\"; filename=\"dj.jpg\"\r",
+"Content-Type: image/jpeg\r",
+"Content-Transfer-Encoding: base64\r",
+"\r",
+"/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg\r",
+"--AaB03x--\r\n"].join("\n");
\ No newline at end of file
http = require("/http.js");
var multipart = require('/multipart.js');
+var fixture = require('fixtures/multipart.js');
+
var port = 8222;
var parts_reveived = 0;
var parts_complete = 0;
stream.addListener('part', function(part) {
parts_reveived++;
- var name = part.headers['Content-Disposition'].name;
+ var name = part.headers['content-disposition'].name;
if (parts_reveived == 1) {
- assertEquals('test-field', name);
+ assertEquals('reply', name);
} else if (parts_reveived == 2) {
- assertEquals('test-file', name);
+ assertEquals('fileupload', name);
}
parts[name] = '';
});
part.addListener('complete', function(chunk) {
if (parts_reveived == 1) {
- assertEquals('foobar', parts[name]);
+ assertEquals('yes', parts[name]);
} else if (parts_reveived == 2) {
- assertEquals(node.fs.cat(__filename).wait(), parts[name]);
+ assertEquals('/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg', parts[name]);
}
parts_complete++;
});
});
server.listen(port);
-var cmd = 'curl -H Expect: -F test-field=foobar -F test-file=@'+__filename+' http://localhost:'+port+'/';
-var result = exec(cmd).wait();
+var client = http.createClient(port);
+var request = client.post('/', {'Content-Type': 'multipart/form-data; boundary=AaB03x', 'Content-Length': fixture.reply.length});
+request.sendBody(fixture.reply, 'binary');
+request.finish();
process.addListener('exit', function() {
+ puts("done");
assertEquals(2, parts_complete);
+ assertEquals(2, parts_reveived);
});
promise.addCallback(function (files) {
p(files);
- assertArrayEquals(["a.js", "b","x.txt"], files.sort());
+ assertArrayEquals(["a.js", "b", "multipart.js", "x.txt"], files.sort());
});
promise.addErrback(function () {