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