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.
|
|
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;
|