1 | var http = require("http");
|
2 | var joinbuffers = require("joinbuffers");
|
3 | var isUtf8 = require('is-utf8');
|
4 | var iconv = require('iconv-lite');
|
5 | var config = require('./config.js');
|
6 |
|
7 | var prjInfo = config.get('project');
|
8 |
|
9 | var green = '\u001b[32m';
|
10 | var red = '\u001b[31m';
|
11 | var blue = '\u001b[34m';
|
12 | var gray = '\u001b[37m';
|
13 | var yellow = '\u001b[33m';
|
14 | var reset = '\u001b[0m';
|
15 |
|
16 | function 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 | }
|
36 | function isBinFile(fileName){
|
37 | fileName = fileName.split('?')[0];
|
38 | return !/.js$|.css$|.less$/.test(fileName);
|
39 | }
|
40 | function adaptCharset(buff, outCharset, charset){
|
41 | if (charset === outCharset) {
|
42 | return buff;
|
43 | }
|
44 |
|
45 | return iconv.encode(iconv.decode(buff, charset), outCharset);
|
46 | }
|
47 |
|
48 | exports.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 |
|
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 | }
|