75 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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;
 |