From c29d5e4ab477d6154e1b124eae622b8f701ebc44 Mon Sep 17 00:00:00 2001 From: Blayne Chard Date: Wed, 25 May 2016 12:42:32 +1200 Subject: [PATCH 1/4] Fixing #1900 JS SDK file upload JS SDK file upload uses req.body._ContentType to specify the upload content type --- spec/Middlewares.spec.js | 64 ++++++++++++++++++++++++++++++++++++++++ src/middlewares.js | 4 +++ 2 files changed, 68 insertions(+) create mode 100644 spec/Middlewares.spec.js diff --git a/spec/Middlewares.spec.js b/spec/Middlewares.spec.js new file mode 100644 index 0000000000..91f273ac42 --- /dev/null +++ b/spec/Middlewares.spec.js @@ -0,0 +1,64 @@ +import * as middlewares from "../src/middlewares"; +import {AppCache} from '../src/cache'; + +describe('middlewares', () => { + + var fakeReq, fakeRes; + + beforeEach(() => { + fakeReq = { + originalUrl: 'http://example.com/parse/', + url: 'http://example.com/', + body: { + _ApplicationId: 'FakeAppId' + }, + headers: {}, + get: (key) => { + return fakeReq.headers[key] + } + }; + AppCache.clear(); + AppCache.put(fakeReq.body._ApplicationId, {}); + }); + + it('should use _ContentType if provided', (done) => { + expect(fakeReq.headers['content-type']).toEqual(undefined); + fakeReq.body._ContentType = 'image/jpeg'; + middlewares.handleParseHeaders(fakeReq, fakeRes, () => { + expect(fakeReq.headers['content-type']).toEqual(fakeReq.body._ContentType); + done() + }); + }); + + const BodyParams = { + clientVersion: '_ClientVersion', + installationId: '_InstallationId', + sessionToken: '_SessionToken', + masterKey: '_MasterKey', + javascriptKey: '_JavaScriptKey' + }; + + const BodyKeys = Object.keys(BodyParams); + + BodyKeys.forEach((infoKey) => { + const bodyKey = BodyParams[infoKey]; + const keyValue = 'Fake' + bodyKey; + // javascriptKey is the only one that gets defaulted, + const otherKeys = BodyKeys.filter((otherKey) => otherKey !== infoKey && otherKey !== 'javascriptKey'); + + it(`it should pull ${bodyKey} into req.info`, (done) => { + fakeReq.body[bodyKey] = keyValue; + + middlewares.handleParseHeaders(fakeReq, fakeRes, () => { + expect(fakeReq.body[bodyKey]).toEqual(undefined); + expect(fakeReq.info[infoKey]).toEqual(keyValue); + + otherKeys.forEach((otherKey) => { + expect(fakeReq.info[otherKey]).toEqual(undefined); + }); + + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/src/middlewares.js b/src/middlewares.js index e46eb62557..46b633ec21 100644 --- a/src/middlewares.js +++ b/src/middlewares.js @@ -84,6 +84,10 @@ function handleParseHeaders(req, res, next) { info.masterKey = req.body._MasterKey; delete req.body._MasterKey; } + if (req.body._ContentType) { + req.headers['content-type'] = req.body._ContentType; + delete req.body_contentType; + } } else { return invalidRequest(req, res); } From 8b8fb7959ba0463b4e958e32125060ff4fe72c3b Mon Sep 17 00:00:00 2001 From: Blayne Chard Date: Sat, 28 May 2016 19:43:34 +1200 Subject: [PATCH 2/4] Fixing import statements --- spec/Middlewares.spec.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/Middlewares.spec.js b/spec/Middlewares.spec.js index 91f273ac42..ce4c899c6d 100644 --- a/spec/Middlewares.spec.js +++ b/spec/Middlewares.spec.js @@ -1,5 +1,5 @@ -import * as middlewares from "../src/middlewares"; -import {AppCache} from '../src/cache'; +var middlewares = require('../src/middlewares'); +var AppCache = require('../src/cache').AppCache; describe('middlewares', () => { @@ -14,7 +14,7 @@ describe('middlewares', () => { }, headers: {}, get: (key) => { - return fakeReq.headers[key] + return fakeReq.headers[key.toLowerCase()] } }; AppCache.clear(); From 8f7976aa36b1b150fb54cae87e96672dda5123ca Mon Sep 17 00:00:00 2001 From: Blayne Chard Date: Sat, 28 May 2016 20:02:46 +1200 Subject: [PATCH 3/4] Dont clear the cache just delete the new entry that the test added. --- spec/Middlewares.spec.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/spec/Middlewares.spec.js b/spec/Middlewares.spec.js index ce4c899c6d..746b2bcda4 100644 --- a/spec/Middlewares.spec.js +++ b/spec/Middlewares.spec.js @@ -17,10 +17,13 @@ describe('middlewares', () => { return fakeReq.headers[key.toLowerCase()] } }; - AppCache.clear(); AppCache.put(fakeReq.body._ApplicationId, {}); }); + afterEach(() => { + AppCache.del(fakeReq.body._ApplicationId); + }); + it('should use _ContentType if provided', (done) => { expect(fakeReq.headers['content-type']).toEqual(undefined); fakeReq.body._ContentType = 'image/jpeg'; From d2125afce6afd995488bad8e750229d2b1b4ea6f Mon Sep 17 00:00:00 2001 From: Blayne Chard Date: Sun, 29 May 2016 21:50:40 +1200 Subject: [PATCH 4/4] adding E2E test for _ContentType support --- spec/ParseFile.spec.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/spec/ParseFile.spec.js b/spec/ParseFile.spec.js index 2b3ad7d0f4..20c751947e 100644 --- a/spec/ParseFile.spec.js +++ b/spec/ParseFile.spec.js @@ -36,6 +36,31 @@ describe('Parse.File testing', () => { }); }); + + it('works with _ContentType', done => { + + request.post({ + url: 'http://localhost:8378/1/files/file', + body: JSON.stringify({ + _ApplicationId: 'test', + _JavaScriptKey: 'test', + _ContentType: 'text/html', + base64: 'PGh0bWw+PC9odG1sPgo=' + }) + }, (error, response, body) => { + expect(error).toBe(null); + var b = JSON.parse(body); + expect(b.name).toMatch(/_file.html/); + expect(b.url).toMatch(/^http:\/\/localhost:8378\/1\/files\/test\/.*file.html$/); + request.get(b.url, (error, response, body) => { + expect(response.headers['content-type']).toMatch('^text/html'); + expect(error).toBe(null); + expect(body).toEqual('\n'); + done(); + }); + }); + }); + it('works without Content-Type', done => { var headers = { 'X-Parse-Application-Id': 'test',