code: function parserOnHeadersComplete(info) {
    var parser = this;
    var headers = info.headers;
    var url = info.url;
  
    if (!headers) {
      headers = parser._headers;
      parser._headers = [];
    }
  
    if (!url) {
      url = parser._url;
      parser._url = '';
    }
  
    parser.incoming = new IncomingMessage(parser.socket);
    parser.incoming.httpVersionMajor = info.versionMajor;
    parser.incoming.httpVersionMinor = info.versionMinor;
    parser.incoming.httpVersion = info.versionMajor + '.' + info.versionMinor;
    parser.incoming.url = url;
  
    var n = headers.length;
  
    // If parser.maxHeaderPairs <= 0 - assume that there're no limit
    if (parser.maxHeaderPairs > 0) {
      n = Math.min(n, parser.maxHeaderPairs);
    }
  
    for (var i = 0; i < n; i += 2) {
      var k = headers[i];
      var v = headers[i + 1];
      parser.incoming._addHeaderLine(k, v);
    }
  
  
    if (info.method) {
      // server only
      parser.incoming.method = info.method;
    } else {
      // client only
      parser.incoming.statusCode = info.statusCode;
      // CHECKME dead code? we're always a request parser
    }
  
    parser.incoming.upgrade = info.upgrade;
  
    var skipBody = false; // response to HEAD or CONNECT
  
    if (!info.upgrade) {
      // For upgraded connections and CONNECT method request,
      // we'll emit this after parser.execute
      // so that we can capture the first part of the new protocol
      skipBody = parser.onIncoming(parser.incoming, info.shouldKeepAlive);
    }
  
    return skipBody;
  }
docs: info.headers and info.url are set only if .onHeaders() has not been called for this request.  info.url is not set for response parsers but that's not applicable here since all our parsers are request parsers.