whistle
Version:
HTTP, HTTP2, HTTPS, Websocket debugging proxy
52 lines (47 loc) • 1.85 kB
JavaScript
var Transform = require('pipestream').Transform;
var path = require('path');
var fs = require('fs');
var util = require('../util');
var config = require('../config');
var weinreScriptFile = path.join(config.ASSESTS_PATH, 'js/weinre.js');
var weinreScript = fs.readFileSync(weinreScriptFile, { encoding: 'utf8' });
var weinreHtmlScript = '\r\n<script>' + weinreScript + '</script>\r\n';
function getScript(host, name, isHtml, req) {
host = util.getInternalHost(req, host);
var baseUrl = (req.isHttps ? 'https://' : 'http://') + host;
var weinrePath = config.WEBUI_PATH + 'weinre.' + config.port;
var result = isHtml ? weinreHtmlScript : weinreScript;
var weinreUrl =
weinrePath + '/target/target-script-min.js#' + (name || 'anonymous');
return result.replace('$BASE_URL', baseUrl)
.replace('$WEINRE_PATH', weinrePath)
.replace('$WEINRE_URL', weinreUrl);
}
module.exports = function (req, res) {
var weinre = req.rules.weinre;
if (weinre) {
util.disableReqCache(req.headers);
delete req.rules.weinre;
var host = req.headers.host;
res.on('src', function (_res) {
if (!(weinre = req.rules.weinre) || !util.hasBody(_res)) {
return;
}
var isHtml = util.supportHtmlTransform(_res, req);
if (!isHtml && util.getContentType(_res.headers) !== 'JS') {
return;
}
!util.isEnable(req, 'keepAllCSP') && util.disableCSP(_res.headers);
!req._customCache && util.disableResStore(_res.headers);
var name = util.getPath(util.rule.getMatcher(weinre));
var transform = new Transform();
transform._transform = function (chunk, _, callback) {
if (!chunk) {
chunk = util.toBuffer(getScript(host, name, isHtml, req));
}
callback(null, chunk);
};
res.addZipTransform(transform, false, true);
});
}
};