Source: http_request.js

'use strict';
const axios = require('axios');
const constants = require('./constants');
const querystring = require('querystring')

/**
 * Class with static methods used in HTTP requests
 * @class
 */
class HTTPRequest {

  /**
   * Performs a GET to an URL and returns a promise to its body as a Buffer
   *
   * @param  {string} url      URL of the desired content to GET
   * @return {Promise<Buffer>} Buffer with the content of the body from the HTTP response
   */
  static async openDataURL(url) {
    if (typeof(url) !== 'string') throw new Error('You must inform a string URL');

    const res = await axios.get(url, {
      responseType: 'arraybuffer'
    });

    return res.data;
  }

  /**
   * Performs a request and returns a promise to the body as a string
   *
   * @param  {Object} options           Object with the parameters to the request
   * @param  {string} options.url       URL of the request
   * @param  {string} [options.method='get']  HTTP verb of the request
   * @param  {Object} [options.payload={}] Body content of the requisition
   * @param  {number} [options.timeout=60000] Timeout of the request in miliseconds
   * @return {Promise<string>}
   */
  static async request(options = {}) {
    const url = options.url;
    const method = options.method || 'get';
    const payload = options.payload || {};
    const timeout = options.timeout || 60000;
    let headers = {
      'User-Agent': constants.userAgent
    };

    let res = await (async function() {
      switch (method) {
        case 'get':
          return await axios.get(`${url}?${querystring.stringify(payload)}`, {
            headers: headers,
            timeout: timeout
          });
          break;
        case 'post':
          return await axios.post(url, querystring.stringify(payload), {
            headers: headers,
            timeout: timeout
          });
          break;
        case 'multipart':
          headers['content-type'] = 'multipart/form-data';
          return await axios.post(url, querystring.stringify(payload), {
            headers: headers,
            timeout: timeout
          });
          break;
        default:
          throw new Error(`Illegal HTTP method (${method})`);
      }
    })();

    return res.data;
  }

}

module.exports = HTTPRequest;