UNPKG

2.98 kBJavaScriptView Raw
1var http = require("http");
2var joinbuffers = require("joinbuffers");
3var isUtf8 = require('is-utf8');
4var iconv = require('iconv-lite');
5var config = require('./config.js');
6
7var prjInfo = config.get('project');
8
9var green = '\u001b[32m';
10var red = '\u001b[31m';
11var blue = '\u001b[34m';
12var gray = '\u001b[37m';
13var yellow = '\u001b[33m';
14var reset = '\u001b[0m';
15
16function cosoleResp(type, c){
17 if(type == "Need"){
18 console.log('%s=>Need : %s%s%s %s',green, reset, blue, c, reset);
19 return;
20 }
21 if(type == 'Not found'){
22 console.log('%s<=Not found: %s%s%s %s',red, reset, gray, c, reset);
23 return;
24 }
25 if(type == 'Actually'){
26 console.log('%s Actually: %s%s%s %s',green, reset, gray, c, reset);
27 return;
28 }
29 if(type == 'Remote'){
30 console.log('%s<=Remote : %s%s%s %s',green, reset, gray, c, reset);
31 return;
32 }
33 console.log(green+'<='+type+': ' + reset + gray + ' ' + c + ' ' + reset);
34 return;
35}
36function isBinFile(fileName){
37 fileName = fileName.split('?')[0];
38 return !/.js$|.css$|.less$/.test(fileName);
39}
40function adaptCharset(buff, outCharset, charset){
41 if (charset === outCharset) {
42 return buff;
43 }
44
45 return iconv.encode(iconv.decode(buff, charset), outCharset);
46}
47
48exports.fetch = function(url, host, callback) {
49 var filteredUrl = url,
50 requestOption = {
51 path: url,
52 host: host,
53 port: 80,
54 agent: false
55 };
56
57 callback = typeof callback == "function" ? callback : function(code){console.log(code);};
58
59 http.get(requestOption, function(resp) {
60 var buffs = [];
61 if (resp.statusCode !== 200) {
62 var headerHost = requestOption.host;
63 cosoleResp('Not found', requestOption.host + requestOption.path + ' (host:'+ reset + yellow + headerHost + reset + ')');
64 callback('File ' + requestOption.host + requestOption.path + ' not found.', 404);
65 return;
66 }
67 resp.on('data', function(chunk) {
68 buffs.push(chunk);
69 });
70 resp.on('end', function() {
71 var buff = joinbuffers(buffs);
72
73 //fix 80% situation bom problem.quick and dirty
74 if(buff[0] === 239 && buff[1] === 187 && buff[2] === 191) {
75 buff = buff.slice(3, buff.length);
76 }
77 if(isBinFile(filteredUrl)){
78 cosoleResp('Remote', requestOption.host + requestOption.path);
79 callback(buff, 200);
80 return;
81 }
82 cosoleResp('Remote', requestOption.host + requestOption.path);
83 var charset = isUtf8(buff) ? 'utf8' : 'gbk';
84 var outputCharset = prjInfo.charset[0];
85
86 callback(adaptCharset(buff, outputCharset, charset), 200);
87 return;
88 });
89 }).on('error',function() {
90 callback('404 Error, File not found.', 404);
91 return;
92 });
93}