修正this指向错误的bug

This commit is contained in:
砚然 2018-08-24 16:03:38 +08:00
parent 98264facde
commit 51abd0532c
5 changed files with 29 additions and 18 deletions

View File

@ -1,3 +1,7 @@
/// <reference path="../../typings/index.d.ts" />
import RequestErrorHandler from './requestErrorHandler';
const const
url = require('url'), url = require('url'),
https = require('https'), https = require('https'),
@ -12,8 +16,7 @@ const
brotliTorb = require('brotli'), brotliTorb = require('brotli'),
co = require('co'); co = require('co');
const requestErrorHandler = require('./requestErrorHandler'); const requestErrorHandler = new RequestErrorHandler();
const DEFAULT_CHUNK_COLLECT_THRESHOLD = 20 * 1024 * 1024; // about 20 mb const DEFAULT_CHUNK_COLLECT_THRESHOLD = 20 * 1024 * 1024; // about 20 mb
// to fix issue with TLS cache, refer to: https://github.com/nodejs/node/issues/8368 // to fix issue with TLS cache, refer to: https://github.com/nodejs/node/issues/8368
@ -203,7 +206,7 @@ export default class UserReqHandler {
in http server: http://www.example.com/a/b/c in http server: http://www.example.com/a/b/c
in https server: /a/b/c in https server: /a/b/c
*/ */
const self = this;
const host = req.headers.host; const host = req.headers.host;
const protocol = (!!req.connection.encrypted && !(/^http:/).test(req.url)) ? 'https' : 'http'; const protocol = (!!req.connection.encrypted && !(/^http:/).test(req.url)) ? 'https' : 'http';
const fullUrl = protocol === 'http' ? req.url : (protocol + '://' + host + req.url); const fullUrl = protocol === 'http' ? req.url : (protocol + '://' + host + req.url);
@ -331,7 +334,7 @@ export default class UserReqHandler {
.then(() => { .then(() => {
// record request info // record request info
if (this.recorder) { if (self.recorder) {
resourceInfo = { resourceInfo = {
host, host,
method: req.method, method: req.method,
@ -341,18 +344,18 @@ export default class UserReqHandler {
req, req,
startTime: new Date().getTime() startTime: new Date().getTime()
}; };
resourceInfoId = this.recorder.appendRecord(resourceInfo); resourceInfoId = self.recorder.appendRecord(resourceInfo);
} }
try { try {
resourceInfo.reqBody = reqData.toString(); //TODO: deal reqBody in webInterface.js resourceInfo.reqBody = reqData.toString(); //TODO: deal reqBody in webInterface.js
this.recorder && this.recorder.updateRecord(resourceInfoId, resourceInfo); self.recorder && self.recorder.updateRecord(resourceInfoId, resourceInfo);
} catch (e) { } } catch (e) { }
}) })
// invoke rule before sending request // invoke rule before sending request
.then(co.wrap(function *() { .then(co.wrap(function *() {
const userModifiedInfo = (yield this.userRule.beforeSendRequest(Object.assign({}, requestDetail))) || {}; const userModifiedInfo = (yield self.userRule.beforeSendRequest(Object.assign({}, requestDetail))) || {};
const finalReqDetail = {}; const finalReqDetail = {};
['protocol', 'requestOptions', 'requestData', 'response'].map((key) => { ['protocol', 'requestOptions', 'requestData', 'response'].map((key) => {
finalReqDetail[key] = userModifiedInfo[key] || requestDetail[key] finalReqDetail[key] = userModifiedInfo[key] || requestDetail[key]
@ -368,7 +371,7 @@ export default class UserReqHandler {
return userConfig; return userConfig;
} else if (userConfig.requestOptions) { } else if (userConfig.requestOptions) {
const remoteResponse = yield fetchRemoteResponse(userConfig.protocol, userConfig.requestOptions, userConfig.requestData, { const remoteResponse = yield fetchRemoteResponse(userConfig.protocol, userConfig.requestOptions, userConfig.requestData, {
dangerouslyIgnoreUnauthorized: this.reqHandlerCtx.dangerouslyIgnoreUnauthorized, dangerouslyIgnoreUnauthorized: self.reqHandlerCtx.dangerouslyIgnoreUnauthorized,
chunkSizeThreshold, chunkSizeThreshold,
}); });
return { return {
@ -393,7 +396,7 @@ export default class UserReqHandler {
return responseData; return responseData;
} else { } else {
// TODO: err etimeout // TODO: err etimeout
return (yield this.userRule.beforeSendResponse(Object.assign({}, requestDetail), Object.assign({}, responseData))) || responseData; return (yield self.userRule.beforeSendResponse(Object.assign({}, requestDetail), Object.assign({}, responseData))) || responseData;
} }
})) }))
@ -404,7 +407,7 @@ export default class UserReqHandler {
// call user rule // call user rule
try { try {
const userResponse = yield this.userRule.onError(Object.assign({}, requestDetail), error); const userResponse = yield self.userRule.onError(Object.assign({}, requestDetail), error);
if (userResponse && userResponse.response && userResponse.response.header) { if (userResponse && userResponse.response && userResponse.response.header) {
errorResponse = userResponse.response; errorResponse = userResponse.response;
} }
@ -431,7 +434,7 @@ export default class UserReqHandler {
// console.info('===> resbody in record', resourceInfo); // console.info('===> resbody in record', resourceInfo);
this.recorder && this.recorder.updateRecord(resourceInfoId, resourceInfo); self.recorder && self.recorder.updateRecord(resourceInfoId, resourceInfo);
}) })
.catch((e) => { .catch((e) => {
logUtil.printLog(color.green('Send final response failed:' + e.message), logUtil.T_ERR); logUtil.printLog(color.green('Send final response failed:' + e.message), logUtil.T_ERR);

View File

@ -1,5 +1,7 @@
'use strict'; 'use strict';
import UserReqHandler from './UserReqHandler';
const const
net = require('net'), net = require('net'),
color = require('colorful'), color = require('colorful'),
@ -10,8 +12,6 @@ const
CommonReadableStream = require('./CommonReadableStream'), CommonReadableStream = require('./CommonReadableStream'),
HttpsServerMgr = require('../httpsServerMgr'); HttpsServerMgr = require('../httpsServerMgr');
const UserReqHandler = require('./UserReqHandler').default;
/** /**
* get request info from the ws client, includes: * get request info from the ws client, includes:
host host
@ -429,7 +429,7 @@ class RequestHandler {
const userRule = util.merge(default_rule, rule); const userRule = util.merge(default_rule, rule);
const userReqHandler = new UserReqHandler(reqHandlerCtx, userRule, recorder); const userReqHandler = new UserReqHandler(reqHandlerCtx, userRule, recorder);
reqHandlerCtx.userRequestHandler = userReqHandler.handler.bind(reqHandlerCtx); reqHandlerCtx.userRequestHandler = userReqHandler.handler.bind(userReqHandler);
reqHandlerCtx.wsHandler = getWsHandler.bind(this, userRule, recorder); reqHandlerCtx.wsHandler = getWsHandler.bind(this, userRule, recorder);
reqHandlerCtx.httpsServerMgr = new HttpsServerMgr({ reqHandlerCtx.httpsServerMgr = new HttpsServerMgr({

View File

@ -14,7 +14,7 @@ import * as mime from 'mime-types';
import * as color from 'colorful'; import * as color from 'colorful';
import { Buffer } from 'buffer'; import { Buffer } from 'buffer';
import { execSync } from 'child_process'; import { execSync } from 'child_process';
import * as logUtil from './log'; import logUtil from './log';
const networkInterfaces = require('os').networkInterfaces(); const networkInterfaces = require('os').networkInterfaces();

3
types/index.d.ts vendored
View File

@ -1,3 +0,0 @@
export interface AnyProxyConfig {
port: number
}

11
typings/index.d.ts vendored Normal file
View File

@ -0,0 +1,11 @@
declare interface AnyProxyConfig {
port: number
}
declare interface AnyProxyRule {
summary?: string,
beforeSendRequest?: Function,
beforeSendResponse?: Function,
beforeDealHttpsRequest?: Function,
onError?: Function,
onConnectError?: Function
}