UNPKG

vpn.email.server.gfw

Version:
101 lines (100 loc) 4.4 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 Stream = require("stream"); const HttpHeader = require("./httpProxy"); class blockRequestData extends Stream.Transform { constructor(allowedAddress, timeout) { super(); this.allowedAddress = allowedAddress; this.temp = Buffer.allocUnsafe(0); this.startTime = new Date().getTime(); this.timeOut = null; this.first = true; this.last = null; if (timeout) { this.timeOut = setTimeout(() => { this.unpipe(); }, timeout); } } _transform(chunk, encode, cb) { this.temp = Buffer.concat([this.temp, chunk]); const httpHeader = new HttpHeader.httpProxy(this.temp); if (httpHeader._parts.length < 2) { return cb(); } // have not http format request if (!httpHeader.isHttpRequest) { console.log('*************** SKIP nuformat data **********************'); console.log(httpHeader.buffer.toString('utf8')); console.log('****************** this.last *******************'); console.log(this.last.toString('utf8')); httpHeader._parts.shift(); this.temp = Buffer.from(httpHeader._parts.join('\r\n\r\n'), 'utf8'); console.log('****************** next Buffer *******************'); console.log(this.temp.toString('utf8')); console.log('*************************************'); return this._transform(Buffer.allocUnsafe(0), encode, cb); } if (!this.allowedAddress) { return cb(new Error('404')); } if (!httpHeader.isGet && !httpHeader.isPost) { console.log('unknow httpHeader'); console.log('************* unknow httpHeader **********'); console.log(httpHeader._parts[0]); console.log('***************************************'); httpHeader._parts.shift(); this.temp = Buffer.from(httpHeader._parts.join('\r\n\r\n'), 'utf8'); return this._transform(Buffer.allocUnsafe(0), encode, cb); } if (this.timeOut) { clearTimeout(this.timeOut); this.timeOut = null; } if (httpHeader.isGet) { const ret = Buffer.from(httpHeader.Url.path.substr(1), 'base64'); this.last = Buffer.from(httpHeader._parts[0] + `\r\n\r\n`, 'utf8'); httpHeader._parts.shift(); this.temp = Buffer.from(httpHeader._parts.join('\r\n\r\n'), 'utf8'); this.push(ret); return this._transform(Buffer.allocUnsafe(0), encode, cb); } if (httpHeader._parts.length < 3) { return cb(); } const ret = Buffer.from(httpHeader.PostBody, 'base64'); if (!ret) { console.log('***************** POST get data ERROR ********************'); console.log(this.last.toString('utf8')); console.log('*************************************'); console.log(httpHeader.buffer.toString('utf8')); console.log('****************** new Buffer *******************'); httpHeader._parts.shift(); httpHeader._parts.shift(); this.temp = Buffer.from(httpHeader._parts.join('\r\n\r\n'), 'utf8'); return this._transform(Buffer.allocUnsafe(0), encode, cb); } this.push(ret); httpHeader._parts.shift(); httpHeader._parts.shift(); this.temp = Buffer.from(httpHeader._parts.join('\r\n\r\n'), 'utf8'); return this._transform(Buffer.allocUnsafe(0), encode, cb); } } exports.blockRequestData = blockRequestData;