From 10b6bdef2edf5992101b8d2fb5d2da216dfdc41d Mon Sep 17 00:00:00 2001 From: avwo Date: Fri, 28 Sep 2018 23:49:08 +0800 Subject: [PATCH] feat: responseFor://name=x-upstream --- lib/https/index.js | 5 +---- lib/inspectors/res.js | 5 +---- lib/tunnel.js | 1 + lib/util/index.js | 13 +++++++++++++ 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/https/index.js b/lib/https/index.js index d6ba73761..19cfb45d4 100644 --- a/lib/https/index.js +++ b/lib/https/index.js @@ -444,10 +444,7 @@ function resolveWebsocket(socket, callback, wss) { var resRuleData = { headers: headers }; util.setResCors(resRuleData, resCors, cors, socket.headers.origin); util.setResCookies(resRuleData, cookies); - var responseFor = util.getMatcherValue(_rules.responseFor); - if (responseFor) { - headers['x-whistle-response-for'] = responseFor; - } + util.setResponseFor(_rules, headers, socket.hostIp); var delResHeaders = util.parseDeleteProperties(socket).resHeaders; Object.keys(delResHeaders).forEach(function(name) { delete headers[name]; diff --git a/lib/inspectors/res.js b/lib/inspectors/res.js index 75293ed31..d08ade83b 100644 --- a/lib/inspectors/res.js +++ b/lib/inspectors/res.js @@ -691,10 +691,7 @@ module.exports = function(req, res, next) { if (properties.get('showHostIpInResHeaders') || req.filter.showHost || req.enable.showHost) { _res.headers['x-host-ip'] = req.hostIp || LOCALHOST; } - var responseFor = util.getMatcherValue(resRules.responseFor); - if (responseFor) { - _res.headers['x-whistle-response-for'] = responseFor; - } + util.setResponseFor(resRules, _res.headers, req.hostIp); try { res.writeHead(_res.statusCode, formatHeaders(_res.headers, res.rawHeaderNames)); _res.trailers && res.addTrailers(_res.trailers); diff --git a/lib/tunnel.js b/lib/tunnel.js index 41c8107c9..a772fbf5b 100644 --- a/lib/tunnel.js +++ b/lib/tunnel.js @@ -391,6 +391,7 @@ function tunnelProxy(server, proxy) { if (responseFor) { resHeaders['x-whistle-response-for'] = responseFor; } + util.setResponseFor(reqRules, resHeaders, req.hostIp); var delResHeaders = util.parseDeleteProperties(req).resHeaders; Object.keys(delResHeaders).forEach(function(name) { delete resHeaders[name]; diff --git a/lib/util/index.js b/lib/util/index.js index 5fa7da185..66e884093 100644 --- a/lib/util/index.js +++ b/lib/util/index.js @@ -2092,3 +2092,16 @@ function isRulesContent(ctn) { return COMMENT_RE.test(ctn) || !SCRIPT_RE.test(ctn); } exports.isRulesContent = isRulesContent; + +var RESPONSE_FOR_NAME = /^name=(.+)$/; +exports.setResponseFor = function(rules, headers, serverIp) { + var responseFor = getMatcherValue(rules.responseFor); + if (!responseFor) { + return; + } + if (RESPONSE_FOR_NAME.test(responseFor)) { + responseFor = headers[RegExp.$1.toLowerCase()] || ''; + responseFor += (responseFor && ', ') + serverIp; + } + headers['x-whistle-response-for'] = responseFor; +};