1 | var owns = {}.hasOwnProperty;
|
2 | module.exports = function proxyMiddleware(options) {
|
3 | var httpLib = options.protocol === 'https:' ? 'https' : 'http';
|
4 | var request = require(httpLib).request;
|
5 | options = options || {};
|
6 | options.hostname = options.hostname;
|
7 | options.port = options.port;
|
8 |
|
9 | return function (req, resp, next) {
|
10 | var url = req.url;
|
11 |
|
12 | if (typeof options.route === 'string') {
|
13 | var route = slashJoin(options.route, '');
|
14 | if (url.slice(0, route.length) === route) {
|
15 | url = url.slice(route.length);
|
16 | } else {
|
17 | return next();
|
18 | }
|
19 | }
|
20 |
|
21 |
|
22 | var opts = extend({}, options);
|
23 | opts.path = slashJoin(options.pathname, url);
|
24 | opts.method = req.method;
|
25 | opts.headers = options.headers ? merge(req.headers, options.headers) : req.headers;
|
26 |
|
27 |
|
28 | delete opts.headers["host"]
|
29 |
|
30 | var myReq = request(opts, function (myRes) {
|
31 | resp.writeHead(myRes.statusCode, myRes.headers);
|
32 | myRes.on('error', function (err) {
|
33 | next(err);
|
34 | });
|
35 | myRes.pipe(resp);
|
36 | });
|
37 | myReq.on('error', function (err) {
|
38 | next(err);
|
39 | });
|
40 | if (!req.readable) {
|
41 | myReq.end();
|
42 | } else {
|
43 | req.pipe(myReq);
|
44 | }
|
45 | };
|
46 | };
|
47 |
|
48 | function slashJoin(p1, p2) {
|
49 | if (p1.length && p1[p1.length - 1] === '/') {p1 = p1.substring(0, p1.length - 1); }
|
50 | if (p2.length && p2[0] === '/') {p2 = p2.substring(1); }
|
51 | return p1 + '/' + p2;
|
52 | }
|
53 |
|
54 | function extend(obj, src) {
|
55 | for (var key in src) if (owns.call(src, key)) obj[key] = src[key];
|
56 | return obj;
|
57 | }
|
58 |
|
59 |
|
60 | function merge(src1, src2) {
|
61 | var merged = {};
|
62 | extend(merged, src1);
|
63 | extend(merged, src2);
|
64 | return merged;
|
65 | }
|