index.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. 'use strict';
  2. import utils from '../utils.js';
  3. import AxiosError from '../core/AxiosError.js';
  4. import transitionalDefaults from './transitional.js';
  5. import toFormData from '../helpers/toFormData.js';
  6. import toURLEncodedForm from '../helpers/toURLEncodedForm.js';
  7. import platform from '../platform/index.js';
  8. import formDataToJSON from '../helpers/formDataToJSON.js';
  9. /**
  10. * It takes a string, tries to parse it, and if it fails, it returns the stringified version
  11. * of the input
  12. *
  13. * @param {any} rawValue - The value to be stringified.
  14. * @param {Function} parser - A function that parses a string into a JavaScript object.
  15. * @param {Function} encoder - A function that takes a value and returns a string.
  16. *
  17. * @returns {string} A stringified version of the rawValue.
  18. */
  19. function stringifySafely(rawValue, parser, encoder) {
  20. if (utils.isString(rawValue)) {
  21. try {
  22. (parser || JSON.parse)(rawValue);
  23. return utils.trim(rawValue);
  24. } catch (e) {
  25. if (e.name !== 'SyntaxError') {
  26. throw e;
  27. }
  28. }
  29. }
  30. return (encoder || JSON.stringify)(rawValue);
  31. }
  32. const defaults = {
  33. transitional: transitionalDefaults,
  34. adapter: ['xhr', 'http', 'fetch'],
  35. transformRequest: [
  36. function transformRequest(data, headers) {
  37. const contentType = headers.getContentType() || '';
  38. const hasJSONContentType = contentType.indexOf('application/json') > -1;
  39. const isObjectPayload = utils.isObject(data);
  40. if (isObjectPayload && utils.isHTMLForm(data)) {
  41. data = new FormData(data);
  42. }
  43. const isFormData = utils.isFormData(data);
  44. if (isFormData) {
  45. return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;
  46. }
  47. if (
  48. utils.isArrayBuffer(data) ||
  49. utils.isBuffer(data) ||
  50. utils.isStream(data) ||
  51. utils.isFile(data) ||
  52. utils.isBlob(data) ||
  53. utils.isReadableStream(data)
  54. ) {
  55. return data;
  56. }
  57. if (utils.isArrayBufferView(data)) {
  58. return data.buffer;
  59. }
  60. if (utils.isURLSearchParams(data)) {
  61. headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);
  62. return data.toString();
  63. }
  64. let isFileList;
  65. if (isObjectPayload) {
  66. if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {
  67. return toURLEncodedForm(data, this.formSerializer).toString();
  68. }
  69. if (
  70. (isFileList = utils.isFileList(data)) ||
  71. contentType.indexOf('multipart/form-data') > -1
  72. ) {
  73. const _FormData = this.env && this.env.FormData;
  74. return toFormData(
  75. isFileList ? { 'files[]': data } : data,
  76. _FormData && new _FormData(),
  77. this.formSerializer
  78. );
  79. }
  80. }
  81. if (isObjectPayload || hasJSONContentType) {
  82. headers.setContentType('application/json', false);
  83. return stringifySafely(data);
  84. }
  85. return data;
  86. },
  87. ],
  88. transformResponse: [
  89. function transformResponse(data) {
  90. const transitional = this.transitional || defaults.transitional;
  91. const forcedJSONParsing = transitional && transitional.forcedJSONParsing;
  92. const JSONRequested = this.responseType === 'json';
  93. if (utils.isResponse(data) || utils.isReadableStream(data)) {
  94. return data;
  95. }
  96. if (
  97. data &&
  98. utils.isString(data) &&
  99. ((forcedJSONParsing && !this.responseType) || JSONRequested)
  100. ) {
  101. const silentJSONParsing = transitional && transitional.silentJSONParsing;
  102. const strictJSONParsing = !silentJSONParsing && JSONRequested;
  103. try {
  104. return JSON.parse(data, this.parseReviver);
  105. } catch (e) {
  106. if (strictJSONParsing) {
  107. if (e.name === 'SyntaxError') {
  108. throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
  109. }
  110. throw e;
  111. }
  112. }
  113. }
  114. return data;
  115. },
  116. ],
  117. /**
  118. * A timeout in milliseconds to abort a request. If set to 0 (default) a
  119. * timeout is not created.
  120. */
  121. timeout: 0,
  122. xsrfCookieName: 'XSRF-TOKEN',
  123. xsrfHeaderName: 'X-XSRF-TOKEN',
  124. maxContentLength: -1,
  125. maxBodyLength: -1,
  126. env: {
  127. FormData: platform.classes.FormData,
  128. Blob: platform.classes.Blob,
  129. },
  130. validateStatus: function validateStatus(status) {
  131. return status >= 200 && status < 300;
  132. },
  133. headers: {
  134. common: {
  135. Accept: 'application/json, text/plain, */*',
  136. 'Content-Type': undefined,
  137. },
  138. },
  139. };
  140. utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {
  141. defaults.headers[method] = {};
  142. });
  143. export default defaults;