url-file-manager.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. var isUrlRe = /^(?:https?:)?\/\//i,
  2. url = require('url'),
  3. request,
  4. PromiseConstructor,
  5. AbstractFileManager = require('../less/environment/abstract-file-manager.js'),
  6. logger = require('../less/logger');
  7. var UrlFileManager = function() {
  8. };
  9. UrlFileManager.prototype = new AbstractFileManager();
  10. UrlFileManager.prototype.supports = function(filename, currentDirectory, options, environment) {
  11. return isUrlRe.test( filename ) || isUrlRe.test(currentDirectory);
  12. };
  13. UrlFileManager.prototype.loadFile = function(filename, currentDirectory, options, environment) {
  14. if (!PromiseConstructor) {
  15. PromiseConstructor = typeof Promise === 'undefined' ? require('promise') : Promise;
  16. }
  17. return new PromiseConstructor(function(fulfill, reject) {
  18. if (request === undefined) {
  19. try { request = require('request'); }
  20. catch (e) { request = null; }
  21. }
  22. if (!request) {
  23. reject({ type: 'File', message: 'optional dependency \'request\' required to import over http(s)\n' });
  24. return;
  25. }
  26. var urlStr = isUrlRe.test( filename ) ? filename : url.resolve(currentDirectory, filename),
  27. urlObj = url.parse(urlStr);
  28. if (!urlObj.protocol) {
  29. urlObj.protocol = 'http';
  30. urlStr = urlObj.format();
  31. }
  32. request.get({uri: urlStr, strictSSL: !options.insecure }, function (error, res, body) {
  33. if (error) {
  34. reject({ type: 'File', message: 'resource \'' + urlStr + '\' gave this Error:\n ' + error + '\n' });
  35. return;
  36. }
  37. if (res && res.statusCode === 404) {
  38. reject({ type: 'File', message: 'resource \'' + urlStr + '\' was not found\n' });
  39. return;
  40. }
  41. if (!body) {
  42. logger.warn('Warning: Empty body (HTTP ' + res.statusCode + ') returned by "' + urlStr + '"');
  43. }
  44. fulfill({ contents: body, filename: urlStr });
  45. });
  46. });
  47. };
  48. module.exports = UrlFileManager;