| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | var fs = require('fs'),    url = require('url'),    stream = require('stream');function resolve_url(href, base) {  if (url.URL)    return new url.URL(href, base);  // older Node version (< v6.13)  return base ? url.resolve(base, href) : href;}function host_and_ports_match(url1, url2) {  if (url1.indexOf('http') < 0) url1 = 'http://' + url1;  if (url2.indexOf('http') < 0) url2 = 'http://' + url2;  var a = url.parse(url1), b = url.parse(url2);  return a.host == b.host    && String(a.port || (a.protocol == 'https:' ? 443 : 80))    == String(b.port || (b.protocol == 'https:' ? 443 : 80));}// returns false if a no_proxy host or pattern matches given urlfunction should_proxy_to(uri) {  var no_proxy = get_env_var(['NO_PROXY'], true);  if (!no_proxy) return true;  // previous (naive, simple) strategy  // var host, hosts = no_proxy.split(',');  // for (var i in hosts) {  //   host = hosts[i];  //   if (host_and_ports_match(host, uri)) {  //     return false;  //   }  // }  var pattern, pattern_list = no_proxy.split(/[\s,]+/);  for (var i in pattern_list) {    pattern = pattern_list[i];    if (pattern.trim().length == 0) continue;    // replace leading dot by asterisk, escape dots and finally replace asterisk by .*    var regex = new RegExp(pattern.replace(/^\./, "*").replace(/[.]/g, '\\$&').replace(/\*/g, '.*'))    if (uri.match(regex)) return false;  }  return true;}function get_env_var(keys, try_lower) {  var val, i = -1, env = process.env;  while (!val && i < keys.length-1) {    val = env[keys[++i]];    if (!val && try_lower) {      val = env[keys[i].toLowerCase()];    }  }  return val;}function parse_content_type(header) {  if (!header || header === '') return {};  var found, charset = 'utf8', arr = header.split(';');  if (arr.length > 1 && (found = arr[1].match(/charset=(.+)/)))    charset = found[1];  return { type: arr[0], charset: charset };}function is_stream(obj) {  return typeof obj.pipe === 'function';}function get_stream_length(stream, given_length, cb) {  if (given_length > 0)    return cb(given_length);  if (stream.end !== void 0 && stream.end !== Infinity && stream.start !== void 0)    return cb((stream.end + 1) - (stream.start || 0));  fs.stat(stream.path, function(err, stat) {    cb(stat ? stat.size - (stream.start || 0) : null);  });}function pump_streams(streams, cb) {  if (stream.pipeline)    return stream.pipeline.apply(null, streams.concat(cb));  var tmp = streams.shift();  while (streams.length) {    tmp = tmp.pipe(streams.shift());    tmp.once('error', function(e) {      cb && cb(e);      cb = null;    })  }}module.exports = {  resolve_url: resolve_url,  get_env_var: get_env_var,  host_and_ports_match: host_and_ports_match,  should_proxy_to: should_proxy_to,  parse_content_type: parse_content_type,  is_stream: is_stream,  get_stream_length: get_stream_length,  pump_streams: pump_streams}
 |