docs: function CubxHttpServer (options) {
    options = options || {};
  
    if (options.root) {
      this.root = options.root;
    } else {
      try {
        fs.lstatSync('./public');
        this.root = './public';
      } catch (err) {
        this.root = './';
      }
    }
  
    this.headers = options.headers || {};
  
    this.cache = options.cache === undefined ? 3600 : options.cache; // in seconds.
    this.showDir = options.showDir !== 'false';
    this.autoIndex = options.autoIndex !== 'false';
    this.contentType = options.contentType || 'application/octet-stream';
  
    if (options.ext) {
      this.ext = options.ext === true
        ? 'html'
        : options.ext;
    }
  
    var before = options.before ? options.before.slice() : [];
  
    before.push(function (req, res) {
      if (options.logFn) {
        options.logFn(req, res);
      }
      res.emit('next');
    });
  
    if (options.cors) {
      this.headers[ 'Access-Control-Allow-Origin' ] = '*';
      this.headers[ 'Access-Control-Allow-Headers' ] = 'Origin, X-Requested-With, Content-Type, Accept, Range';
      if (options.corsHeaders) {
        options.corsHeaders.split(/\s*,\s*/)
          .forEach(function (h) { this.headers[ 'Access-Control-Allow-Headers' ] += ', ' + h; }, this);
      }
      before.push(corser.create(options.corsHeaders ? { requestHeaders: this.headers[ 'Access-Control-Allow-Headers' ].split(/\s*,\s*/) } : null));
    }
  
    if (options.robots) {
      before.push(function (req, res) {
        if (req.url === '/robots.txt') {
          res.setHeader('Content-Type', 'text/plain');
          var robots = options.robots === true
            ? 'User-agent: *\nDisallow: /'
            : options.robots.replace(/\\n/, '\n');
  
          return res.end(robots);
        }
  
        res.emit('next');
      });
    }
  
    // remove simulated store from url path
    before.push(function (req, res) {
      storeRemover.resolve(req, res);
    });
  
    // resolving local webpackages
    resolver.init(this.root);
    before.push(function (req, res) {
      resolver.resolve(req, res);
    });
  
    before.push(ecstatic({
      root: this.root,
      cache: this.cache,
      showDir: this.showDir,
      autoIndex: this.autoIndex,
      defaultExt: this.ext,
      contentType: this.contentType,
      handleError: typeof options.proxy !== 'string'
    }));
  
    if (typeof options.proxy === 'string') {
      if (!options.npu) {
        var npuHttpProxy = process.env.http_proxy || process.env.HTTP_PROXY || null;
  
        var npuHttpsProxy = process.env.https_proxy || process.env.HTTPS_PROXY || null;
  
        if (options.proxy.indexOf('https:') === 0 && npuHttpsProxy && !this.isInNoProxyConfig(options.proxy)) {
          options.agent = new HttpsProxyAgent(npuHttpsProxy);
          console.log('use networkProxy:', npuHttpsProxy);
        }
  
        if (options.proxy.indexOf('http:') === 0 && npuHttpProxy && !this.isInNoProxyConfig(options.proxy)) {
          options.agent = new HttpProxyAgent(npuHttpProxy);
          console.log('use networkProxy:', npuHttpsProxy);
        }
      }
  
      if (typeof options.npu === 'string') {
        console.log('use networkProxy:', options.npu);
        if (options.proxy.indexOf('https') === 0) {
          options.agent = new HttpsProxyAgent(options.npu);
        } else if (options.proxy.indexOf('http') === 0) {
          options.agent = new HttpProxyAgent(options.npu);
        }
      }
  
      var proxy;
      if (options.agent) {
        proxy = httpProxy.createProxyServer({ agent: options.agent });
      } else {
        proxy = httpProxy.createProxyServer({});
      }
      before.push(function (req, res) {
        proxy.web(req, res, {
          target: options.proxy,
          changeOrigin: true
        });
      });
    }
  
    var serverOptions = {
      before: before,
      headers: this.headers,
      onError: function (err, req, res) {
        if (options.logFn) {
          options.logFn(req, res, err);
        }
  
        res.end();
      }
    };
    if (options.https) {
      serverOptions.https = options.https;
    }
  
    this.server = union.createServer(serverOptions);
  }