UNPKG

whistle

Version:

HTTP, HTTPS, Websocket debugging proxy

71 lines (65 loc) 2.55 kB
var fs = require('fs'); var path = require('path'); var Transform = require('pipestream').Transform; var util = require('../util'); var config = require('../config'); var logScriptFile = path.join(config.ASSESTS_PATH, 'js/log.js'); var logScript = fs.readFileSync(logScriptFile, {encoding: 'utf8'}); var logHtmlScript, logHttpsHtmlScript, logHttpsScript; function wrapScript(script, isHtml) { return isHtml ? '\r\n<script>' + script + '</script>\r\n' : '\r\n' + script + '\r\n'; } module.exports = function(req, res, next) { if (req.rules.log) { if (!logHtmlScript) { var logCgi = '//' + config.uiport + '.log.' + this.config.localUIHost + '/cgi-bin/log/set'; logHttpsScript = logScript.replace('$LOG_CGI', 'https:' + logCgi); logScript = logScript.replace('$LOG_CGI', 'http:' + logCgi); logHttpsHtmlScript = '<!DOCTYPE html>\r\n<script>' + logHttpsScript + '</script>\r\n'; logHtmlScript = '<!DOCTYPE html>\r\n<script>' + logScript + '</script>\r\n'; } util.disableReqCache(req.headers); res.on('src', function(_res) { var topScript, isHtml; if (util.supportHtmlTransform(_res)) { isHtml = true; topScript = req.isHttps ? logHttpsHtmlScript : logHtmlScript; } else if (util.getContentType(_res.headers) == 'JS') { topScript = req.isHttps ? logHttpsScript : logScript; } if (topScript) { delete _res.headers['content-security-policy']; delete _res.headers['content-security-policy-report-only']; if (!isHtml) { _res.headers['access-control-allow-origin'] = '*'; } topScript = util.toBuffer(topScript); var userScript; var transform = new Transform(); var added; transform._transform = function(chunk, encoding, callback) { if (!added) { added = true; util.getRuleValue(req.rules.log, function(script) { var buf = [topScript]; userScript = script || null; if (userScript) { userScript = util.toBuffer(wrapScript(userScript, isHtml)); if (isHtml || !chunk) { buf.push(userScript); userScript = null; } } chunk && buf.push(chunk); callback(null, Buffer.concat(buf)); }); } else { callback(null, chunk || userScript); } }; res.addZipTransform(transform, false, true); } }); } next(); };