Skip to content

Commit 1bf360d

Browse files
author
Andrei
committed
Merge pull request nodeSolidServer#203 from nicola/write-stream-clean
Write streams part 2
2 parents ae54bab + 6c59b32 commit 1bf360d

5 files changed

Lines changed: 50 additions & 22 deletions

File tree

lib/handlers/post.js

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
module.exports = handler
22

33
var Busboy = require('busboy')
4-
var each = require('async').each
54
var debug = require('debug')('ldnode:post')
65
var header = require('../header')
76
var patch = require('./patch')
@@ -10,7 +9,7 @@ var error = require('../http-error')
109
function handler (req, res, next) {
1110
var ldp = req.app.locals.ldp
1211
var contentType = req.get('content-type')
13-
12+
debug('content-type is ', contentType)
1413
// Handle SPARQL(-update?) query
1514
if (contentType === 'application/sparql' ||
1615
contentType === 'application/sparql-update') {
@@ -37,7 +36,7 @@ function handler (req, res, next) {
3736
}
3837

3938
// Dispatch to the right handler
40-
if (contentType === 'multipart/form-data') {
39+
if (req.is('multipart/form-data')) {
4140
multi(req, res, next)
4241
} else {
4342
one(req, res, next)
@@ -46,30 +45,34 @@ function handler (req, res, next) {
4645

4746
function multi () {
4847
debug('receving multiple files')
49-
var busboy = new Busboy({ headers: req.headers })
50-
var files = []
5148

49+
var busboy = new Busboy({ headers: req.headers })
5250
busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
5351
debug('one file received via multipart: ' + filename)
54-
files.push({stream: file, name: filename})
52+
ldp.post(
53+
req.hostname,
54+
containerPath,
55+
filename,
56+
file,
57+
false,
58+
function (err) {
59+
if (err) {
60+
busboy.emit('error', err)
61+
}
62+
})
5563
})
64+
busboy.on('error', function (err) {
65+
debug('error receiving the file: ' + err.message)
66+
next(error(500, 'Error receiving the file'))
67+
})
68+
69+
// Handled by backpressure of streams!
5670
busboy.on('finish', function () {
57-
each(
58-
files,
59-
function (file, callback) {
60-
ldp.post(
61-
req.hostname,
62-
containerPath,
63-
file.filename,
64-
file.stream,
65-
false,
66-
callback)
67-
}, function (err) {
68-
debug('done storing files' + (err ? 'with error' + err.message : 'with no error'))
69-
res.sendStatus(err ? 500 : 200)
70-
next()
71-
})
71+
debug('done storing files')
72+
res.sendStatus(200)
73+
next()
7274
})
75+
req.pipe(busboy)
7376
}
7477

7578
function one () {
@@ -85,6 +88,7 @@ function handler (req, res, next) {
8588
if (err) {
8689
return next(err)
8790
}
91+
debug('file stored on ' + resourcePath)
8892
header.addLinks(res, linkHeader)
8993
res.set('Location', resourcePath)
9094
res.sendStatus(201)

lib/ldp.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ LDP.prototype.get = function (host, reqPath, baseUri, includeBody, contentType,
371371
ldp.stat(filename, function (err, stats) {
372372
// File does not exist
373373
if (err) {
374-
return callback(error(err, 'Can\t find resource requested'))
374+
return callback(error(err, 'Can\'t find resource requested'))
375375
}
376376

377377
// Just return, since resource exists

test/http.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,4 +371,28 @@ describe('HTTP APIs', function () {
371371
.expect(200, done)
372372
})
373373
})
374+
describe('POST (multipart)', function () {
375+
it('should create as many files as the ones passed in multipart', function (done) {
376+
server.post('/sampleContainer/')
377+
.attach('timbl', __dirname + '/resources/timbl.jpg')
378+
.attach('nicola', __dirname + '/resources/nicola.jpg')
379+
.expect(200)
380+
.end(function (err) {
381+
if (err) return done(err)
382+
383+
var sizeNicola = fs.statSync(__dirname + '/resources/nicola.jpg').size
384+
var sizeTim = fs.statSync(__dirname + '/resources/timbl.jpg').size
385+
var sizeNicolaLocal = fs.statSync(__dirname + '/resources/sampleContainer/nicola.jpg').size
386+
var sizeTimLocal = fs.statSync(__dirname + '/resources/sampleContainer/timbl.jpg').size
387+
388+
if (sizeNicola === sizeNicolaLocal && sizeTim === sizeTimLocal) {
389+
return done()
390+
} else {
391+
return done(new Error('Either the size (remote/local) don\'t match or files are not stored'))
392+
}
393+
rm('sampleContainer/nicola.jpg')
394+
rm('sampleContainer/timbl.jpg')
395+
})
396+
})
397+
})
374398
})

test/resources/nicola.jpg

59.6 KB
Loading

test/resources/timbl.jpg

19.1 KB
Loading

0 commit comments

Comments
 (0)