docs: function(options) {
              console.log(NAME, 'request');
              var instance = this,
                  props = {},
                  xhr, promise;
              options = Object.isObject(options) ? options.deepClone() : {};
              promise = Promise.manage(options.streamback, options.stayActive);
  
              xhr = new window.XMLHttpRequest();
              props._isXHR2 = IO.xhr2support;
              // it could be other modules like io-cors or io-stream have subscribed
              // xhr might be changed, also private properties might be extended
              instance._xhrList.each(
                  function(fn) {
                      xhr = fn(xhr, props, options, promise);
                  }
              );
              if (!xhr) {
                  return Promise.reject(NO_XHR);
              }
              xhr.merge(props);
              console.log(NAME, 'request creating xhr of type: '+ (props._isXHR2 ? 'XMLHttpRequest2' : (props._isXDR ? 'XDomainRequest' : 'XMLHttpRequest1')));
              console.log(NAME, 'CORS-IE: '+ props._CORS_IE + ', canStream: '+props._canStream);
  
              // Don't use xhr.timeout --> IE<10 throws an error when set xhr.timeout
              // We use a timer that aborts the request
              Object.defineProperty(xhr, '_timer', {
                  configurable: false,
                  enumerable: false,
                  writable: false,
                  value: setTimeout(function() {
                             promise.reject(new Error(REQUEST_TIMEOUT));
                             xhr._aborted = true; // must be set: IE9 won't allow to read anything on xhr after being aborted
                             xhr.abort();
                         }, options.timeout || instance.config.timeout || DEF_REQ_TIMEOUT)
              });
  
              instance._initXHR(xhr, options, promise);
  
              // add to interbal hash:
              instance._runningRequests.push(promise);
              // remove it when ready:
              promise.finally(function() {
                  instance._runningRequests.remove(promise);
              });
  
              return promise;
          }