Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
Multipart test now uses a fixture instead of CURL
Browse files Browse the repository at this point in the history
  • Loading branch information
felixge authored and ry committed Oct 7, 2009
1 parent 3fd1cba commit abbc624
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 12 deletions.
20 changes: 16 additions & 4 deletions lib/multipart.js
Expand Up @@ -4,7 +4,7 @@ exports.parse = function(options) {

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) {
Expand All @@ -23,6 +23,18 @@ exports.parse = function(options) {
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);

Expand All @@ -40,13 +52,13 @@ proto.init = function(options) {
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
Expand Down Expand Up @@ -152,7 +164,7 @@ Part.prototype.write = function(chunk) {
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;
Expand Down
11 changes: 11 additions & 0 deletions test/mjsunit/fixtures/multipart.js
@@ -0,0 +1,11 @@
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");
20 changes: 13 additions & 7 deletions test/mjsunit/test-multipart.js
Expand Up @@ -2,6 +2,8 @@ node.mixin(require("common.js"));
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;
Expand All @@ -13,12 +15,12 @@ var server = http.createServer(function(req, res) {
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] = '';
Expand All @@ -27,9 +29,9 @@ var server = http.createServer(function(req, res) {
});
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++;
});
Expand All @@ -44,9 +46,13 @@ var server = http.createServer(function(req, res) {
});
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);
});
2 changes: 1 addition & 1 deletion test/mjsunit/test-readdir.js
Expand Up @@ -7,7 +7,7 @@ puts("readdir " + fixturesDir);

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 () {
Expand Down

0 comments on commit abbc624

Please sign in to comment.