12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- const isUrlRe = /^(?:https?:)?\/\//i;
- import url from 'url';
- let request;
- import AbstractFileManager from '../less/environment/abstract-file-manager.js';
- import logger from '../less/logger';
- class UrlFileManager extends AbstractFileManager {
- supports(filename, currentDirectory, options, environment) {
- return isUrlRe.test( filename ) || isUrlRe.test(currentDirectory);
- }
- loadFile(filename, currentDirectory, options, environment) {
- return new Promise((fulfill, reject) => {
- if (request === undefined) {
- try { request = require('request'); }
- catch (e) { request = null; }
- }
- if (!request) {
- reject({ type: 'File', message: 'optional dependency \'request\' required to import over http(s)\n' });
- return;
- }
- let urlStr = isUrlRe.test( filename ) ? filename : url.resolve(currentDirectory, filename);
- const urlObj = url.parse(urlStr);
- if (!urlObj.protocol) {
- urlObj.protocol = 'http';
- urlStr = urlObj.format();
- }
- request.get({uri: urlStr, strictSSL: !options.insecure }, (error, res, body) => {
- if (error) {
- reject({ type: 'File', message: `resource '${urlStr}' gave this Error:\n ${error}\n` });
- return;
- }
- if (res && res.statusCode === 404) {
- reject({ type: 'File', message: `resource '${urlStr}' was not found\n` });
- return;
- }
- if (!body) {
- logger.warn(`Warning: Empty body (HTTP ${res.statusCode}) returned by "${urlStr}"`);
- }
- fulfill({ contents: body, filename: urlStr });
- });
- });
- }
- }
- export default UrlFileManager;
|