function wrapJs(js, charset, isUrl) { if (!js) { return ''; } if (isUrl) { return toBuffer('<script src="' + js + '"></script>', charset); } return Buffer.concat([SCRIPT_START, toBuffer(js, charset), SCRIPT_END]); }
function decode(buf) { if (!Buffer.isBuffer(buf)) { return buf ? String(buf) : ''; } if (!isUtf8(buf)) { try { return iconv.decode(buf, 'GB18030'); } catch(e) {} } return String(buf); }
function wrapResponse(res) { var passThrough = new PassThrough(); passThrough.statusCode = res.statusCode; passThrough.rawHeaderNames = res.rawHeaderNames; passThrough.headers = lowerCaseify(res.headers); passThrough.headers.server = config.name; res.body != null && passThrough.push(Buffer.isBuffer(res.body) ? res.body : String(res.body)); passThrough.push(null); return passThrough; }
function addClientInfo(socket, chunk, statusLine, clientIp, clientPort) { var len = Buffer.byteLength(statusLine); chunk = chunk.slice(len); statusLine += '\r\n' + config.CLIENT_INFO_HEAD + ': ' + clientIp + ',' + clientPort; var clientId = socket.headers[config.CLIENT_ID_HEADER]; if (clientId) { statusLine += '\r\n' + config.TEMP_CLIENT_ID_HEADER + ': ' + clientId; } var tunnelData = socket.headers[config.TUNNEL_DATA_HEADER]; if (tunnelData) { statusLine += '\r\n' + config.TEMP_TUNNEL_DATA_HEADER + ': ' + tunnelData; } return Buffer.concat([Buffer.from(statusLine), chunk]); }
function dechunkify(body) { var result = []; var index; while((index = indexOfBuffer(body, CRLF)) > 0) { var size = parseInt(body.slice(0, index).toString(), 16) || 0; if (!size) { break; } index += 2; result.push(body.slice(index, index += size)); body = body.slice(index + 2); } return result.length ? Buffer.concat(result) : body; }
function decodeRaw(headers, data) { var body = getBodyBuffer(data); var raw = Buffer.from(headers.join('\r\n') + '\r\n\r\n'); return body ? Buffer.concat([raw, body]) : raw; }
function pack(data) { if (!data) { return Buffer.from('\n0\n'); } return Buffer.concat([Buffer.from('\n' + data.length + '\n'), data]); }
function joinData(list, isText) { if (!list || !list.length) { return ''; } if (isText) { return list.filter(noop).join('\r\n'); } var result = []; list.forEach(function(buf) { if (buf) { buf = Buffer.isBuffer(buf) ? buf : Buffer.from(buf + ''); result.push(buf, CRLF); } }); result.pop(); return result.length ? Buffer.concat(result) : ''; }
function toBinary(data) { if (!data || Buffer.isBuffer(data)) { return data && data.length && data; } if (typeof data !== 'string') { try { data = JSON.stringify(data); } catch (e) { return; } } return Buffer.from(data); }
function toBuffer(buf, charset) { if (buf == null || Buffer.isBuffer(buf)) { return buf; } buf += ''; if (charset && typeof charset === 'string' && !UTF8_RE.test(charset)) { try { charset = charset.toLowerCase(); if (charset === 'base64') { return Buffer.from(buf, 'base64'); } return iconv.encode(buf, charset); } catch (e) {} } return Buffer.from(buf); }
function getBuffer(data) { return !data || Buffer.isBuffer(data) ? data : Buffer.from(String(data)); }
function toBuffer(buf) { if (buf == null || Buffer.isBuffer(buf)) { return buf; } buf += ''; return Buffer.from(buf); }
function wrapCss(css, charset, isUrl) { if (!css) { return ''; } if (isUrl) { return toBuffer('<link rel="stylesheet" href="' + css + '" />', charset); } return Buffer.concat([STYLE_START, toBuffer(css, charset), STYLE_END]); }