diff --git a/spec/HTTPRequest.spec.js b/spec/HTTPRequest.spec.js index ac1829a3b1..7840b6fec1 100644 --- a/spec/HTTPRequest.spec.js +++ b/spec/HTTPRequest.spec.js @@ -156,13 +156,12 @@ describe("httpRequest", () => { done(); }) }); + it("should encode a JSON body by default", (done) => { - let options = { body: {"foo": "bar"}, } - - var result = httpRequest.encodeBody(options); + let result = httpRequest.encodeBody(options); expect(result.body).toEqual('{"foo":"bar"}'); expect(result.headers['Content-Type']).toEqual('application/json'); done(); @@ -170,13 +169,11 @@ describe("httpRequest", () => { }) it("should encode a JSON body", (done) => { - let options = { body: {"foo": "bar"}, headers: {'Content-Type': 'application/json'} } - - var result = httpRequest.encodeBody(options); + let result = httpRequest.encodeBody(options); expect(result.body).toEqual('{"foo":"bar"}'); done(); @@ -186,7 +183,7 @@ describe("httpRequest", () => { body: {"foo": "bar", "bar": "baz"}, headers: {'cOntent-tYpe': 'application/x-www-form-urlencoded'} } - var result = httpRequest.encodeBody(options); + let result = httpRequest.encodeBody(options); expect(result.body).toEqual("foo=bar&bar=baz"); done(); }); @@ -195,7 +192,7 @@ describe("httpRequest", () => { body:{"foo": "bar", "bar": "baz"}, headers: {'cOntent-tYpe': 'mime/jpeg'} } - var result = httpRequest.encodeBody(options); + let result = httpRequest.encodeBody(options); expect(result.body).toEqual({"foo": "bar", "bar": "baz"}); done(); }); diff --git a/src/cloud-code/HTTPResponse.js b/src/cloud-code/HTTPResponse.js index c8630da7f8..f234f332db 100644 --- a/src/cloud-code/HTTPResponse.js +++ b/src/cloud-code/HTTPResponse.js @@ -13,9 +13,9 @@ export default class HTTPResponse { get data() { if (!this._data) { try { - this._data = JSON.parse(this.text); + this._data = JSON.parse(this.text); } catch (e) {} } return this._data; } -} \ No newline at end of file +} diff --git a/src/cloud-code/httpRequest.js b/src/cloud-code/httpRequest.js index 2c956ff33a..b2e3448200 100644 --- a/src/cloud-code/httpRequest.js +++ b/src/cloud-code/httpRequest.js @@ -1,12 +1,10 @@ -var request = require("request"), - Parse = require('parse/node').Parse, - HTTPResponse = require('./HTTPResponse').HTTPResponse; +import request from 'request'; +import Parse from 'parse/node'; +import HTTPResponse from './HTTPResponse'; -var encodeBody = function(options = {}) { - let body = options.body; - let headers = options.headers || {}; +var encodeBody = function({body, headers = {}}) { if (typeof body !== 'object') { - return options; + return {body, headers}; } var contentTypeKeys = Object.keys(headers).filter((key) => { return key.match(/content-type/i) != null; @@ -15,23 +13,27 @@ var encodeBody = function(options = {}) { if (contentTypeKeys.length == 0) { // no content type try { - options.body = JSON.stringify(body); - options.headers = options.headers || {}; - options.headers['Content-Type'] = 'application/json'; + body = JSON.stringify(body); + headers['Content-Type'] = 'application/json'; } catch(e) { // do nothing; } - } else if (contentTypeKeys.length == 1) { + } else { + /* istanbul ignore next */ + if (contentTypeKeys.length > 1) { + console.error('multiple content-type headers are set.'); + } + // There maybe many, we'll just take the 1st one var contentType = contentTypeKeys[0]; if (headers[contentType].match(/application\/json/i)) { - options.body = JSON.stringify(body); + body = JSON.stringify(body); } else if(headers[contentType].match(/application\/x-www-form-urlencoded/i)) { - options.body = Object.keys(body).map(function(key){ + body = Object.keys(body).map(function(key){ return `${key}=${encodeURIComponent(body[key])}` }).join("&"); } } - return options; + return {body, headers}; } module.exports = function(options) { @@ -43,7 +45,7 @@ module.exports = function(options) { delete options.success; delete options.error; delete options.uri; // not supported - options = encodeBody(options); + options = Object.assign(options, encodeBody(options)); // set follow redirects to false by default options.followRedirect = options.followRedirects == true; // force the response as a buffer