Skip to content

Instantly share code, notes, and snippets.

@bajtos
Created March 6, 2014 12:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bajtos/9388676 to your computer and use it in GitHub Desktop.
Save bajtos/9388676 to your computer and use it in GitHub Desktop.
Code to reproduce a bug in loopback-storage-service
var fs = require('fs');
var net = require('net');
var path = require('path');
var loopback = require('loopback');
var request = require('supertest');
var http = require('http');
var storageDir = path.join(__dirname, '_storage');
if (!fs.existsSync(storageDir)) fs.mkdirSync(storageDir);
var app = loopback();
//-- Authentication --//
app.dataSource('Memory', {
connector: loopback.Memory,
defaultForType: 'db'
});
app.model(loopback.AccessToken);
app.model('User', {
options: {
base: 'User',
relations: {
accessTokens: {
model: "AccessToken",
type: "hasMany",
foreignKey: "userId"
}
}
},
dataSource: 'Memory'
});
app.dataSource('mail', { connector: 'mail', defaultForType: 'mail' });
loopback.autoAttach();
//-- Storage --//
app.dataSource('storage', {
// connector: require('loopback-storage-service'),
connector: require('./'),
provider: 'filesystem',
root: storageDir
});
var Container = app.dataSources.storage.createModel('container');
app.model(Container);
Container.destroyAll = function(cb) {
Container.getContainers(function(err, containers) {
if (err) return cb(err);
next();
function next(err) {
if (err) return cb(err);
var c = containers.pop();
if (!c) return cb();
Container.destroyContainer(c.name, next);
}
});
};
Container.destroyAll.shared = true;
Container.destroyAll.http = { verb: 'del', path: '/' }
app.enableAuth(); // comment out this line to make the test pass
app.use(loopback.token({ model: app.models.AccessToken }));
app.use(loopback.rest());
var port;
app.listen(function() {
var port = this.address().port;
setup(this, function(err) {
if (err) throw err;
upload(port, function(err) {
if (err) throw err;
process.exit();
});
});
});
function setup(server, cb) {
// 1. Delete all containers
request(server)
.del('/containers')
.expect(204)
.end(function(err) {
if (err) throw err;
// 2. Create a container
request(server)
.post('/containers')
.send({ name: 'a-container' })
.expect(200)
.end(cb);
});
}
// 3. Upload a file
function upload(port, cb) {
var socket = net.createConnection(port);
socket.pipe(process.stdout);
socket.on('end', function() { cb(); });
send(
'POST /containers/a-container/upload HTTP/1.0\n' +
'Content-Length: 360\n' +
'Content-Type: multipart/form-data; boundary=_WcirkpwX8mmTqU4Mp8zSsTss6Yvfe\n' +
'\n' +
'--_WcirkpwX8mmTqU4Mp8zSsTss6Yvfe\n' +
'Content-Disposition: form-data; name="container"\n' +
'Content-Type: text/plain; charset=UTF-8\n' +
'\n' +
'a-container\n' +
'--_WcirkpwX8mmTqU4Mp8zSsTss6Yvfe\n' +
'Content-Disposition: form-data; name="file"; filename="a-file.txt"\n' +
'Content-Type: application/octet-stream\n' +
'Content-Transfer-Encoding: binary\n' +
'\n' +
'\1\2\3\n');
setTimeout(function() {
send('--_WcirkpwX8mmTqU4Mp8zSsTss6Yvfe--\n');
}, 50);
function send(data) {
socket.write(data.replace(/\n/g, '\r\n'));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment