UNPKG

1.81 kBJavaScriptView Raw
1var owns = {}.hasOwnProperty;
2module.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 // You can pass the route within the options, as well
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 //options for this request
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 // Forwarding the host breaks dotcloud
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
48function 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
54function extend(obj, src) {
55 for (var key in src) if (owns.call(src, key)) obj[key] = src[key];
56 return obj;
57}
58
59//merges data without changing state in either argument
60function merge(src1, src2) {
61 var merged = {};
62 extend(merged, src1);
63 extend(merged, src2);
64 return merged;
65}