diff --git a/spec/ParseFile.spec.js b/spec/ParseFile.spec.js index 8613f3a255..39292ae01b 100644 --- a/spec/ParseFile.spec.js +++ b/spec/ParseFile.spec.js @@ -10,25 +10,49 @@ for (var i = 0; i < str.length; i++) { } describe('Parse.File testing', () => { - it('works with REST API', done => { - var headers = { - 'Content-Type': 'application/octet-stream', - 'X-Parse-Application-Id': 'test', - 'X-Parse-REST-API-Key': 'rest' - }; - request.post({ - headers: headers, - url: 'http://localhost:8378/1/files/file.txt', - body: 'argle bargle', - }, (error, response, body) => { - expect(error).toBe(null); - var b = JSON.parse(body); - expect(b.name).toMatch(/_file.txt$/); - expect(b.url).toMatch(/^http:\/\/localhost:8378\/1\/files\/test\/.*file.txt$/); - request.get(b.url, (error, response, body) => { + describe('creating files', () => { + it('works with Content-Type', done => { + var headers = { + 'Content-Type': 'application/octet-stream', + 'X-Parse-Application-Id': 'test', + 'X-Parse-REST-API-Key': 'rest' + }; + request.post({ + headers: headers, + url: 'http://localhost:8378/1/files/file.txt', + body: 'argle bargle', + }, (error, response, body) => { expect(error).toBe(null); - expect(body).toEqual('argle bargle'); - done(); + var b = JSON.parse(body); + expect(b.name).toMatch(/_file.txt$/); + expect(b.url).toMatch(/^http:\/\/localhost:8378\/1\/files\/test\/.*file.txt$/); + request.get(b.url, (error, response, body) => { + expect(error).toBe(null); + expect(body).toEqual('argle bargle'); + done(); + }); + }); + }); + + it('works without Content-Type', done => { + var headers = { + 'X-Parse-Application-Id': 'test', + 'X-Parse-REST-API-Key': 'rest' + }; + request.post({ + headers: headers, + url: 'http://localhost:8378/1/files/file.txt', + body: 'argle bargle', + }, (error, response, body) => { + expect(error).toBe(null); + var b = JSON.parse(body); + expect(b.name).toMatch(/_file.txt$/); + expect(b.url).toMatch(/^http:\/\/localhost:8378\/1\/files\/test\/.*file.txt$/); + request.get(b.url, (error, response, body) => { + expect(error).toBe(null); + expect(body).toEqual('argle bargle'); + done(); + }); }); }); }); diff --git a/src/Controllers/FilesController.js b/src/Controllers/FilesController.js index fd5cec8da7..9634d807a4 100644 --- a/src/Controllers/FilesController.js +++ b/src/Controllers/FilesController.js @@ -19,7 +19,7 @@ export class FilesController extends AdaptableController { name: filename }); }); - } + } deleteFile(config, filename) { return this.adapter.deleteFile(config, filename); @@ -30,7 +30,7 @@ export class FilesController extends AdaptableController { * with the current mount point and app id. * Object may be a single object or list of REST-format objects. */ - expandFilesInObject(config, object) { + expandFilesInObject(config, object) { if (object instanceof Array) { object.map((obj) => this.expandFilesInObject(config, obj)); return; @@ -53,7 +53,7 @@ export class FilesController extends AdaptableController { } } } - + expectedAdapterType() { return FilesAdapter; } diff --git a/src/Routers/FilesRouter.js b/src/Routers/FilesRouter.js index 68bdd1e42f..305c503934 100644 --- a/src/Routers/FilesRouter.js +++ b/src/Routers/FilesRouter.js @@ -7,7 +7,7 @@ import mime from 'mime'; import Config from '../Config'; export class FilesRouter { - + getExpressRouter() { var router = express.Router(); router.get('/files/:appId/:filename', this.getHandler); @@ -19,7 +19,7 @@ export class FilesRouter { router.post('/files/:filename', Middlewares.allowCrossDomain, - BodyParser.raw({type: '*/*', limit: '20mb'}), + BodyParser.raw({type: () => { return true; }, limit: '20mb'}), // Allow uploads without Content-Type, or with any Content-Type. Middlewares.handleParseHeaders, this.createHandler ); @@ -32,23 +32,23 @@ export class FilesRouter { ); return router; } - - getHandler(req, res, next) { + + getHandler(req, res) { const config = new Config(req.params.appId); const filesController = config.filesController; const filename = req.params.filename; filesController.getFileData(config, filename).then((data) => { - res.status(200); - var contentType = mime.lookup(filename); - res.set('Content-type', contentType); - res.end(data); - }).catch((error) => { - res.status(404); - res.set('Content-type', 'text/plain'); - res.end('File not found.'); - }); + res.status(200); + var contentType = mime.lookup(filename); + res.set('Content-Type', contentType); + res.end(data); + }).catch(() => { + res.status(404); + res.set('Content-Type', 'text/plain'); + res.end('File not found.'); + }); } - + createHandler(req, res, next) { if (!req.body || !req.body.length) { next(new Parse.Error(Parse.Error.FILE_SAVE_ERROR, @@ -68,7 +68,7 @@ export class FilesRouter { return; } let extension = ''; - + // Not very safe there. const hasExtension = req.params.filename.indexOf('.') > 0; const contentType = req.get('Content-type'); @@ -81,15 +81,15 @@ export class FilesRouter { const filesController = config.filesController; filesController.createFile(config, filename, req.body).then((result) => { - res.status(201); + res.status(201); res.set('Location', result.url); res.json(result); }).catch((err) => { - next(new Parse.Error(Parse.Error.FILE_SAVE_ERROR, - 'Could not store file.')); + next(new Parse.Error(Parse.Error.FILE_SAVE_ERROR, + 'Could not store file.')); }); } - + deleteHandler(req, res, next) { const filesController = req.config.filesController; filesController.deleteFile(req.config, req.params.filename).then(() => {