/* automatically generated by JSCoverage - do not edit */
if (typeof _$jscoverage === 'undefined') _$jscoverage = {};
if (! _$jscoverage['express 3.0.6/request.js']) {
  _$jscoverage['express 3.0.6/request.js'] = [];
  _$jscoverage['express 3.0.6/request.js'][6] = 0;
  _$jscoverage['express 3.0.6/request.js'][18] = 0;
  _$jscoverage['express 3.0.6/request.js'][46] = 0;
  _$jscoverage['express 3.0.6/request.js'][48] = 0;
  _$jscoverage['express 3.0.6/request.js'][51] = 0;
  _$jscoverage['express 3.0.6/request.js'][54] = 0;
  _$jscoverage['express 3.0.6/request.js'][100] = 0;
  _$jscoverage['express 3.0.6/request.js'][101] = 0;
  _$jscoverage['express 3.0.6/request.js'][113] = 0;
  _$jscoverage['express 3.0.6/request.js'][114] = 0;
  _$jscoverage['express 3.0.6/request.js'][115] = 0;
  _$jscoverage['express 3.0.6/request.js'][129] = 0;
  _$jscoverage['express 3.0.6/request.js'][130] = 0;
  _$jscoverage['express 3.0.6/request.js'][131] = 0;
  _$jscoverage['express 3.0.6/request.js'][156] = 0;
  _$jscoverage['express 3.0.6/request.js'][157] = 0;
  _$jscoverage['express 3.0.6/request.js'][158] = 0;
  _$jscoverage['express 3.0.6/request.js'][159] = 0;
  _$jscoverage['express 3.0.6/request.js'][181] = 0;
  _$jscoverage['express 3.0.6/request.js'][182] = 0;
  _$jscoverage['express 3.0.6/request.js'][183] = 0;
  _$jscoverage['express 3.0.6/request.js'][201] = 0;
  _$jscoverage['express 3.0.6/request.js'][202] = 0;
  _$jscoverage['express 3.0.6/request.js'][203] = 0;
  _$jscoverage['express 3.0.6/request.js'][207] = 0;
  _$jscoverage['express 3.0.6/request.js'][225] = 0;
  _$jscoverage['express 3.0.6/request.js'][226] = 0;
  _$jscoverage['express 3.0.6/request.js'][227] = 0;
  _$jscoverage['express 3.0.6/request.js'][231] = 0;
  _$jscoverage['express 3.0.6/request.js'][253] = 0;
  _$jscoverage['express 3.0.6/request.js'][254] = 0;
  _$jscoverage['express 3.0.6/request.js'][255] = 0;
  _$jscoverage['express 3.0.6/request.js'][256] = 0;
  _$jscoverage['express 3.0.6/request.js'][257] = 0;
  _$jscoverage['express 3.0.6/request.js'][258] = 0;
  _$jscoverage['express 3.0.6/request.js'][259] = 0;
  _$jscoverage['express 3.0.6/request.js'][260] = 0;
  _$jscoverage['express 3.0.6/request.js'][289] = 0;
  _$jscoverage['express 3.0.6/request.js'][290] = 0;
  _$jscoverage['express 3.0.6/request.js'][291] = 0;
  _$jscoverage['express 3.0.6/request.js'][292] = 0;
  _$jscoverage['express 3.0.6/request.js'][293] = 0;
  _$jscoverage['express 3.0.6/request.js'][294] = 0;
  _$jscoverage['express 3.0.6/request.js'][295] = 0;
  _$jscoverage['express 3.0.6/request.js'][296] = 0;
  _$jscoverage['express 3.0.6/request.js'][297] = 0;
  _$jscoverage['express 3.0.6/request.js'][298] = 0;
  _$jscoverage['express 3.0.6/request.js'][299] = 0;
  _$jscoverage['express 3.0.6/request.js'][301] = 0;
  _$jscoverage['express 3.0.6/request.js'][316] = 0;
  _$jscoverage['express 3.0.6/request.js'][317] = 0;
  _$jscoverage['express 3.0.6/request.js'][318] = 0;
  _$jscoverage['express 3.0.6/request.js'][334] = 0;
  _$jscoverage['express 3.0.6/request.js'][335] = 0;
  _$jscoverage['express 3.0.6/request.js'][347] = 0;
  _$jscoverage['express 3.0.6/request.js'][348] = 0;
  _$jscoverage['express 3.0.6/request.js'][363] = 0;
  _$jscoverage['express 3.0.6/request.js'][364] = 0;
  _$jscoverage['express 3.0.6/request.js'][365] = 0;
  _$jscoverage['express 3.0.6/request.js'][366] = 0;
  _$jscoverage['express 3.0.6/request.js'][384] = 0;
  _$jscoverage['express 3.0.6/request.js'][386] = 0;
  _$jscoverage['express 3.0.6/request.js'][387] = 0;
  _$jscoverage['express 3.0.6/request.js'][390] = 0;
  _$jscoverage['express 3.0.6/request.js'][391] = 0;
  _$jscoverage['express 3.0.6/request.js'][392] = 0;
  _$jscoverage['express 3.0.6/request.js'][393] = 0;
  _$jscoverage['express 3.0.6/request.js'][396] = 0;
  _$jscoverage['express 3.0.6/request.js'][397] = 0;
  _$jscoverage['express 3.0.6/request.js'][410] = 0;
  _$jscoverage['express 3.0.6/request.js'][411] = 0;
  _$jscoverage['express 3.0.6/request.js'][424] = 0;
  _$jscoverage['express 3.0.6/request.js'][425] = 0;
  _$jscoverage['express 3.0.6/request.js'][435] = 0;
  _$jscoverage['express 3.0.6/request.js'][436] = 0;
  _$jscoverage['express 3.0.6/request.js'][448] = 0;
  _$jscoverage['express 3.0.6/request.js'][449] = 0;
  _$jscoverage['express 3.0.6/request.js'][450] = 0;
  _$jscoverage['express 3.0.6/request.js'][453] = 0;
  _$jscoverage['express 3.0.6/request.js'][456] = 0;
  _$jscoverage['express 3.0.6/request.js'][457] = 0;
  _$jscoverage['express 3.0.6/request.js'][460] = 0;
  _$jscoverage['express 3.0.6/request.js'][472] = 0;
  _$jscoverage['express 3.0.6/request.js'][473] = 0;
  _$jscoverage['express 3.0.6/request.js'][483] = 0;
  _$jscoverage['express 3.0.6/request.js'][484] = 0;
  _$jscoverage['express 3.0.6/request.js'][485] = 0;
}
_$jscoverage['express 3.0.6/request.js'][6]++;
var http = require("http"), utils = require("./utils"), connect = require("connect"), fresh = require("fresh"), parseRange = require("range-parser"), parse = connect.utils.parseUrl, mime = connect.mime;
_$jscoverage['express 3.0.6/request.js'][18]++;
var req = exports = module.exports = {__proto__: http.IncomingMessage.prototype};
_$jscoverage['express 3.0.6/request.js'][46]++;
req.get = req.header = (function (name) {
  _$jscoverage['express 3.0.6/request.js'][48]++;
  switch (name = name.toLowerCase()) {
  case "referer":
  case "referrer":
    _$jscoverage['express 3.0.6/request.js'][51]++;
    return this.headers.referrer || this.headers.referer;
  default:
    _$jscoverage['express 3.0.6/request.js'][54]++;
    return this.headers[name];
  }
});
_$jscoverage['express 3.0.6/request.js'][100]++;
req.accepts = (function (type) {
  _$jscoverage['express 3.0.6/request.js'][101]++;
  return utils.accepts(type, this.get("Accept"));
});
_$jscoverage['express 3.0.6/request.js'][113]++;
req.acceptsCharset = (function (charset) {
  _$jscoverage['express 3.0.6/request.js'][114]++;
  var accepted = this.acceptedCharsets;
  _$jscoverage['express 3.0.6/request.js'][115]++;
  return accepted.length? ~ accepted.indexOf(charset): true;
});
_$jscoverage['express 3.0.6/request.js'][129]++;
req.acceptsLanguage = (function (lang) {
  _$jscoverage['express 3.0.6/request.js'][130]++;
  var accepted = this.acceptedLanguages;
  _$jscoverage['express 3.0.6/request.js'][131]++;
  return accepted.length? ~ accepted.indexOf(lang): true;
});
_$jscoverage['express 3.0.6/request.js'][156]++;
req.range = (function (size) {
  _$jscoverage['express 3.0.6/request.js'][157]++;
  var range = this.get("Range");
  _$jscoverage['express 3.0.6/request.js'][158]++;
  if (! range) {
    _$jscoverage['express 3.0.6/request.js'][158]++;
    return;
  }
  _$jscoverage['express 3.0.6/request.js'][159]++;
  return parseRange(size, range);
});
_$jscoverage['express 3.0.6/request.js'][181]++;
req.__defineGetter__("accepted", (function () {
  _$jscoverage['express 3.0.6/request.js'][182]++;
  var accept = this.get("Accept");
  _$jscoverage['express 3.0.6/request.js'][183]++;
  return accept? utils.parseAccept(accept): [];
}));
_$jscoverage['express 3.0.6/request.js'][201]++;
req.__defineGetter__("acceptedLanguages", (function () {
  _$jscoverage['express 3.0.6/request.js'][202]++;
  var accept = this.get("Accept-Language");
  _$jscoverage['express 3.0.6/request.js'][203]++;
  return accept? utils.parseQuality(accept).map((function (obj) {
  _$jscoverage['express 3.0.6/request.js'][207]++;
  return obj.value;
})): [];
}));
_$jscoverage['express 3.0.6/request.js'][225]++;
req.__defineGetter__("acceptedCharsets", (function () {
  _$jscoverage['express 3.0.6/request.js'][226]++;
  var accept = this.get("Accept-Charset");
  _$jscoverage['express 3.0.6/request.js'][227]++;
  return accept? utils.parseQuality(accept).map((function (obj) {
  _$jscoverage['express 3.0.6/request.js'][231]++;
  return obj.value;
})): [];
}));
_$jscoverage['express 3.0.6/request.js'][253]++;
req.param = (function (name, defaultValue) {
  _$jscoverage['express 3.0.6/request.js'][254]++;
  var params = this.params || {};
  _$jscoverage['express 3.0.6/request.js'][255]++;
  var body = this.body || {};
  _$jscoverage['express 3.0.6/request.js'][256]++;
  var query = this.query || {};
  _$jscoverage['express 3.0.6/request.js'][257]++;
  if (null != params[name] && params.hasOwnProperty(name)) {
    _$jscoverage['express 3.0.6/request.js'][257]++;
    return params[name];
  }
  _$jscoverage['express 3.0.6/request.js'][258]++;
  if (null != body[name]) {
    _$jscoverage['express 3.0.6/request.js'][258]++;
    return body[name];
  }
  _$jscoverage['express 3.0.6/request.js'][259]++;
  if (null != query[name]) {
    _$jscoverage['express 3.0.6/request.js'][259]++;
    return query[name];
  }
  _$jscoverage['express 3.0.6/request.js'][260]++;
  return defaultValue;
});
_$jscoverage['express 3.0.6/request.js'][289]++;
req.is = (function (type) {
  _$jscoverage['express 3.0.6/request.js'][290]++;
  var ct = this.get("Content-Type");
  _$jscoverage['express 3.0.6/request.js'][291]++;
  if (! ct) {
    _$jscoverage['express 3.0.6/request.js'][291]++;
    return false;
  }
  _$jscoverage['express 3.0.6/request.js'][292]++;
  ct = ct.split(";")[0];
  _$jscoverage['express 3.0.6/request.js'][293]++;
  if (! ~ type.indexOf("/")) {
    _$jscoverage['express 3.0.6/request.js'][293]++;
    type = mime.lookup(type);
  }
  _$jscoverage['express 3.0.6/request.js'][294]++;
  if (~ type.indexOf("*")) {
    _$jscoverage['express 3.0.6/request.js'][295]++;
    type = type.split("/");
    _$jscoverage['express 3.0.6/request.js'][296]++;
    ct = ct.split("/");
    _$jscoverage['express 3.0.6/request.js'][297]++;
    if ("*" == type[0] && type[1] == ct[1]) {
      _$jscoverage['express 3.0.6/request.js'][297]++;
      return true;
    }
    _$jscoverage['express 3.0.6/request.js'][298]++;
    if ("*" == type[1] && type[0] == ct[0]) {
      _$jscoverage['express 3.0.6/request.js'][298]++;
      return true;
    }
    _$jscoverage['express 3.0.6/request.js'][299]++;
    return false;
  }
  _$jscoverage['express 3.0.6/request.js'][301]++;
  return ! ! ~ ct.indexOf(type);
});
_$jscoverage['express 3.0.6/request.js'][316]++;
req.__defineGetter__("protocol", (function () {
  _$jscoverage['express 3.0.6/request.js'][317]++;
  var trustProxy = this.app.get("trust proxy");
  _$jscoverage['express 3.0.6/request.js'][318]++;
  return this.connection.encrypted? "https": trustProxy? (this.get("X-Forwarded-Proto") || "http"): "http";
}));
_$jscoverage['express 3.0.6/request.js'][334]++;
req.__defineGetter__("secure", (function () {
  _$jscoverage['express 3.0.6/request.js'][335]++;
  return "https" == this.protocol;
}));
_$jscoverage['express 3.0.6/request.js'][347]++;
req.__defineGetter__("ip", (function () {
  _$jscoverage['express 3.0.6/request.js'][348]++;
  return this.ips[0] || this.connection.remoteAddress;
}));
_$jscoverage['express 3.0.6/request.js'][363]++;
req.__defineGetter__("ips", (function () {
  _$jscoverage['express 3.0.6/request.js'][364]++;
  var trustProxy = this.app.get("trust proxy");
  _$jscoverage['express 3.0.6/request.js'][365]++;
  var val = this.get("X-Forwarded-For");
  _$jscoverage['express 3.0.6/request.js'][366]++;
  return trustProxy && val? val.split(/ *, */): [];
}));
_$jscoverage['express 3.0.6/request.js'][384]++;
req.__defineGetter__("auth", (function () {
  _$jscoverage['express 3.0.6/request.js'][386]++;
  var auth = this.get("Authorization");
  _$jscoverage['express 3.0.6/request.js'][387]++;
  if (! auth) {
    _$jscoverage['express 3.0.6/request.js'][387]++;
    return;
  }
  _$jscoverage['express 3.0.6/request.js'][390]++;
  var parts = auth.split(" ");
  _$jscoverage['express 3.0.6/request.js'][391]++;
  if ("basic" != parts[0].toLowerCase()) {
    _$jscoverage['express 3.0.6/request.js'][391]++;
    return;
  }
  _$jscoverage['express 3.0.6/request.js'][392]++;
  if (! parts[1]) {
    _$jscoverage['express 3.0.6/request.js'][392]++;
    return;
  }
  _$jscoverage['express 3.0.6/request.js'][393]++;
  auth = parts[1];
  _$jscoverage['express 3.0.6/request.js'][396]++;
  auth = new Buffer(auth, "base64").toString().split(":");
  _$jscoverage['express 3.0.6/request.js'][397]++;
  return ({username: auth[0], password: auth[1]});
}));
_$jscoverage['express 3.0.6/request.js'][410]++;
req.__defineGetter__("subdomains", (function () {
  _$jscoverage['express 3.0.6/request.js'][411]++;
  return this.get("Host").split(".").slice(0, -2).reverse();
}));
_$jscoverage['express 3.0.6/request.js'][424]++;
req.__defineGetter__("path", (function () {
  _$jscoverage['express 3.0.6/request.js'][425]++;
  return parse(this).pathname;
}));
_$jscoverage['express 3.0.6/request.js'][435]++;
req.__defineGetter__("host", (function () {
  _$jscoverage['express 3.0.6/request.js'][436]++;
  return this.get("Host").split(":")[0];
}));
_$jscoverage['express 3.0.6/request.js'][448]++;
req.__defineGetter__("fresh", (function () {
  _$jscoverage['express 3.0.6/request.js'][449]++;
  var method = this.method;
  _$jscoverage['express 3.0.6/request.js'][450]++;
  var s = this.res.statusCode;
  _$jscoverage['express 3.0.6/request.js'][453]++;
  if ("GET" != method && "HEAD" != method) {
    _$jscoverage['express 3.0.6/request.js'][453]++;
    return false;
  }
  _$jscoverage['express 3.0.6/request.js'][456]++;
  if ((s >= 200 && s < 300) || 304 == s) {
    _$jscoverage['express 3.0.6/request.js'][457]++;
    return fresh(this.headers, this.res._headers);
  }
  _$jscoverage['express 3.0.6/request.js'][460]++;
  return false;
}));
_$jscoverage['express 3.0.6/request.js'][472]++;
req.__defineGetter__("stale", (function () {
  _$jscoverage['express 3.0.6/request.js'][473]++;
  return ! this.fresh;
}));
_$jscoverage['express 3.0.6/request.js'][483]++;
req.__defineGetter__("xhr", (function () {
  _$jscoverage['express 3.0.6/request.js'][484]++;
  var val = this.get("X-Requested-With") || "";
  _$jscoverage['express 3.0.6/request.js'][485]++;
  return "xmlhttprequest" == val.toLowerCase();
}));
_$jscoverage['express 3.0.6/request.js'].source = ["","/**"," * Module dependencies."," */","","var http = require('http')","  , utils = require('./utils')","  , connect = require('connect')","  , fresh = require('fresh')","  , parseRange = require('range-parser')","  , parse = connect.utils.parseUrl","  , mime = connect.mime;","","/**"," * Request prototype."," */","","var req = exports = module.exports = {","  __proto__: http.IncomingMessage.prototype","};","","/**"," * Return request header."," *"," * The `Referrer` header field is special-cased,"," * both `Referrer` and `Referer` are interchangeable."," *"," * Examples:"," *"," *     req.get('Content-Type');"," *     // =&gt; \"text/plain\""," *     "," *     req.get('content-type');"," *     // =&gt; \"text/plain\""," *     "," *     req.get('Something');"," *     // =&gt; undefined"," *"," * Aliased as `req.header()`."," *"," * @param {String} name"," * @return {String} "," * @api public"," */","","req.get = ","req.header = function(name){","  switch (name = name.toLowerCase()) {","    case 'referer':","    case 'referrer':","      return this.headers.referrer","        || this.headers.referer;","    default:","      return this.headers[name];","  }","};","","/**"," * Check if the given `type(s)` is acceptable, returning"," * the best match when true, otherwise `undefined`, in which"," * case you should respond with 406 \"Not Acceptable\"."," *"," * The `type` value may be a single mime type string"," * such as \"application/json\", the extension name"," * such as \"json\", a comma-delimted list such as \"json, html, text/plain\","," * or an array `[\"json\", \"html\", \"text/plain\"]`. When a list"," * or array is given the _best_ match, if any is returned."," *"," * Examples:"," * "," *     // Accept: text/html"," *     req.accepts('html');"," *     // =&gt; \"html\""," *"," *     // Accept: text/*, application/json"," *     req.accepts('html');"," *     // =&gt; \"html\""," *     req.accepts('text/html');"," *     // =&gt; \"text/html\""," *     req.accepts('json, text');"," *     // =&gt; \"json\""," *     req.accepts('application/json');"," *     // =&gt; \"application/json\""," *"," *     // Accept: text/*, application/json"," *     req.accepts('image/png');"," *     req.accepts('png');"," *     // =&gt; undefined"," *"," *     // Accept: text/*;q=.5, application/json"," *     req.accepts(['html', 'json']);"," *     req.accepts('html, json');"," *     // =&gt; \"json\""," *"," * @param {String|Array} type(s)"," * @return {String}"," * @api public"," */","","req.accepts = function(type){","  return utils.accepts(type, this.get('Accept'));","};","","/**"," * Check if the given `charset` is acceptable,"," * otherwise you should respond with 406 \"Not Acceptable\"."," *"," * @param {String} charset"," * @return {Boolean}"," * @api public"," */","","req.acceptsCharset = function(charset){","  var accepted = this.acceptedCharsets;","  return accepted.length","    ? ~accepted.indexOf(charset)","    : true;","};","","/**"," * Check if the given `lang` is acceptable,"," * otherwise you should respond with 406 \"Not Acceptable\"."," *"," * @param {String} lang"," * @return {Boolean}"," * @api public"," */","","req.acceptsLanguage = function(lang){","  var accepted = this.acceptedLanguages;","  return accepted.length","    ? ~accepted.indexOf(lang)","    : true;","};","","/**"," * Parse Range header field,"," * capping to the given `size`."," *"," * Unspecified ranges such as \"0-\" require"," * knowledge of your resource length. In"," * the case of a byte range this is of course"," * the total number of bytes. If the Range"," * header field is not given `null` is returned,"," * `-1` when unsatisfiable, `-2` when syntactically invalid."," *"," * NOTE: remember that ranges are inclusive, so"," * for example \"Range: users=0-3\" should respond"," * with 4 users when available, not 3."," *"," * @param {Number} size"," * @return {Array}"," * @api public"," */","","req.range = function(size){","  var range = this.get('Range');","  if (!range) return;","  return parseRange(size, range);","};","","/**"," * Return an array of Accepted media types"," * ordered from highest quality to lowest."," *"," * Examples:"," *"," *     [ { value: 'application/json',"," *         quality: 1,"," *         type: 'application',"," *         subtype: 'json' },"," *       { value: 'text/html',"," *         quality: 0.5,"," *         type: 'text',"," *         subtype: 'html' } ]"," *"," * @return {Array}"," * @api public"," */","","req.__defineGetter__('accepted', function(){","  var accept = this.get('Accept');","  return accept","    ? utils.parseAccept(accept)","    : [];","});","","/**"," * Return an array of Accepted languages"," * ordered from highest quality to lowest."," *"," * Examples:"," *"," *     Accept-Language: en;q=.5, en-us"," *     ['en-us', 'en']"," *"," * @return {Array}"," * @api public"," */","","req.__defineGetter__('acceptedLanguages', function(){","  var accept = this.get('Accept-Language');","  return accept","    ? utils","      .parseQuality(accept)","      .map(function(obj){","        return obj.value;","      })","    : [];","});","","/**"," * Return an array of Accepted charsets"," * ordered from highest quality to lowest."," *"," * Examples:"," *"," *     Accept-Charset: iso-8859-5;q=.2, unicode-1-1;q=0.8"," *     ['unicode-1-1', 'iso-8859-5']"," *"," * @return {Array}"," * @api public"," */","","req.__defineGetter__('acceptedCharsets', function(){","  var accept = this.get('Accept-Charset');","  return accept","    ? utils","      .parseQuality(accept)","      .map(function(obj){","        return obj.value;","      })","    : [];","});","","/**"," * Return the value of param `name` when present or `defaultValue`."," *"," *  - Checks route placeholders, ex: _/user/:id_"," *  - Checks body params, ex: id=12, {\"id\":12}"," *  - Checks query string params, ex: ?id=12"," *"," * To utilize request bodies, `req.body`"," * should be an object. This can be done by using"," * the `connect.bodyParser()` middleware."," *"," * @param {String} name"," * @param {Mixed} defaultValue"," * @return {String}"," * @api public"," */","","req.param = function(name, defaultValue){","  var params = this.params || {};","  var body = this.body || {};","  var query = this.query || {};","  if (null != params[name] &amp;&amp; params.hasOwnProperty(name)) return params[name];","  if (null != body[name]) return body[name];","  if (null != query[name]) return query[name];","  return defaultValue;","};","","/**"," * Check if the incoming request contains the \"Content-Type\" "," * header field, and it contains the give mime `type`."," *"," * Examples:"," *"," *      // With Content-Type: text/html; charset=utf-8"," *      req.is('html');"," *      req.is('text/html');"," *      req.is('text/*');"," *      // =&gt; true"," *     "," *      // When Content-Type is application/json"," *      req.is('json');"," *      req.is('application/json');"," *      req.is('application/*');"," *      // =&gt; true"," *     "," *      req.is('html');"," *      // =&gt; false"," * "," * @param {String} type"," * @return {Boolean}"," * @api public"," */","","req.is = function(type){","  var ct = this.get('Content-Type');","  if (!ct) return false;","  ct = ct.split(';')[0];","  if (!~type.indexOf('/')) type = mime.lookup(type);","  if (~type.indexOf('*')) {","    type = type.split('/');","    ct = ct.split('/');","    if ('*' == type[0] &amp;&amp; type[1] == ct[1]) return true;","    if ('*' == type[1] &amp;&amp; type[0] == ct[0]) return true;","    return false;","  }","  return !! ~ct.indexOf(type);","};","","/**"," * Return the protocol string \"http\" or \"https\""," * when requested with TLS. When the \"trust proxy\" "," * setting is enabled the \"X-Forwarded-Proto\" header"," * field will be trusted. If you're running behind"," * a reverse proxy that supplies https for you this"," * may be enabled."," *"," * @return {String}"," * @api public"," */","","req.__defineGetter__('protocol', function(){","  var trustProxy = this.app.get('trust proxy');","  return this.connection.encrypted","    ? 'https'","    : trustProxy","      ? (this.get('X-Forwarded-Proto') || 'http')","      : 'http';","});","","/**"," * Short-hand for:"," *"," *    req.protocol == 'https'"," *"," * @return {Boolean}"," * @api public"," */","","req.__defineGetter__('secure', function(){","  return 'https' == this.protocol;","});","","/**"," * Return the remote address, or when"," * \"trust proxy\" is `true` return"," * the upstream addr."," *"," * @return {String}"," * @api public"," */","","req.__defineGetter__('ip', function(){","  return this.ips[0] || this.connection.remoteAddress;","});","","/**"," * When \"trust proxy\" is `true`, parse"," * the \"X-Forwarded-For\" ip address list."," *"," * For example if the value were \"client, proxy1, proxy2\""," * you would receive the array `[\"client\", \"proxy1\", \"proxy2\"]`"," * where \"proxy2\" is the furthest down-stream."," *"," * @return {Array}"," * @api public"," */","","req.__defineGetter__('ips', function(){","  var trustProxy = this.app.get('trust proxy');","  var val = this.get('X-Forwarded-For');","  return trustProxy &amp;&amp; val","    ? val.split(/ *, */)","    : [];","});","","/**"," * Return basic auth credentials."," *"," * Examples:"," *"," *    // http://tobi:hello@example.com"," *    req.auth"," *    // =&gt; { username: 'tobi', password: 'hello' }"," *"," * @return {Object} or undefined"," * @api public"," */","","req.__defineGetter__('auth', function(){","  // missing","  var auth = this.get('Authorization');","  if (!auth) return;","","  // malformed","  var parts = auth.split(' ');","  if ('basic' != parts[0].toLowerCase()) return;","  if (!parts[1]) return;","  auth = parts[1];","","  // credentials","  auth = new Buffer(auth, 'base64').toString().split(':');","  return { username: auth[0], password: auth[1] };","});","","/**"," * Return subdomains as an array."," *"," * For example \"tobi.ferrets.example.com\""," * would provide `[\"ferrets\", \"tobi\"]`."," *"," * @return {Array}"," * @api public"," */","","req.__defineGetter__('subdomains', function(){","  return this.get('Host')","    .split('.')","    .slice(0, -2)","    .reverse();","});","","/**"," * Short-hand for `url.parse(req.url).pathname`."," *"," * @return {String}"," * @api public"," */","","req.__defineGetter__('path', function(){","  return parse(this).pathname;","});","","/**"," * Parse the \"Host\" header field hostname."," *"," * @return {String}"," * @api public"," */","","req.__defineGetter__('host', function(){","  return this.get('Host').split(':')[0];","});","","/**"," * Check if the request is fresh, aka"," * Last-Modified and/or the ETag"," * still match."," *"," * @return {Boolean}"," * @api public"," */","","req.__defineGetter__('fresh', function(){","  var method = this.method;","  var s = this.res.statusCode;","","  // GET or HEAD for weak freshness validation only","  if ('GET' != method &amp;&amp; 'HEAD' != method) return false;","","  // 2xx or 304 as per rfc2616 14.26","  if ((s &gt;= 200 &amp;&amp; s &lt; 300) || 304 == s) {","    return fresh(this.headers, this.res._headers);","  }","","  return false;","});","","/**"," * Check if the request is stale, aka"," * \"Last-Modified\" and / or the \"ETag\" for the"," * resource has changed."," *"," * @return {Boolean}"," * @api public"," */","","req.__defineGetter__('stale', function(){","  return !this.fresh;","});","","/**"," * Check if the request was an _XMLHttpRequest_."," *"," * @return {Boolean}"," * @api public"," */","","req.__defineGetter__('xhr', function(){","  var val = this.get('X-Requested-With') || '';","  return 'xmlhttprequest' == val.toLowerCase();","});"];
