-
Notifications
You must be signed in to change notification settings - Fork 0
/
http_proxy2.js
105 lines (96 loc) · 3.54 KB
/
http_proxy2.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
100
101
102
103
104
105
'use strict';
var http = require('http');
var url = require('url');
var net = require('net');
var chocolate = require("./js/chocolate.js");
var HTTP_PORT = process.argv[2] || 8081; // internal proxy server port
var PROXY_URL = process.argv[3] || null; // external proxy server URL
var PROXY_HOST = PROXY_URL ? url.parse(PROXY_URL).hostname : null;
var PROXY_PORT = PROXY_URL ? (url.parse(PROXY_URL).port || 80) : null;
function printError(err, msg, url) {
console.log('%s %s: %s %s', new Date().toLocaleTimeString(), msg, err, url);
}
var httpServer = http.createServer(function onCliReq(cliReq, cliRes) {
var x = url.parse(cliReq.url);
if (PROXY_URL)
var options = {host: PROXY_HOST, port: PROXY_PORT, path: cliReq.url,
method: cliReq.method, headers: cliReq.headers};
else
var options = {host: x.hostname, port: x.port || 80, path: x.path,
method: cliReq.method, headers: cliReq.headers};
var svrReq = http.request(options, function onSvrRes(svrRes) {
cliRes.writeHead(svrRes.statusCode, svrRes.headers);
// svrRes.pipe(cliRes);
var svrResBody = "";
svrRes.on("data",function(chunk){
svrResBody += chunk;
});
svrRes.on("end",function(chunk){
svrResBody += chunk;
svrResBodyChanged = chocolate.chocolatify(svrResBody);
cliRes.write(svrResBodyChanged);
cliRes.end();
});
console.log("a");
});
var cliReqBody = "";
cliReq.on("data",function(chunk){
cliReqBody += chunk;
});
cliReq.on("end",function(chunk){
cliReqBody += chunk;
svrReq.write(cliReqBody);
svrReq.end();
});
// cliReq.pipe(svrReq);
svrReq.on('error', function onSvrReqErr(err) {
cliRes.writeHead(400, err.message, {'content-type': 'text/html'});
cliRes.end('<h1>' + err.message + '<br/>' + cliReq.url + '</h1>');
printError(err, 'svrReq', x.hostname + ':' + (x.port || 80));
});
}).listen(HTTP_PORT);
httpServer.on('clientError', function onCliErr(err, cliSoc) {
cliSoc.end();
printError(err, 'cliErr', '');
});
httpServer.on('connect', function onCliConn(cliReq, cliSoc, cliHead) {
var x = url.parse('https://' + cliReq.url);
if (PROXY_URL) {
var options = {host: PROXY_HOST, port: PROXY_PORT, path: cliReq.url,
method: cliReq.method, headers: cliReq.headers};
var svrReq = http.request(options);
svrReq.end();
var svrSoc = null;
svrReq.on('connect', function onSvrConn(svrRes, svrSoc2, svrHead) {
svrSoc = svrSoc2;
cliSoc.write('HTTP/1.0 200 Connection established\r\n\r\n');
if (cliHead && cliHead.length) svrSoc.write(cliHead);
if (svrHead && svrHead.length) cliSoc.write(svrHead);
svrSoc.pipe(cliSoc);
cliSoc.pipe(svrSoc);
svrSoc.on('error', funcOnSocErr(cliSoc, 'svrSoc', cliReq.url));
});
svrReq.on('error', funcOnSocErr(cliSoc, 'svrRq2', cliReq.url));
}
else {
var svrSoc = net.connect(x.port || 443, x.hostname, function onSvrConn() {
cliSoc.write('HTTP/1.0 200 Connection established\r\n\r\n');
if (cliHead && cliHead.length) svrSoc.write(cliHead);
cliSoc.pipe(svrSoc);
});
svrSoc.pipe(cliSoc);
svrSoc.on('error', funcOnSocErr(cliSoc, 'svrSoc', cliReq.url));
}
cliSoc.on('error', function onCliSocErr(err) {
if (svrSoc) svrSoc.end();
printError(err, 'cliSoc', cliReq.url);
});
function funcOnSocErr(soc, msg, url) {
return function onSocErr(err) {
soc.end();
printError(err, msg, url);
};
}
});
console.log('http proxy server started on port ' + HTTP_PORT +
(PROXY_URL ? ' -> ' + PROXY_HOST + ':' + PROXY_PORT : ''));