diff --git a/.gitignore b/.gitignore
index e607e67..40db2c9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,4 @@ results
npm-debug.log
.idea
node_modules
+providers-private.json
diff --git a/CHANGES.md b/CHANGES.md
index 886554c..7da5a8b 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,13 @@
+2015-01-16, Version 1.1.0
+=========================
+
+ * Upgrade deps (Raymond Feng)
+
+ * Fix bad CLA URL in CONTRIBUTING.md (Ryan Graham)
+
+ * #4: Return a 404 if file doesn't exist (Timo Saikkonen)
+
+
2014-11-27, Version 1.0.6
=========================
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 0c150b7..a8231d3 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -14,7 +14,7 @@ Contributing to `loopback-component-storage` is easy. In a few simple steps:
* Adhere to code style outlined in the [Google C++ Style Guide][] and
[Google Javascript Style Guide][].
- * Sign the [Contributor License Agreement](https://cla.strongloop.com/strongloop/loopback-component-storage)
+ * Sign the [Contributor License Agreement](https://cla.strongloop.com/agreements/strongloop/loopback-component-storage)
* Submit a pull request through Github.
diff --git a/example/.gitignore b/example/.gitignore
deleted file mode 100644
index 5e82b51..0000000
--- a/example/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-providers-private.json
diff --git a/example/app.js b/example/app.js
index 71906f6..0121b43 100644
--- a/example/app.js
+++ b/example/app.js
@@ -3,17 +3,12 @@ var loopback = require('loopback')
var path = require('path');
-app.use(app.router);
-
// expose a rest api
app.use('/api', loopback.rest());
app.use(loopback.static(path.join(__dirname, 'public')));
-
-app.configure(function () {
- app.set('port', process.env.PORT || 3000);
-});
+app.set('port', process.env.PORT || 3000);
var ds = loopback.createDataSource({
connector: require('../index'),
@@ -25,21 +20,5 @@ var container = ds.createModel('container');
app.model(container);
-/*
-app.get('/', function (req, res, next) {
- res.setHeader('Content-Type', 'text/html');
- var form = "
Storage Service Demo
" +
- "List all containers" +
- "Upload to container c1:
" +
- "
" +
- "";
- res.send(form);
- res.end();
-});
-*/
-
app.listen(app.get('port'));
console.log('http://127.0.0.1:' + app.get('port'));
diff --git a/example/upload-amazon.js b/example/upload-amazon.js
index 96bd035..1f180a8 100644
--- a/example/upload-amazon.js
+++ b/example/upload-amazon.js
@@ -1,17 +1,16 @@
var StorageService = require('../').StorageService;
-var providers = require('./providers.json');
+var providers = null;
+try {
+ providers = require('./providers-private.json');
+} catch(err) {
+ providers = require('./providers.json');
+}
var express = require('express');
var app = express();
-app.configure(function () {
- app.set('port', process.env.PORT || 3001);
- app.set('views', __dirname + '/views');
- app.set('view engine', 'ejs');
- app.use(express.favicon());
- // app.use(express.logger('dev'));
- app.use(express.methodOverride());
- app.use(app.router);
-});
+app.set('port', process.env.PORT || 3000);
+app.set('views', __dirname + '/views');
+app.set('view engine', 'ejs');
var handler = new StorageService(
{
@@ -20,7 +19,7 @@ var handler = new StorageService(
keyId: providers.amazon.keyId
});
-app.get('/', function (req, res, next) {
+app.get('/', function(req, res, next) {
res.setHeader('Content-Type', 'text/html');
var form = "Storage Service Demo
" +
"List all containers" +
@@ -34,43 +33,43 @@ app.get('/', function (req, res, next) {
res.end();
});
-app.post('/upload/:container', function (req, res, next) {
- handler.upload(req, res, function (err, result) {
+app.post('/upload/:container', function(req, res, next) {
+ handler.upload(req, res, function(err, result) {
if (!err) {
res.setHeader('Content-Type', 'application/json');
- res.send(200, result);
+ res.status(200).send(result);
} else {
- res.send(500, err);
+ res.status(500).send(err);
}
});
});
-app.get('/download', function (req, res, next) {
- handler.getContainers(function (err, containers) {
+app.get('/download', function(req, res, next) {
+ handler.getContainers(function(err, containers) {
var html = "
Containers
";
- containers.forEach(function (f) {
+ containers.forEach(function(f) {
html += "- " + f.name + "
"
});
html += "
Home
";
- res.send(200, html);
+ res.status(200).send(html);
});
});
-app.get('/download/:container', function (req, res, next) {
- handler.getFiles(req.params.container, function (err, files) {
+app.get('/download/:container', function(req, res, next) {
+ handler.getFiles(req.params.container, function(err, files) {
var html = "Files in container " + req.params.container + "
Home
";
- res.send(200, html);
+ res.status(200).send(html);
});
});
-app.get('/download/:container/:file', function (req, res, next) {
- handler.download(req.params.container, req.params.file, res, function (err, result) {
+app.get('/download/:container/:file', function(req, res, next) {
+ handler.download(req.params.container, req.params.file, res, function(err, result) {
if (err) {
- res.send(500, err);
+ res.status(500).send(err);
}
});
});
diff --git a/example/upload.js b/example/upload.js
index 70183ed..f740237 100644
--- a/example/upload.js
+++ b/example/upload.js
@@ -3,15 +3,9 @@ var StorageService = require('../').StorageService;
var express = require('express');
var app = express();
-app.configure(function () {
- app.set('port', process.env.PORT || 3001);
- app.set('views', __dirname + '/views');
- app.set('view engine', 'ejs');
- app.use(express.favicon());
- // app.use(express.logger('dev'));
- app.use(express.methodOverride());
- app.use(app.router);
-});
+app.set('port', process.env.PORT || 3000);
+app.set('views', __dirname + '/views');
+app.set('view engine', 'ejs');
// Create the container
var mkdirp = require('mkdirp');
@@ -19,7 +13,7 @@ mkdirp.sync('/tmp/storage/con1');
var handler = new StorageService({provider: 'filesystem', root: '/tmp/storage'});
-app.get('/', function (req, res, next) {
+app.get('/', function(req, res, next) {
res.setHeader('Content-Type', 'text/html');
var form = "Storage Service Demo
" +
"List all containers" +
@@ -33,43 +27,43 @@ app.get('/', function (req, res, next) {
res.end();
});
-app.post('/upload/:container', function (req, res, next) {
- handler.upload(req, res, function (err, result) {
+app.post('/upload/:container', function(req, res, next) {
+ handler.upload(req, res, function(err, result) {
if (!err) {
res.setHeader('Content-Type', 'application/json');
- res.send(200, result);
+ res.status(200).send(result);
} else {
- res.send(500, err);
+ res.status(500).send(err);
}
});
});
-app.get('/download', function (req, res, next) {
- handler.getContainers(function (err, containers) {
+app.get('/download', function(req, res, next) {
+ handler.getContainers(function(err, containers) {
var html = "
Containers
";
- containers.forEach(function (f) {
+ containers.forEach(function(f) {
html += "- " + f.name + "
"
});
html += "
Home
";
- res.send(200, html);
+ res.status(200).send(html);
});
});
-app.get('/download/:container', function (req, res, next) {
- handler.getFiles(req.params.container, function (err, files) {
+app.get('/download/:container', function(req, res, next) {
+ handler.getFiles(req.params.container, function(err, files) {
var html = "Files in container " + req.params.container + "
Home
";
- res.send(200, html);
+ res.status(200).send(html);
});
});
-app.get('/download/:container/:file', function (req, res, next) {
- handler.download(req.params.container, req.params.file, res, function (err, result) {
+app.get('/download/:container/:file', function(req, res, next) {
+ handler.download(req.params.container, req.params.file, res, function(err, result) {
if (err) {
- res.send(500, err);
+ res.status(500).send(err);
}
});
});
diff --git a/lib/storage-handler.js b/lib/storage-handler.js
index f56c669..5a75437 100644
--- a/lib/storage-handler.js
+++ b/lib/storage-handler.js
@@ -118,9 +118,16 @@ exports.download = function (provider, req, res, container, file, cb) {
container: container || req && req.params.container,
remote: file || req && req.params.file
});
+
res.type(file);
reader.pipe(res);
reader.on('error', function (err) {
+ if (err.code === 'ENOENT') {
+ res.type('application/json');
+ res.send(404, { error: err });
+ return;
+ }
+
res.type('application/json');
res.send(500, { error: err });
});
diff --git a/lib/storage-service.js b/lib/storage-service.js
index 3f4b755..f71a04a 100644
--- a/lib/storage-service.js
+++ b/lib/storage-service.js
@@ -92,6 +92,10 @@ StorageService.prototype.destroyContainer = function (container, cb) {
*/
StorageService.prototype.getContainer = function (container, cb) {
return this.client.getContainer(container, function (err, container) {
+ if (err && err.code === 'ENOENT') {
+ err.statusCode = err.status = 404;
+ return cb(err);
+ }
return cb(err, map(container));
});
};
diff --git a/package.json b/package.json
index 9e31ec1..5f9d40c 100644
--- a/package.json
+++ b/package.json
@@ -1,22 +1,22 @@
{
"name": "loopback-component-storage",
"description": "Loopback Storage Service",
- "version": "1.0.6",
+ "version": "1.1.0",
"main": "index.js",
"scripts": {
"test": "./node_modules/.bin/mocha --timeout 30000 test/*test.js"
},
"dependencies": {
- "pkgcloud": "~0.9.6",
- "async": "~0.9.0",
- "formidable": "~1.0.14"
+ "pkgcloud": "^1.1.0",
+ "async": "^0.9.0",
+ "formidable": "^1.0.16"
},
"devDependencies": {
- "express": "~3.4.0",
- "loopback": "1.x.x",
- "mocha": "~1.18.2",
- "supertest": "~0.13.0",
- "mkdirp": "~0.5.0"
+ "express": "^4.11.0",
+ "loopback": "^2.10.0",
+ "mocha": "^2.1.0",
+ "supertest": "^0.15.0",
+ "mkdirp": "^0.5.0"
},
"repository": {
"type": "git",
@@ -27,6 +27,6 @@
"url": "https://github.com/strongloop/loopback-strorage-service/blob/master/LICENSE"
},
"optionalDependencies": {
- "sl-blip": "http://blip.strongloop.com/loopback-component-storage@1.0.6"
+ "sl-blip": "http://blip.strongloop.com/loopback-component-storage@1.1.0"
}
}