UNPKG

vpn.email.client

Version:
121 lines (120 loc) 4.11 kB
/*! * Copyright 2017 Vpn.Email network security technology Canada Inc. All Rights Reserved. * * Vpn.Email network technolog Canada Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ "use strict"; const Crypto = require("crypto"); const Url = require("url"); const cacheFileType = /\.jpeg$|\.html$|\.css$|\.gif$|\.js$|\.jpg$|\.png$|\.svg$|\.xml$/i; class httpProxy { constructor(buffer) { this.buffer = buffer; this.text = buffer.toString('utf8'); this._parts = this.text.split('\r\n\r\n'); this.commandWithLine = this._parts[0].split(/\r\n/); let u = '{'; for (let i = 1, k = 0; i < this.commandWithLine.length; i++) { const line = this.commandWithLine[i].split(': '); if (line.length !== 2) { if (/^host$/i.test(line[0])) continue; break; } if (k++ !== 0) u += ','; u += `"${line[0].toLowerCase()}": ${JSON.stringify(line[1])}`; } u += '}'; this.headers = JSON.parse(u); } get parts() { return Math.round(this._parts.length / 2); } get nextPart() { const part = '\r\n\r\n'; if (this.parts > 1) { const part1 = this.text.indexOf(part); const part2 = this.text.indexOf(part, part1 + 1); const kk = this.buffer.slice(part2 + 4); if (kk.length) return kk; } return new Buffer(0); } get isHttps() { return (this.isConnect && this.Url.port === '443'); } get isHttpRequest() { return (/^connect|^get|^put|^delete|^post|^OPTIONS|^HEAD|^TRACE/i.test(this.commandWithLine[0])); } get command() { return this.commandWithLine; } get Url() { let http = this.commandWithLine[0].split(' ')[1]; http = !/^http/i.test(http) ? 'http://' + http : http; return Url.parse(http); } get isConnect() { return /^connect /i.test(this.commandWithLine[0]); } get isGet() { return /^GET /i.test(this.commandWithLine[0]); } get isPost() { return /^port/i.test(this.commandWithLine[0]); } get cachePath() { if (!this.isGet || !this.isCanCacheFile) return null; return Crypto.createHash('md5').update(this.Url.host + this.Url.href).digest('hex'); } get isCanCacheFile() { return cacheFileType.test(this.commandWithLine[0].split(' ')[1]); } get getProxyAuthorization() { for (let i = 1; i < this.commandWithLine.length; i++) { const y = this.commandWithLine[i]; if (/^Proxy-Authorization: Basic /i.test(y)) { const n = y.split(' '); if (n.length === 3) { return new Buffer(n[2], 'base64').toString('utf8'); } return; } } return; } get BufferWithOutKeepAlife() { if (!this.isGet || !this.isCanCacheFile) return this.buffer; let ss = ''; this.commandWithLine.forEach(n => { ss += n.replace('keep-alive', 'close') + '\r\n'; }); ss += '\r\n\r\n'; return new Buffer(ss, 'utf8'); } get Body() { const length = parseInt(this.headers['content-length']); if (!length) return null; const body = this._parts[1]; if (body && body.length && body.length === length) return body; return null; } } exports.httpProxy = httpProxy;