-
Notifications
You must be signed in to change notification settings - Fork 1
/
proxy.js
70 lines (57 loc) · 1.75 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
/**
* proxy
* =====
*
* Proxy to HTTPS without using certs
* ----------------------------------
*
* Use `secure: false` in the proxy configuration to access HTTPS targets
* without cert
*
* Rewrite request Host header by using the proxy target
* -----------------------------------------------------
*
* Use `headers: { host: <new host> }` in proxy configuration to rewrite the
* `Host` header with the current proxy target
*/
'use strict';
var httpProxy = require('http-proxy');
var url = require('url');
var cookieRewrite = require('../utils/cookieRewrite');
module.exports = function (target, options) {
target = url.parse(target);
options = options || {};
var log = options.log || console.log;
var host = url.format({
protocol: target.protocol,
host: target.host
});
var path = target.pathname || '';
if (path === '/') { path = ''; }
var proxy = httpProxy.createProxyServer({
target: host,
secure: false,
headers: { host: target.host }
});
proxy.on('error', function (err, req, res) {
var msg = err.toString() + ': ' + host + req.url;
log(msg);
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end(msg);
});
proxy.on('proxyRes', function (proxyRes, req, res) {
log(req.url.replace(path, '') + ' -> ' + host + req.url);
var headers = proxyRes.headers;
if (!headers['set-cookie']) { return; }
headers['set-cookie'] = headers['set-cookie'].map(function (cookie) {
return cookieRewrite(cookie, function (cookie) {
if (cookie.path) { cookie.path = cookie.path.replace(path, ''); }
return cookie;
});
});
});
return function (req, res) {
req.url = path + req.url.replace(/^[/][?]/, '?').replace(/^[/]$/, '');
proxy.web(req, res);
};
};