forked from fbornhofen/life_star
-
Notifications
You must be signed in to change notification settings - Fork 6
/
proxy.js
102 lines (89 loc) · 2.8 KB
/
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
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
var request = require('request');
module.exports = function(logger) {
var Proxy = {};
// private -- helpers
var createRequest = function(method, uri, headers, body) {
var headersOut = {};
// ['user-agent', 'accept', 'accept-language', 'accept-encoding'].forEach(function(name) {
// if (headers[name]) headersOut[name] = headers[name];
// });
var reqObj = {
method: method,
uri: uri,
headers: headersOut
};
if (body && body.length > 0) {
reqObj.body = body;
}
return reqObj;
};
var forwardResponse = function(clientResp, err, resp, body) {
// FIXME possible corruption of binary data
function copyHeader(name, from, to) {
name = name.toLowerCase();
if (from.headers[name]) { to.header(name, from.headers[name]); }
}
if (err) {
var msg = 'error in proxy response: %s' + err;
logger.error(msg);
clientResp.send(msg);
return;
}
try {
copyHeader('Content-type', resp, clientResp);
copyHeader('Content-length', resp, clientResp);
copyHeader('Connection', resp, clientResp);
copyHeader('Server', resp, clientResp);
copyHeader('Accept', resp, clientResp);
copyHeader('Location', resp, clientResp);
clientResp.send(body);
} catch (e) {
var msg = 'proxying failed: %s' + e.stack;
logger.error(msg);
clientResp.send(msg);
}
};
var collectBody = function(req, next) {
var buffer = new Buffer(parseInt(req.header('Content-length')), 'binary').fill(0);
var offset = 0;
req.on('data', function(chunk) {
chunk.copy(buffer, offset);
offset += chunk.length });
req.on('end', function() {
next(buffer); });
};
// public
var get = Proxy.get = function(url, req, res) {
request(createRequest('GET', url, req.headers, null),
function(err, resp, body) {
forwardResponse(res, err, resp, body);
});
};
var post = Proxy.post = function(url, req, res) {
collectBody(req, function(completeBody) {
req.body = completeBody;
request(createRequest('POST', url, req.headers, req.body),
function(err, resp, body) {
forwardResponse(res, err, resp, body);
});
});
};
var put = Proxy.put = function(url, req, res) {
collectBody(req, function(completeBody) {
req.body = completeBody;
request(createRequest('PUT', url, req.headers, req.body),
function(err, resp, body) {
forwardResponse(res, err, resp, body);
});
});
};
var head = Proxy.head = function(url, req, res) {
collectBody(req, function(completeBody) {
request(createRequest('HEAD', url, req.headers, ''),
function(err, resp, body) {
forwardResponse(res, err, resp, body);
});
});
}
return Proxy;
}