/
server.js
86 lines (75 loc) · 2.4 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
var http = require('http');
var dns = require('dns');
var fs = require('fs');
var config = require('./config/config').config;
var mimes = require('./config/mimes').mimes;
var redirect = require('./config/redirect').redirect;
var server = http.createServer(function (req, res) {
var uri = req.url.split('?')[0].replace(/^\/(.+?)$/, '$1');
var file = [config.docpath, uri.split('#')[0]].join('/').replace(/\/{2,}/g, '/');
var has_ext = uri.split('#')[0].split('.').length > 1;
var file_ext = uri.split('#')[0].split('.')[uri.split('#')[0].split('.').length-1];
var query = ((req.url || '').split('?')[1] || '').split('&');
var mime = mimes[file_ext];
var redir_info = (has_ext ? redirect.extensions[file_ext] : redirect.extensions[redirect.default_extension]) || false;
if (!redir_info) {
fs.lstat(file, function (err, stat) {
if (!err) {
var docPath = stat.isDirectory() ? file+'/'+config.index : file;
docPath = docPath.replace(/\/{2,}/g, '/');
fs.readFile(docPath, function (err, content) {
if (!err) {
res.writeHead(200, {
'Server':'Yet Another Node.js Server',
'Content-Type':mime
});
res.end(content, 'utf-8');
} else {
respError(err, res);
}
});
} else {
respError(err, res);
}
});
} else {
var proxy = http.createClient(redir_info.port, redir_info.ip);
var proxy_req = proxy.request(req.method, req.url, req.headers);
proxy_req.end();
proxy_req.on('response', function (proxy_res) {
proxy_res.on('data', function (chunk) {
res.writeHead(proxy_res.statusCode, proxy_res.headers);
res.write(chunk);
res.end();
});
});
}
});
dns.resolve4(config.host, function (err, addrs) {
if (!err) {
config.host = addrs[0];
}
server.listen(config.port, config.host);
initScreen(config.port, config.host);
});
var respError = function (err, res) {
switch (err.code) {
case 'ENOENT':
res.writeHead(404);
res.write('<h1>ERROR 404 - File not found!</h1>');
break;
default:
res.writeHead(500);
res.write('<h1>ERROR 500 - Internal server error!</h1>');
}
res.end('<pre>'+(err.toString())+'</pre>');
};
var initScreen = function (port, host) {
console.log('Yet Another Node.js Server');
console.log('Listening at '+host+':'+port+'...\n');
console.log('Redirections:');
for (i in redirect.extensions) {
var ri = redirect.extensions[i];
console.log('\t*.'+i+' to '+ri.ip+':'+ri.port);
}
};