text: 
  /*!
   * Connect - utils
   * Copyright(c) 2010 Sencha Inc.
   * Copyright(c) 2011 TJ Holowaychuk
   * MIT Licensed
   */
  
  /**
   * Module dependencies.
   */
  
  var http = require('http');
  var parse = require('url').parse;
  
  /**
   * Merge object b with object a.
   *
   *     var a = { foo: 'bar' }
   *       , b = { bar: 'baz' };
   *
   *     utils.merge(a, b);
   *     // => { foo: 'bar', bar: 'baz' }
   *
   * @param {Object} a
   * @param {Object} b
   * @return {Object}
   * @api private
   */
  
  exports.merge = function(a, b){
    if (a && b) {
      for (var key in b) {
        a[key] = b[key];
      }
    }
    return a;
  };
  
  /**
   * Escape the given string of `html`.
   *
   * @param {String} html
   * @return {String}
   * @api private
   */
  
  exports.escape = function(html){
    return String(html)
      .replace(/&(?!\w+;)/g, '&amp;')
      .replace(/</g, '&lt;')
      .replace(/>/g, '&gt;')
      .replace(/"/g, '&quot;');
  };
  
  /**
   * Parse the `req` url with memoization.
   *
   * @param {ServerRequest} req
   * @return {Object}
   * @api private
   */
  
  exports.parseUrl = function(req){
    var parsed = req._parsedUrl;
    if (parsed && parsed.href == req.url) {
      return parsed;
    } else {
      parsed = parse(req.url);
  
      if (parsed.auth && !parsed.protocol && ~parsed.href.indexOf('//')) {
        // This parses pathnames, and a strange pathname like //r@e should work
        parsed = parse(req.url.replace(/@/g, '%40'));
      }
  
      return req._parsedUrl = parsed;
    }
  };
  