url-file-manager.js 2.0 KB

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