repo_description: Promise based HTTP client for the browser and node.js
repo_topics: hacktoberfest http-client javascript nodejs promise
code: 'use strict';
  
  import transformData from './transformData.js';
  import isCancel from '../cancel/isCancel.js';
  import defaults from '../defaults/index.js';
  import CanceledError from '../cancel/CanceledError.js';
  import AxiosHeaders from '../core/AxiosHeaders.js';
  import adapters from '../adapters/adapters.js';
  
  /**
   * Throws a `CanceledError` if cancellation has been requested.
   *
   * @param {Object} config The config that is to be used for the request
   *
   * @returns {void}
   */
  function throwIfCancellationRequested(config) {
    if (config.cancelToken) {
      config.cancelToken.throwIfRequested();
    }
  
    if (config.signal && config.signal.aborted) {
      throw new CanceledError(null, config);
    }
  }
  
  /**
   * Dispatch a request to the server using the configured adapter.
   *
   * @param {object} config The config that is to be used for the request
   *
   * @returns {Promise} The Promise to be fulfilled
   */
  export default function dispatchRequest(config) {
    throwIfCancellationRequested(config);
  
    config.headers = AxiosHeaders.from(config.headers);
  
    // Transform request data
    config.data = transformData.call(config, config.transformRequest);
  
    if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {
      config.headers.setContentType('application/x-www-form-urlencoded', false);
    }
  
    const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);
  
    return adapter(config).then(
      function onAdapterResolution(response) {
        throwIfCancellationRequested(config);
  
        // Transform response data
        response.data = transformData.call(config, config.transformResponse, response);
  
        response.headers = AxiosHeaders.from(response.headers);
  
        return response;
      },
      function onAdapterRejection(reason) {
        if (!isCancel(reason)) {
          throwIfCancellationRequested(config);
  
          // Transform response data
          if (reason && reason.response) {
            reason.response.data = transformData.call(
              config,
              config.transformResponse,
              reason.response
            );
            reason.response.headers = AxiosHeaders.from(reason.response.headers);
          }
        }
  
        return Promise.reject(reason);
      }
    );
  }
  