docs: function Request(options, callback) {
      // execute request immediately after construction if called without `new`
      if ( ! (this instanceof Request)) {
          return (new Request(options, callback))._execute();
      }
  
      this.options = this._processOptions(options);
  
      // build request body
      if (typeof this.options.body !== 'undefined') {
          this.options.body = this._compileBody();
  
          if ( ! this.options.headers['content-length']) {
              this.options.headers['content-length'] = this.options.body.length;
          }
      }
  
      var acceptEncoding;
  
      // add "gzip" to the "accept-encoding" header
      if (this.options.allowGzip) {
          acceptEncoding = this.options.headers['accept-encoding'] || '*';
  
          if (acceptEncoding.indexOf('gzip') === -1) {
              this.options.headers['accept-encoding'] = 'gzip, ' + acceptEncoding;
          }
      }
  
      var agent = this.options.agent;
  
      if (typeof agent === 'object' && typeof agent.addRequest !== 'function') {
          this.options.agent = this._createAgent(agent);
      }
  
      if (typeof this.options.isNetworkError === 'function') {
          this._isNetworkError = this.options.isNetworkError;
      } else {
          this._isNetworkError = null;
      }
  
      if (typeof this.options.isRetryAllowed === 'function') {
          this._isRetryAllowed = this.options.isRetryAllowed;
      } else {
          this._isRetryAllowed = null;
      }
  
      // number of retries spent
      this.retries = null;
  
      this._retrier = retry.operation({
          retries: this.options.maxRetries,
          minTimeout: this.options.minRetriesTimeout,
          maxTimeout: this.options.maxRetriesTimeout
      });
      this._isRunning = null;
  
      // context used to store contimer's meta data
      this._timerCtx = Object.create(null);
      this._executionTime = null;
      this._networkTime = null;
  
      // setup callbacks
      this._callback = callback;
  }