123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /* eslint-disable complexity */
  2. var util = require('./util');
  3. var cookies = require('./cookies');
  4. var storageUtil = require('./storageUtil');
  5. var Q = require('q');
  6. var AuthApiError = require('./errors/AuthApiError');
  7. var config = require('./config');
  8. function httpRequest(sdk, options) {
  9. options = options || {};
  10. var url = options.url,
  11. method = options.method,
  12. args = options.args,
  13. saveAuthnState = options.saveAuthnState,
  14. accessToken = options.accessToken,
  15. httpCache = storageUtil.getHttpCache();
  16. if (options.cacheResponse) {
  17. var cacheContents = httpCache.getStorage();
  18. var cachedResponse = cacheContents[url];
  19. if (cachedResponse && Date.now()/1000 < cachedResponse.expiresAt) {
  20. return Q.resolve(cachedResponse.response);
  21. }
  22. }
  23. var headers = {
  24. 'Accept': 'application/json',
  25. 'Content-Type': 'application/json',
  26. 'X-Okta-User-Agent-Extended': sdk.userAgent
  27. };
  28. util.extend(headers, sdk.options.headers, options.headers);
  29. if (accessToken && util.isString(accessToken)) {
  30. headers['Authorization'] = 'Bearer ' + accessToken;
  31. }
  32. var ajaxOptions = {
  33. headers: headers,
  34. data: args || undefined
  35. };
  36. var err, res;
  37. return new Q(sdk.options.ajaxRequest(method, url, ajaxOptions))
  38. .then(function(resp) {
  39. res = resp.responseText;
  40. if (res && util.isString(res)) {
  41. res = JSON.parse(res);
  42. }
  43. if (saveAuthnState) {
  44. if (!res.stateToken) {
  45. cookies.deleteCookie(config.STATE_TOKEN_COOKIE_NAME);
  46. }
  47. }
  48. if (res && res.stateToken && res.expiresAt) {
  49. cookies.setCookie(config.STATE_TOKEN_COOKIE_NAME, res.stateToken, res.expiresAt);
  50. }
  51. if (res && options.cacheResponse) {
  52. httpCache.updateStorage(url, {
  53. expiresAt: Math.floor(Date.now()/1000) + config.DEFAULT_CACHE_DURATION,
  54. response: res
  55. });
  56. }
  57. return res;
  58. })
  59. .fail(function(resp) {
  60. var serverErr = resp.responseText || {};
  61. if (util.isString(serverErr)) {
  62. try {
  63. serverErr = JSON.parse(serverErr);
  64. } catch (e) {
  65. serverErr = {
  66. errorSummary: 'Unknown error'
  67. };
  68. }
  69. }
  70. if (resp.status >= 500) {
  71. serverErr.errorSummary = 'Unknown error';
  72. }
  73. if (sdk.options.transformErrorXHR) {
  74. resp = sdk.options.transformErrorXHR(util.clone(resp));
  75. }
  76. err = new AuthApiError(serverErr, resp);
  77. if (err.errorCode === 'E0000011') {
  78. cookies.deleteCookie(config.STATE_TOKEN_COOKIE_NAME);
  79. }
  80. throw err;
  81. });
  82. }
  83. function get(sdk, url, options) {
  84. url = util.isAbsoluteUrl(url) ? url : sdk.options.url + url;
  85. var getOptions = {
  86. url: url,
  87. method: 'GET'
  88. };
  89. util.extend(getOptions, options);
  90. return httpRequest(sdk, getOptions);
  91. }
  92. function post(sdk, url, args, options) {
  93. url = util.isAbsoluteUrl(url) ? url : sdk.options.url + url;
  94. var postOptions = {
  95. url: url,
  96. method: 'POST',
  97. args: args,
  98. saveAuthnState: true
  99. };
  100. util.extend(postOptions, options);
  101. return httpRequest(sdk, postOptions);
  102. }
  103. module.exports = {
  104. get: get,
  105. post: post,
  106. httpRequest: httpRequest
  107. };