forked from xkxx/node-spdy-proxy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlocal.js
99 lines (92 loc) · 2.85 KB
/
local.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
87
88
89
90
91
92
93
94
95
96
97
98
99
/* Node HTTPS Proxy
* local side server test
* @author xkx
* @modified rankjie
* @version 2.0.024.2013.02.05
* @copyright 2013
* @licence GPL 3.0
*
* Credits:
*
* Ari Luotonen's paper Tunneling TCP based protocols through Web proxy servers
* Peteris Krumins' 20 line HTTP Proxy, idea & ip blacklist
* Joyent's nodejs & log code from util.js
*/
//settings
var hostname = process.argv.slice(2)[0];
var settings = {
DEBUG: true, //debug mode
noDelay: true,
timeout: 100000,
port: 8088, //listening port
secure: {
enabled: true,
key: 'gfw.key',
ca: ''
},
remote_host: hostname,
remote_port: 5555
};
//imports
var net = require('net'),
tls = require('tls'),
common = require('./common.js');
parser = require('./parser.js');
//version
var version = '2.0.024.2013.02.05';
var log = common.log;
//-------------here we go---------------------
log(common.about);
if (version !== common.version) {
log("Program Exits: Component versions don't match");
process.exit(1);
}
var socketOptions = {}; //Options for remote server connection
if(settings.secure.enabled) {
socketOptions.key = common.getFileContent(settings.secure.key)[1];
}
if(settings.secure.ca) {
socketOptions.ca = common.getFileContent(settings.secure.ca)[1];
}
//setup server
net.createServer(function(socket) {
var client = socket, remote;
if (settings.noDelay) client.setNoDelay(true);
log('----------incoming connection!-----------');
if (settings.secure.enabled) {
remote = tls.connect(settings.remote_port, settings.remote_host, socketOptions);
}
else {
remote = net.createConnection(settings.remote_port, settings.remote_host);
}
if (settings.timeout) remote.setTimeout(settings.timeout);
if (settings.noDelay) remote.setNoDelay(true);
remote.on('connect', function() {
log('----------remote server connected!-----------');
});
remote.on('secureConnection', function() {
log('----------SSL connection established!-----------');
});
remote.pipe(client);
client.pipe(remote);
remote.on('timeout', function() {
log('----------remote-timeout-------');
remote.end();
client.end(parser.netCreateResponse('request-timeout'));
});
remote.on('close', function(e) {log('---------remote-close-' + (e ? 'with' : 'without') + '-flaw--------');
});
remote.on('error', function(e) {
log('---------remote-error-------');log(e);
if (e.errno === 61) client.end(parser.netCreateResponse('ECONNREFUSED'));
});
client.on('timeout', function() {log('----------proxy-timeout-------');});
client.on('close', function(e) {log('--------proxy-close-' + (e ? 'with' : 'without') + '-flaw--------');});
client.on('error', function(e) {log('---------proxy-error-------');log(e);});
//end of new connection handler
}).listen(settings.port);
log('Server up listening at localhost:'+ settings.port);
process.on('uncaughtException', function(e) {
log('-------uncaught-exception----------');
log(e);
});