You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							74 lines
						
					
					
						
							1.8 KiB
						
					
					
				
			
		
		
	
	
							74 lines
						
					
					
						
							1.8 KiB
						
					
					
				var http = require('http'); | 
						|
var https = require('https'); | 
						|
var url = require('url'); | 
						|
 | 
						|
var isHttpResource = require('../utils/is-http-resource'); | 
						|
var isHttpsResource = require('../utils/is-https-resource'); | 
						|
var override = require('../utils/override'); | 
						|
 | 
						|
var HTTP_PROTOCOL = 'http:'; | 
						|
 | 
						|
function loadRemoteResource(uri, inlineRequest, inlineTimeout, callback) { | 
						|
  var proxyProtocol = inlineRequest.protocol || inlineRequest.hostname; | 
						|
  var errorHandled = false; | 
						|
  var requestOptions; | 
						|
  var fetch; | 
						|
 | 
						|
  requestOptions = override( | 
						|
    url.parse(uri), | 
						|
    inlineRequest || {} | 
						|
  ); | 
						|
 | 
						|
  if (inlineRequest.hostname !== undefined) { | 
						|
    // overwrite as we always expect a http proxy currently | 
						|
    requestOptions.protocol = inlineRequest.protocol || HTTP_PROTOCOL; | 
						|
    requestOptions.path = requestOptions.href; | 
						|
  } | 
						|
 | 
						|
  fetch = (proxyProtocol && !isHttpsResource(proxyProtocol)) || isHttpResource(uri) ? | 
						|
    http.get : | 
						|
    https.get; | 
						|
 | 
						|
  fetch(requestOptions, function (res) { | 
						|
    var chunks = []; | 
						|
    var movedUri; | 
						|
 | 
						|
    if (errorHandled) { | 
						|
      return; | 
						|
    } | 
						|
 | 
						|
    if (res.statusCode < 200 || res.statusCode > 399) { | 
						|
      return callback(res.statusCode, null); | 
						|
    } else if (res.statusCode > 299) { | 
						|
      movedUri = url.resolve(uri, res.headers.location); | 
						|
      return loadRemoteResource(movedUri, inlineRequest, inlineTimeout, callback); | 
						|
    } | 
						|
 | 
						|
    res.on('data', function (chunk) { | 
						|
      chunks.push(chunk.toString()); | 
						|
    }); | 
						|
    res.on('end', function () { | 
						|
      var body = chunks.join(''); | 
						|
      callback(null, body); | 
						|
    }); | 
						|
  }) | 
						|
  .on('error', function (res) { | 
						|
    if (errorHandled) { | 
						|
      return; | 
						|
    } | 
						|
 | 
						|
    errorHandled = true; | 
						|
    callback(res.message, null); | 
						|
  }) | 
						|
  .on('timeout', function () { | 
						|
    if (errorHandled) { | 
						|
      return; | 
						|
    } | 
						|
 | 
						|
    errorHandled = true; | 
						|
    callback('timeout', null); | 
						|
  }) | 
						|
  .setTimeout(inlineTimeout); | 
						|
} | 
						|
 | 
						|
module.exports = loadRemoteResource;
 | 
						|
 |