diff --git a/lib/express/core.js b/lib/express/core.js index 2dc7a92671..7542f8a915 100644 --- a/lib/express/core.js +++ b/lib/express/core.js @@ -219,18 +219,28 @@ Server = Class({ request.setBodyEncoding('binary') if (request.headers['content-type'] && request.headers['content-type'].indexOf('multipart/form-data') !== -1) { - var stream = new multipart.Stream(request) + var stream = new multipart.Stream(request), + promise = new process.Promise, + pendingFiles = 0 request.params = { post: {}} stream.addListener('part', function(part){ if (part.filename) { var file = new File(part.tempfile = '/tmp/express-' + Number(new Date) + uid(), 'w') + ++pendingFiles part.pos = 0 part.addListener('body', function(chunk){ - file.write(chunk, part.pos, 'binary') + file.write(chunk, part.pos, 'binary').addErrback(function(){ + promise.emitError.apply(promise, arguments) + }) part.pos += chunk.length }) part.addListener('complete', function(){ - file.close() + file.close().addCallback(function(){ + if (!--pendingFiles) + promise.emitSuccess() + }).addErrback(function(){ + promise.emitError.apply(promise, arguments) + }) mergeParam(part.name, part, request.params.post) }) } @@ -242,7 +252,9 @@ Server = Class({ if (part.buf.length) mergeParam(part.name, part.buf, request.params.post) }) - }).addListener('complete', function(){ self.route(request, response) }) + }).addListener('complete', function(){ + promise.addCallback(function(){ self.route(request, response) }) + }) } else request