Skip to content

Commit a41bfe3

Browse files
committed
Allow uploading files without content-type.
1 parent bbc3d36 commit a41bfe3

File tree

3 files changed

+64
-40
lines changed

3 files changed

+64
-40
lines changed

spec/ParseFile.spec.js

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,49 @@ for (var i = 0; i < str.length; i++) {
1010
}
1111

1212
describe('Parse.File testing', () => {
13-
it('works with REST API', done => {
14-
var headers = {
15-
'Content-Type': 'application/octet-stream',
16-
'X-Parse-Application-Id': 'test',
17-
'X-Parse-REST-API-Key': 'rest'
18-
};
19-
request.post({
20-
headers: headers,
21-
url: 'http://localhost:8378/1/files/file.txt',
22-
body: 'argle bargle',
23-
}, (error, response, body) => {
24-
expect(error).toBe(null);
25-
var b = JSON.parse(body);
26-
expect(b.name).toMatch(/_file.txt$/);
27-
expect(b.url).toMatch(/^http:\/\/localhost:8378\/1\/files\/test\/.*file.txt$/);
28-
request.get(b.url, (error, response, body) => {
13+
describe('creating files', done => {
14+
it('works with Content-Type', done => {
15+
var headers = {
16+
'Content-Type': 'application/octet-stream',
17+
'X-Parse-Application-Id': 'test',
18+
'X-Parse-REST-API-Key': 'rest'
19+
};
20+
request.post({
21+
headers: headers,
22+
url: 'http://localhost:8378/1/files/file.txt',
23+
body: 'argle bargle',
24+
}, (error, response, body) => {
2925
expect(error).toBe(null);
30-
expect(body).toEqual('argle bargle');
31-
done();
26+
var b = JSON.parse(body);
27+
expect(b.name).toMatch(/_file.txt$/);
28+
expect(b.url).toMatch(/^http:\/\/localhost:8378\/1\/files\/test\/.*file.txt$/);
29+
request.get(b.url, (error, response, body) => {
30+
expect(error).toBe(null);
31+
expect(body).toEqual('argle bargle');
32+
done();
33+
});
34+
});
35+
});
36+
37+
it('works without Content-Type', done => {
38+
var headers = {
39+
'X-Parse-Application-Id': 'test',
40+
'X-Parse-REST-API-Key': 'rest'
41+
};
42+
request.post({
43+
headers: headers,
44+
url: 'http://localhost:8378/1/files/file.txt',
45+
body: 'argle bargle',
46+
}, (error, response, body) => {
47+
expect(error).toBe(null);
48+
var b = JSON.parse(body);
49+
expect(b.name).toMatch(/_file.txt$/);
50+
expect(b.url).toMatch(/^http:\/\/localhost:8378\/1\/files\/test\/.*file.txt$/);
51+
request.get(b.url, (error, response, body) => {
52+
expect(error).toBe(null);
53+
expect(body).toEqual('argle bargle');
54+
done();
55+
});
3256
});
3357
});
3458
});

src/Controllers/FilesController.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export class FilesController extends AdaptableController {
1919
name: filename
2020
});
2121
});
22-
}
22+
}
2323

2424
deleteFile(config, filename) {
2525
return this.adapter.deleteFile(config, filename);
@@ -30,7 +30,7 @@ export class FilesController extends AdaptableController {
3030
* with the current mount point and app id.
3131
* Object may be a single object or list of REST-format objects.
3232
*/
33-
expandFilesInObject(config, object) {
33+
expandFilesInObject(config, object) {
3434
if (object instanceof Array) {
3535
object.map((obj) => this.expandFilesInObject(config, obj));
3636
return;
@@ -53,7 +53,7 @@ export class FilesController extends AdaptableController {
5353
}
5454
}
5555
}
56-
56+
5757
expectedAdapterType() {
5858
return FilesAdapter;
5959
}

src/Routers/FilesRouter.js

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import mime from 'mime';
77
import Config from '../Config';
88

99
export class FilesRouter {
10-
10+
1111
getExpressRouter() {
1212
var router = express.Router();
1313
router.get('/files/:appId/:filename', this.getHandler);
@@ -19,7 +19,7 @@ export class FilesRouter {
1919

2020
router.post('/files/:filename',
2121
Middlewares.allowCrossDomain,
22-
BodyParser.raw({type: '*/*', limit: '20mb'}),
22+
BodyParser.raw({type: () => { return true; }, limit: '20mb'}), // Allow uploads without Content-Type, or with any Content-Type.
2323
Middlewares.handleParseHeaders,
2424
this.createHandler
2525
);
@@ -32,23 +32,23 @@ export class FilesRouter {
3232
);
3333
return router;
3434
}
35-
36-
getHandler(req, res, next) {
35+
36+
getHandler(req, res) {
3737
const config = new Config(req.params.appId);
3838
const filesController = config.filesController;
3939
const filename = req.params.filename;
4040
filesController.getFileData(config, filename).then((data) => {
41-
res.status(200);
42-
var contentType = mime.lookup(filename);
43-
res.set('Content-type', contentType);
44-
res.end(data);
45-
}).catch((error) => {
46-
res.status(404);
47-
res.set('Content-type', 'text/plain');
48-
res.end('File not found.');
49-
});
41+
res.status(200);
42+
var contentType = mime.lookup(filename);
43+
res.set('Content-Type', contentType);
44+
res.end(data);
45+
}).catch(() => {
46+
res.status(404);
47+
res.set('Content-Type', 'text/plain');
48+
res.end('File not found.');
49+
});
5050
}
51-
51+
5252
createHandler(req, res, next) {
5353
if (!req.body || !req.body.length) {
5454
next(new Parse.Error(Parse.Error.FILE_SAVE_ERROR,
@@ -68,7 +68,7 @@ export class FilesRouter {
6868
return;
6969
}
7070
let extension = '';
71-
71+
7272
// Not very safe there.
7373
const hasExtension = req.params.filename.indexOf('.') > 0;
7474
const contentType = req.get('Content-type');
@@ -81,15 +81,15 @@ export class FilesRouter {
8181
const filesController = config.filesController;
8282

8383
filesController.createFile(config, filename, req.body).then((result) => {
84-
res.status(201);
84+
res.status(201);
8585
res.set('Location', result.url);
8686
res.json(result);
8787
}).catch((err) => {
88-
next(new Parse.Error(Parse.Error.FILE_SAVE_ERROR,
89-
'Could not store file.'));
88+
next(new Parse.Error(Parse.Error.FILE_SAVE_ERROR,
89+
'Could not store file.'));
9090
});
9191
}
92-
92+
9393
deleteHandler(req, res, next) {
9494
const filesController = req.config.filesController;
9595
filesController.deleteFile(req.config, req.params.filename).then(() => {

0 commit comments

Comments
 (0)