-
Notifications
You must be signed in to change notification settings - Fork 0
/
http-proxy.js
77 lines (68 loc) · 2.23 KB
/
http-proxy.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
var sys = require('sys'),
http = require('http')
events = require('events');
exports.filteredHeaders = ['proxy-connection', 'set-cookie', 'accept-encoding',
'connection', 'keep-alive', 'proxy-authenticate', 'upgrade', 'proxy-authorization', 'trailers', 'transfer-encoding'];
// return a headers with all filteredHeaders removed
function cleanHeaders(h) {
cleaned = {};
for(var p in h) {
if (exports.filteredHeaders.indexOf(p) == -1) {
cleaned[p] = h[p];
}
}
return cleaned;
}
function responseContentType(headers) {
try {
if (headers['content-encoding'] == "gzip" ||
(headers['content-type'].indexOf("text/") == -1)) {
return "binary";
} else {
return "utf8"
}
} catch(e) {
return "utf8";
}
}
exports.createServer = function(handler) {
return http.createServer(function (req, res) {
var client = http.createClient(req.headers.port || 80, req.headers.host),
upstream_req = client.request(req.method.toUpperCase(), req.url, cleanHeaders(req.headers)),
res_buffer = "",
sent_headers = false;
req.addListener("data", function(chunk) {
upstream_req.write(chunk);
});
upstream_req.addListener('response', function(upstream_res) {
var encoding = responseContentType(upstream_res.headers);
// close connection
upstream_res.headers['connection'] = 'close';
upstream_res.headers['proxy-connection'] = 'close';
upstream_res.addListener("data", function(chunk) {
if (handler !== undefined) {
// handler will need full body
res_buffer = res_buffer + chunk;
} else {
if (!sent_headers) {
res.writeHeader(upstream_res.statusCode, upstream_res.headers);
sent_headers = true;
}
res.write(chunk, encoding);
}
});
upstream_res.addListener("end", function() {
if (handler !== undefined) {
handler(upstream_res.headers, res_buffer, function(headers, body) {
res.writeHeader(upstream_res.statusCode, headers);
res.write(body, encoding);
res.close();
});
} else {
res.close();
}
});
});
upstream_req.close();
});
}