UNPKG

whistle

Version:

HTTP, HTTPS, Websocket debugging proxy

101 lines (89 loc) 2.97 kB
var fs = require('fs'); var path = require('path'); var Zip = require('node-native-zip'); var util = require('./util'); var fiddlerAssets = path.join(__dirname, '../../assets/fiddler/'); var fiddlerMeta = fs.readFileSync(fiddlerAssets + 'meta.xml', 'utf8'); function filterSessions(sessions) { return sessions.filter(function(item) { if (!item || !item.url || !item.req || !(item.startTime >= 0)) { return false; } return true; }); } function renderTpl(tpl, locals) { locals = getMetaData(locals); Object.keys(locals).forEach(function(name) { tpl = tpl.replace('${' + name + '}', locals[name]); }); return tpl; } function getMetaData(item) { var meta = { SID: item.index + 1 }; ['ClientConnected', 'ClientDoneRequest', 'ServerGotRequest', 'ServerBeginResponse', 'ServerDoneResponse', 'ClientBeginResponse', 'ClientDoneResponse'].forEach(function(name) { meta[name] = '0001-01-01T00:00:00'; }); ['GatewayTime', 'DNSTime', 'TCPConnectTime'].forEach(function(name) { meta[name] = 0; }); ['ttfb', 'ttlb', 'transfer-size', 'clientip', 'hostip'].forEach(function(name) { meta[name] = 0; }); meta.ClientConnected = util.toISOString(item.startTime); if (item.dnsTime >= item.startTime) { meta.DNSTime = item.dnsTime - item.startTime; } if (item.requestTime > 0) { meta.ClientDoneRequest = meta.ServerGotRequest = meta.ServerBeginResponse = util.toISOString(item.requestTime); } if (item.responseTime > 0) { meta.ClientBeginResponse = util.toISOString(item.responseTime); meta.ttfb = item.responseTime - item.startTime; } if (item.endTime > 0) { meta.ServerDoneResponse = meta.ClientDoneResponse = util.toISOString(item.endTime); meta.ttlb = item.endTime - item.startTime; } var req = item.req || {}; var res = item.res || {}; if (res.size > 0) { meta['transfer-size'] = res.size; } meta.clientip = req.ip || '127.0.0.1'; meta.hostip = res.ip || '127.0.0.1'; return meta; } function getFiddler2Meta(item) { return renderTpl(fiddlerMeta, item); } module.exports = function(body) { var sessions = util.parseJSON(body.sessions); if (!Array.isArray(sessions)) { return ''; } sessions = filterSessions(sessions); var index = 0; var getName = function() { var name = String(index); ++index; var paddingCount = 4 - name.length; return paddingCount <= 0 ? name : new Array(paddingCount + 1).join('0') + name; }; var zip = new Zip(); sessions.map(function(item, index) { item.req.url = item.url; var req = util.getReqRaw(item.req); var res = !item.res || item.res.statusCode == null ? new Buffer('') : util.getResRaw(item.res); var name = getName(); item.index = index; zip.add('raw/' + name + '_c.txt', req); zip.add('raw/' + name + '_m.xml', new Buffer(getFiddler2Meta(item))); zip.add('raw/' + name + '_s.txt', res); }); return zip.toBuffer(); };