Source: transport.js

  1. /*global process, Sfdc */
  2. 'use strict';
  3. var inherits = require('inherits'),
  4. Promise = require('./promise');
  5. /* */
  6. var request = require('request'),
  7. canvas = require('./browser/canvas'),
  8. jsonp = require('./browser/jsonp');
  9. // set options if defaults setting is available in request, which is not available in xhr module.
  10. if (request.defaults) {
  11. var defaults = {
  12. followAllRedirects: true
  13. };
  14. if (process.env.HTTP_PROXY) {
  15. defaults.proxy = process.env.HTTP_PROXY;
  16. }
  17. if (parseInt(process.env.HTTP_TIMEOUT)) {
  18. defaults.timeout = parseInt(process.env.HTTP_TIMEOUT);
  19. }
  20. request = request.defaults(defaults);
  21. }
  22. var baseUrl;
  23. if (typeof window === 'undefined') {
  24. baseUrl = process.env.LOCATION_BASE_URL || "";
  25. } else {
  26. var apiHost = normalizeApiHost(window.location.host);
  27. baseUrl = apiHost ? "https://" + apiHost : "";
  28. }
  29. /**
  30. * Add stream() method to promise (and following promise chain), to access original request stream.
  31. * @private
  32. */
  33. function streamify(promise, factory) {
  34. var _then = promise.then;
  35. promise.then = function() {
  36. factory();
  37. var newPromise = _then.apply(promise, arguments);
  38. return streamify(newPromise, factory);
  39. };
  40. promise.stream = factory;
  41. return promise;
  42. }
  43. /**
  44. * Normarize Salesforce API host name
  45. * @private
  46. */
  47. function normalizeApiHost(apiHost) {
  48. var m = /(\w+)\.(visual\.force|salesforce)\.com$/.exec(apiHost);
  49. if (m) {
  50. apiHost = m[1] + ".salesforce.com";
  51. }
  52. return apiHost;
  53. }
  54. /**
  55. * Class for HTTP request transport
  56. *
  57. * @class
  58. * @protected
  59. */
  60. var Transport = module.exports = function() {};
  61. /**
  62. * Make HTTP request, returns promise instead of stream
  63. *
  64. * @param {Object} params - HTTP request
  65. * @param {Callback.<Object>} [callback] - Calback Function
  66. * @param {Callback.<Object>} [options] - Options
  67. * @returns {Promise.<Object>}
  68. */
  69. Transport.prototype.httpRequest = function(params, callback, options) {
  70. var deferred = Promise.defer();
  71. var req;
  72. var httpRequest = request;
  73. if (options && options.jsonp && jsonp.supported) {
  74. httpRequest = jsonp.createRequest(options.jsonp);
  75. } else if (options && options.signedRequest && canvas.supported) {
  76. httpRequest = canvas.createRequest(options.signedRequest);
  77. }
  78. var createRequest = function() {
  79. if (!req) {
  80. req = httpRequest(params, function(err, response) {
  81. if (err) {
  82. deferred.reject(err);
  83. } else {
  84. deferred.resolve(response);
  85. }
  86. });
  87. }
  88. return req;
  89. };
  90. return streamify(deferred.promise, createRequest).thenCall(callback);
  91. };
  92. /**
  93. * Class for HTTP request transport using AJAX proxy service
  94. *
  95. * @class Transport~ProxyTransport
  96. * @protected
  97. * @extends Transport
  98. * @param {String} proxyUrl - AJAX Proxy server URL
  99. */
  100. var ProxyTransport = Transport.ProxyTransport = function(proxyUrl) {
  101. this._proxyUrl = proxyUrl;
  102. };
  103. inherits(ProxyTransport, Transport);
  104. /**
  105. * Make HTTP request via AJAX proxy
  106. *
  107. * @method Transport~ProxyTransport#httpRequest
  108. * @param {Object} params - HTTP request
  109. * @param {Callback.<Object>} [callback] - Calback Function
  110. * @returns {Promise.<Object>}
  111. */
  112. ProxyTransport.prototype.httpRequest = function(params, callback) {
  113. var url = params.url;
  114. if (url.indexOf("/") === 0) {
  115. url = baseUrl + url;
  116. }
  117. var proxyParams = {
  118. method: params.method,
  119. url: this._proxyUrl + '?' + Date.now() + "." + ("" + Math.random()).substring(2),
  120. headers: {
  121. 'salesforceproxy-endpoint': url
  122. }
  123. };
  124. if (params.body || params.body === "") {
  125. proxyParams.body = params.body;
  126. }
  127. if (params.headers) {
  128. for (var name in params.headers) {
  129. proxyParams.headers[name] = params.headers[name];
  130. }
  131. }
  132. return ProxyTransport.super_.prototype.httpRequest.call(this, proxyParams, callback);
  133. };