Multipart test now uses a fixture instead of CURL
authorFelix Geisendörfer <felix@debuggable.com>
Tue, 6 Oct 2009 19:38:35 +0000 (21:38 +0200)
committerRyan Dahl <ry@tinyclouds.org>
Wed, 7 Oct 2009 00:03:24 +0000 (02:03 +0200)
lib/multipart.js
test/mjsunit/fixtures/multipart.js [new file with mode: 0644]
test/mjsunit/test-multipart.js
test/mjsunit/test-readdir.js

index e508279..0cb1018 100644 (file)
@@ -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) {
@@ -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);
 
@@ -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
@@ -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;
diff --git a/test/mjsunit/fixtures/multipart.js b/test/mjsunit/fixtures/multipart.js
new file mode 100644 (file)
index 0000000..51212ba
--- /dev/null
@@ -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");
\ No newline at end of file
index 020e94b..5d7ad30 100644 (file)
@@ -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;
@@ -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] = '';
@@ -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++;
     });
@@ -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);
 });
index 2bf09c6..8e53e14 100644 (file)
@@ -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 () {