Spaces:
Running
Running
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); | |
} 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; | |