UNPKG

whistle.data-checker

Version:
802 lines (791 loc) 27.2 kB
# whistle.data-checker ## options ```javascript { name: 'whistle.data-checker', script: '/usr/local/lib/node_modules/whistle/lib/plugins/load-plugin', value: '/Users/aidenmo/projects/web/whistle.data-checker', version: '1.0.0', CUSTOM_CERT_HEADER: 'x-whistle-exists-custom-cert', ENABLE_CAPTURE_HEADER: 'x-whistle-enable-capture', RULE_VALUE_HEADER: 'x-whistle-rule-value', SNI_VALUE_HEADER: 'x-whistle-sni-value', RULE_URL_HEADER: 'x-whistle-rule-url', MAX_AGE_HEADER: 'x-whistle-max-age', ETAG_HEADER: 'x-whistle-etag', FULL_URL_HEADER: 'x-whistle-full-url', REAL_URL_HEADER: 'x-whistle-real-url', RELATIVE_URL_HEADER: 'x-whistle-relative-url', EXTRA_URL_HEADER: 'x-whistle-extra-url', REQ_ID_HEADER: 'x-whistle-req-id', PIPE_VALUE_HEADER: 'x-whistle-pipe-value', CUSTOM_PARSER_HEADER: 'x-whistle-frame-parser', STATUS_CODE_HEADER: 'x-whistle-status-code', PLUGIN_REQUEST_HEADER: 'x-whistle-plugin-request', LOCAL_HOST_HEADER: 'x-whistle-local-host', HOST_VALUE_HEADER: 'x-whistle-local-host', PROXY_VALUE_HEADER: 'x-whistle-proxy-value', PAC_VALUE_HEADER: 'x-whistle-pac-value', METHOD_HEADER: 'x-whistle-method', CLIENT_IP_HEADER: 'x-forwarded-for', CLIENT_PORT_HEAD: 'x-whistle-client-port', UI_REQUEST_HEADER: 'x-whistle-auth-ui-request', GLOBAL_VALUE_HEAD: 'x-whistle-global-value', SERVER_NAME_HEAD: 'x-whistle-server-name', COMMON_NAME_HEAD: 'x-whistle-common-name', CERT_CACHE_INFO: 'x-whistle-cert-cache-info', HOST_IP_HEADER: 'x-whistle-host-ip', debugMode: true, config: { _from: 'whistle', _id: 'whistle@2.9.33', _inBundle: false, _integrity: 'sha512-/llORnUQB4bY6AZmbm6mK+pyW8GKTgnE9tArm5YnupvBHDJmxAtCo/d0r4j9RMzC4Vl5oP9Mhc3TuW2zoliIrA==', _location: '/whistle', _resolved: 'https://mirrors.tencent.com/npm/whistle/-/whistle-2.9.33.tgz', _shasum: '286988c12a7b14ff9fa8304b92530b7c160aed42', _spec: 'whistle', _where: '/Users/aidenmo/projects/web', bundleDependencies: false, dataDirname: '.whistle', deprecated: false, description: 'HTTP, HTTP2, HTTPS, Websocket debugging proxy', homepage: 'https://github.com/avwo/whistle', license: 'MIT', localUIHost: 'local.whistlejs.com', name: 'whistle', port: 8001, registry: 'https://registry.npmjs.org/whistle', sockets: 256, timeout: 360000, version: '2.9.33', rejectUnauthorized: false, enableH2: true, ASSESTS_PATH: '/usr/local/lib/node_modules/whistle/assets', REQ_FROM_HEADER: 'x-whistle-request-from', WHISTLE_POLICY_HEADER: 'x-whistle-policy', CUSTOM_CERT_HEADER: 'x-whistle-exists-custom-cert', ENABLE_CAPTURE_HEADER: 'x-whistle-enable-capture', CLIENT_IP_HEAD: 'x-forwarded-for', HTTPS_FIELD: 'x-whistle-https-request', HTTPS_PROTO_HEADER: 'x-forwarded-proto', REAL_HOST_HEADER: 'x-whistle-real-host', FWD_HOST_HEADER: 'x-forwarded-host', INTERNAL_ID_HEADER: '_x-whistle-internal-id', CLIENT_PORT_HEAD: 'x-whistle-client-port', WEBUI_PATH: '/.whistle-path.5b6af7b9884e1165/', PLUGIN_HOOK_NAME_HEADER: 'x-whistle-plugin-hook-name_', CLIENT_ID_HEADER: 'x-whistle-client-id', CLIENT_ID_HEAD: 'x-whistle-client-id', TUNNEL_DATA_HEADER: 'x-whistle-tunnel-data', ALPN_PROTOCOL_HEADER: 'x-whistle-alpn-protocol', CONN_TIMEOUT: 30000, baseDir: '/Users/aidenmo/.WhistleAppData/.whistle', CUSTOM_PLUGIN_PATH: '/Users/aidenmo/.WhistleAppData/custom_plugins', CUSTOM_CERTS_DIR: '/Users/aidenmo/.WhistleAppData/custom_certs', DEV_PLUGINS_PATH: '/Users/aidenmo/.WhistleAppData/dev_plugins', uiport: 8001, debugMode: true, host: '127.0.0.1', captureData: true, httpAgent: false, httpsAgent: false, baseDirHash: '2e69e03c2da9f6c9cbcfe87793800a9d0dc40260', rulesDir: '/Users/aidenmo/.WhistleAppData/.whistle/rules', valuesDir: '/Users/aidenmo/.WhistleAppData/.whistle/values', propertiesDir: '/Users/aidenmo/.WhistleAppData/.whistle/properties', clientId: 'AIDENMO-MB0.25kSg8Y35hAUn/lM5V4hergJhEpEgrUtuZ4xRQjln+g=', runtimeId: 'AIDENMO-MB0.OZE0od1gaT2qUDyG4wzXn8VOKT9+ojuihf/qbe/kMAg=/8001', uiHostList: [], pluginHosts: {}, pluginBaseDir: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker', pluginDataDir: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker' }, Storage: [Function: Storage], parseUrl: [Function (anonymous)], formatHeaders: [Function: formatRawHeaders], wsParser: { getExtensions: [Function: getExtensions], getSender: [Function (anonymous)], getReceiver: [Function (anonymous)] }, RULE_PROTO_HEADER: 'x-whistle-rule-proto', wrapWsReader: [Function: wrapWsReader], wrapWsWriter: [Function: wrapWsWriter], require: [Function: require] { resolve: [Function: resolve] { paths: [Function: paths] }, main: Module { id: '.', path: '/usr/local/lib/node_modules/whistle/node_modules/pfork/lib', exports: {}, parent: null, filename: '/usr/local/lib/node_modules/whistle/node_modules/pfork/lib/main.js', loaded: true, children: [Array], paths: [Array] }, extensions: [Object: null prototype] { '.js': [Function (anonymous)], '.json': [Function (anonymous)], '.node': [Function (anonymous)] }, cache: [Object: null prototype] { '/usr/local/lib/node_modules/whistle/node_modules/pfork/lib/main.js': [Module], '/usr/local/lib/node_modules/whistle/node_modules/pfork/lib/util.js': [Module], '/Users/aidenmo/projects/web/whistle.data-checker/lib/util.js': [Module] } }, REQ_FROM_HEADER: 'x-whistle-request-from', shortName: 'whistle.data-checker', localStorage: Storage { recycleBin: RecycleBin { _dir: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker/.recycle_bin', _list: [], _map: {} }, _disabled: false, _backupDir: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker/.backup', _files: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker/files', _properties: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker/properties', _backupProps: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker/.backup/properties', _cache: { maxIndex: -1, files: {}, properties: [Object] } }, storage: Storage { recycleBin: RecycleBin { _dir: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker/.recycle_bin', _list: [], _map: {} }, _disabled: false, _backupDir: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker/.backup', _files: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker/files', _properties: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker/properties', _backupProps: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker/.backup/properties', _cache: { maxIndex: -1, files: {}, properties: [Object] } }, baseUrl: 'http://127.0.0.1:8001', LRU: [Function: LRUCache], getValue: [Function: getValue], getCert: [Function: getCert], getRootCA: [Function (anonymous)], getHttpsStatus: [Function (anonymous)], getPerfData: [Function (anonymous)], getProcessData: [Function (anonymous)], getRuntimeInfo: [Function (anonymous)], getTop: [Function (anonymous)], updateRules: [Function (anonymous)], compose: [Function (anonymous)], composer: [Function (anonymous)], getRules: [Function (anonymous)], getValues: [Function (anonymous)], getPlugins: [Function (anonymous)], getCustomCertsInfo: [Function (anonymous)], isActive: [Function (anonymous)], isEnable: [Function (anonymous)], connect: [Function: connect], request: [Function: request] } ``` ## req ```javascript IncomingMessage { _readableState: ReadableState { objectMode: false, highWaterMark: 16384, buffer: BufferList { head: null, tail: null, length: 0 }, length: 0, pipes: [], flowing: true, ended: true, endEmitted: true, reading: false, sync: true, needReadable: false, emittedReadable: false, readableListening: false, resumeScheduled: false, errorEmitted: false, emitClose: true, autoDestroy: false, destroyed: false, errored: null, closed: false, closeEmitted: false, defaultEncoding: 'utf8', awaitDrainWriters: null, multiAwaitDrain: false, readingMore: true, dataEmitted: false, decoder: null, encoding: null, [Symbol(kPaused)]: false }, _events: [Object: null prototype] { end: [ [Function: clearRequestTimeout], [Function: clearIncoming] ], error: [Function: destroy] }, _eventsCount: 2, _maxListeners: undefined, socket: Socket { connecting: false, _hadError: false, _parent: null, _host: null, _readableState: ReadableState { objectMode: false, highWaterMark: 16384, buffer: BufferList { head: null, tail: null, length: 0 }, length: 0, pipes: [], flowing: true, ended: false, endEmitted: false, reading: true, sync: false, needReadable: true, emittedReadable: false, readableListening: false, resumeScheduled: false, errorEmitted: false, emitClose: false, autoDestroy: false, destroyed: true, errored: null, closed: true, closeEmitted: true, defaultEncoding: 'utf8', awaitDrainWriters: null, multiAwaitDrain: false, readingMore: false, dataEmitted: false, decoder: null, encoding: null, [Symbol(kPaused)]: false }, _events: [Object: null prototype] { error: [Array], end: [Array], timeout: [Function: socketOnTimeout], data: [Function: bound socketOnData], close: [Function: bound socketOnClose], drain: [Function: bound socketOnDrain], resume: [Function: onSocketResume], pause: [Function: onSocketPause] }, _eventsCount: 8, _maxListeners: undefined, _writableState: WritableState { objectMode: false, highWaterMark: 16384, finalCalled: true, needDrain: false, ending: true, ended: true, finished: true, destroyed: true, decodeStrings: false, defaultEncoding: 'utf8', length: 0, writing: false, corked: 0, sync: false, bufferProcessing: false, onwrite: [Function: bound onwrite], writecb: null, writelen: 0, afterWriteTickInfo: null, buffered: [], bufferedIndex: 0, allBuffers: true, allNoop: true, pendingcb: 0, prefinished: true, errorEmitted: false, emitClose: false, autoDestroy: false, errored: null, closed: true, closeEmitted: false }, allowHalfOpen: true, on: [Function: socketListenerWrap], _sockname: null, _pendingData: null, _pendingEncoding: '', server: Server { maxHeaderSize: undefined, insecureHTTPParser: undefined, _events: [Object: null prototype], _eventsCount: 4, _maxListeners: undefined, _connections: 0, _handle: [TCP], _usingWorkers: false, _workers: [], _unref: false, allowHalfOpen: true, pauseOnConnect: false, httpAllowHalfOpen: false, timeout: 360000, keepAliveTimeout: 5000, maxHeadersCount: null, headersTimeout: 60000, requestTimeout: 0, _connectionKey: '4:127.0.0.1:40501', [Symbol(IncomingMessage)]: [Function: IncomingMessage], [Symbol(ServerResponse)]: [Function: ServerResponse], [Symbol(kCapture)]: false, [Symbol(async_id_symbol)]: 14 }, _server: Server { maxHeaderSize: undefined, insecureHTTPParser: undefined, _events: [Object: null prototype], _eventsCount: 4, _maxListeners: undefined, _connections: 0, _handle: [TCP], _usingWorkers: false, _workers: [], _unref: false, allowHalfOpen: true, pauseOnConnect: false, httpAllowHalfOpen: false, timeout: 360000, keepAliveTimeout: 5000, maxHeadersCount: null, headersTimeout: 60000, requestTimeout: 0, _connectionKey: '4:127.0.0.1:40501', [Symbol(IncomingMessage)]: [Function: IncomingMessage], [Symbol(ServerResponse)]: [Function: ServerResponse], [Symbol(kCapture)]: false, [Symbol(async_id_symbol)]: 14 }, timeout: 360000, parser: null, addListener: [Function: socketListenerWrap], prependListener: [Function: socketListenerWrap], _paused: false, _httpMessage: null, [Symbol(async_id_symbol)]: 23, [Symbol(kHandle)]: null, [Symbol(kSetNoDelay)]: false, [Symbol(lastWriteQueueSize)]: 0, [Symbol(timeout)]: Timeout { _idleTimeout: -1, _idlePrev: null, _idleNext: null, _idleStart: 454, _onTimeout: null, _timerArgs: undefined, _repeat: null, _destroyed: true, [Symbol(refed)]: false, [Symbol(kHasPrimitive)]: false, [Symbol(asyncId)]: 24, [Symbol(triggerId)]: 23 }, [Symbol(kBuffer)]: null, [Symbol(kBufferCb)]: null, [Symbol(kBufferGen)]: null, [Symbol(kCapture)]: false, [Symbol(kBytesRead)]: 1574, [Symbol(kBytesWritten)]: 94, [Symbol(RequestTimeout)]: undefined }, httpVersionMajor: 1, httpVersionMinor: 1, httpVersion: '1.1', complete: true, headers: { host: 'otheve.beacon.qq.com', 'sec-ch-ua': '"Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"', accept: 'application/json, text/plain, */*', 'content-type': 'application/json;charset=utf-8', dnt: '1', 'sec-ch-ua-mobile': '?0', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36', 'sec-ch-ua-platform': '"macOS"', origin: 'https://yobang.tencentmusic.com', 'sec-fetch-site': 'cross-site', 'sec-fetch-mode': 'cors', 'sec-fetch-dest': 'empty', referer: 'https://yobang.tencentmusic.com/', 'accept-encoding': 'gzip', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', 'x-whistle-req-id': '1667703724025-634', 'x-whistle-full-url': 'https%3A%2F%2Fotheve.beacon.qq.com%2Fanalytics%2Fv2_upload%3Fappkey%3D0WEB04LNRZ4FG0JE', 'x-forwarded-for': '127.0.0.1', 'x-whistle-client-port': '62038', 'x-whistle-rule-url': 'data-checker%3A%2F%2F%7Bscript.js%7D', 'x-whistle-rule-value': "function%20fields(reqBody)%20%7B%0A%20%20return%20%7B%0A%20%20%20%20eventCode%3AreqBody.events%5B0%5D.eventCode%2C%0A%20%20%20%20pageId%3A%20reqBody.events%5B0%5D.mapValue.pageId%2C%0A%20%20%20%20'%E4%B8%9A%E5%8A%A1'%3A%20reqBody.events%5B0%5D.mapValue.bizId%2C%0A%20%20%7D%0A%7D", 'x-whistle-method': 'POST', connection: 'close' }, rawHeaders: [ 'host', 'otheve.beacon.qq.com', 'sec-ch-ua', '"Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"', 'accept', 'application/json, text/plain, */*', 'content-type', 'application/json;charset=utf-8', 'dnt', '1', 'sec-ch-ua-mobile', '?0', 'user-agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36', 'sec-ch-ua-platform', '"macOS"', 'origin', 'https://yobang.tencentmusic.com', 'sec-fetch-site', 'cross-site', 'sec-fetch-mode', 'cors', 'sec-fetch-dest', 'empty', 'referer', 'https://yobang.tencentmusic.com/', 'accept-encoding', 'gzip', 'accept-language', 'zh-CN,zh;q=0.9,en;q=0.8', 'x-whistle-req-id', '1667703724025-634', 'x-whistle-full-url', 'https%3A%2F%2Fotheve.beacon.qq.com%2Fanalytics%2Fv2_upload%3Fappkey%3D0WEB04LNRZ4FG0JE', 'x-forwarded-for', '127.0.0.1', 'x-whistle-client-port', '62038', 'x-whistle-from-tunnel-req-1667701779234-44842-3418', '1', 'x-whistle-remote-address-1667701779234-44842-3418', '127.0.0.1', 'x-whistle-remote-port-1667701779234-44842-3418', '62038', 'x-whistle-rule-url', 'data-checker%3A%2F%2F%7Bscript.js%7D', 'x-whistle-rule-value', "function%20fields(reqBody)%20%7B%0A%20%20return%20%7B%0A%20%20%20%20eventCode%3AreqBody.events%5B0%5D.eventCode%2C%0A%20%20%20%20pageId%3A%20reqBody.events%5B0%5D.mapValue.pageId%2C%0A%20%20%20%20'%E4%B8%9A%E5%8A%A1'%3A%20reqBody.events%5B0%5D.mapValue.bizId%2C%0A%20%20%7D%0A%7D", 'x-whistle-raw-pattern_', '1%2C%5E**%2Fanalytics%2Fv2_upload***', 'x-whistle-method', 'POST', 'x-whistle-plugin-hook-name_', 'req-stats-1667701779234-44842-3418', 'Connection', 'close' ], trailers: {}, rawTrailers: [], aborted: false, upgrade: false, url: '/analytics/v2_upload?appkey=0WEB04LNRZ4FG0JE', method: 'GET', statusCode: null, statusMessage: null, client: Socket { connecting: false, _hadError: false, _parent: null, _host: null, _readableState: ReadableState { objectMode: false, highWaterMark: 16384, buffer: BufferList { head: null, tail: null, length: 0 }, length: 0, pipes: [], flowing: true, ended: false, endEmitted: false, reading: true, sync: false, needReadable: true, emittedReadable: false, readableListening: false, resumeScheduled: false, errorEmitted: false, emitClose: false, autoDestroy: false, destroyed: true, errored: null, closed: true, closeEmitted: true, defaultEncoding: 'utf8', awaitDrainWriters: null, multiAwaitDrain: false, readingMore: false, dataEmitted: false, decoder: null, encoding: null, [Symbol(kPaused)]: false }, _events: [Object: null prototype] { error: [Array], end: [Array], timeout: [Function: socketOnTimeout], data: [Function: bound socketOnData], close: [Function: bound socketOnClose], drain: [Function: bound socketOnDrain], resume: [Function: onSocketResume], pause: [Function: onSocketPause] }, _eventsCount: 8, _maxListeners: undefined, _writableState: WritableState { objectMode: false, highWaterMark: 16384, finalCalled: true, needDrain: false, ending: true, ended: true, finished: true, destroyed: true, decodeStrings: false, defaultEncoding: 'utf8', length: 0, writing: false, corked: 0, sync: false, bufferProcessing: false, onwrite: [Function: bound onwrite], writecb: null, writelen: 0, afterWriteTickInfo: null, buffered: [], bufferedIndex: 0, allBuffers: true, allNoop: true, pendingcb: 0, prefinished: true, errorEmitted: false, emitClose: false, autoDestroy: false, errored: null, closed: true, closeEmitted: false }, allowHalfOpen: true, on: [Function: socketListenerWrap], _sockname: null, _pendingData: null, _pendingEncoding: '', server: Server { maxHeaderSize: undefined, insecureHTTPParser: undefined, _events: [Object: null prototype], _eventsCount: 4, _maxListeners: undefined, _connections: 0, _handle: [TCP], _usingWorkers: false, _workers: [], _unref: false, allowHalfOpen: true, pauseOnConnect: false, httpAllowHalfOpen: false, timeout: 360000, keepAliveTimeout: 5000, maxHeadersCount: null, headersTimeout: 60000, requestTimeout: 0, _connectionKey: '4:127.0.0.1:40501', [Symbol(IncomingMessage)]: [Function: IncomingMessage], [Symbol(ServerResponse)]: [Function: ServerResponse], [Symbol(kCapture)]: false, [Symbol(async_id_symbol)]: 14 }, _server: Server { maxHeaderSize: undefined, insecureHTTPParser: undefined, _events: [Object: null prototype], _eventsCount: 4, _maxListeners: undefined, _connections: 0, _handle: [TCP], _usingWorkers: false, _workers: [], _unref: false, allowHalfOpen: true, pauseOnConnect: false, httpAllowHalfOpen: false, timeout: 360000, keepAliveTimeout: 5000, maxHeadersCount: null, headersTimeout: 60000, requestTimeout: 0, _connectionKey: '4:127.0.0.1:40501', [Symbol(IncomingMessage)]: [Function: IncomingMessage], [Symbol(ServerResponse)]: [Function: ServerResponse], [Symbol(kCapture)]: false, [Symbol(async_id_symbol)]: 14 }, timeout: 360000, parser: null, addListener: [Function: socketListenerWrap], prependListener: [Function: socketListenerWrap], _paused: false, _httpMessage: null, [Symbol(async_id_symbol)]: 23, [Symbol(kHandle)]: null, [Symbol(kSetNoDelay)]: false, [Symbol(lastWriteQueueSize)]: 0, [Symbol(timeout)]: Timeout { _idleTimeout: -1, _idlePrev: null, _idleNext: null, _idleStart: 454, _onTimeout: null, _timerArgs: undefined, _repeat: null, _destroyed: true, [Symbol(refed)]: false, [Symbol(kHasPrimitive)]: false, [Symbol(asyncId)]: 24, [Symbol(triggerId)]: 23 }, [Symbol(kBuffer)]: null, [Symbol(kBufferCb)]: null, [Symbol(kBufferGen)]: null, [Symbol(kCapture)]: false, [Symbol(kBytesRead)]: 1574, [Symbol(kBytesWritten)]: 94, [Symbol(RequestTimeout)]: undefined }, _consuming: false, _dumped: true, unsafe_getReqSession: [Function (anonymous)], getReqSession: [Function (anonymous)], unsafe_getSession: [Function (anonymous)], getSession: [Function (anonymous)], unsafe_getFrames: [Function (anonymous)], getFrames: [Function (anonymous)], originalReq: { clientIp: '127.0.0.1', id: '1667703724025-634', isH2: false, isHttp2: false, existsCustomCert: false, isUIRequest: false, enableCapture: false, isFromPlugin: false, ruleValue: 'function fields(reqBody) {\n' + ' return {\n' + ' eventCode:reqBody.events[0].eventCode,\n' + ' pageId: reqBody.events[0].mapValue.pageId,\n' + " '业务': reqBody.events[0].mapValue.bizId,\n" + ' }\n' + '}', ruleUrl: 'data-checker://{script.js}', pipeValue: '', sniValue: '', hostValue: '', extraUrl: '', fullUrl: 'https://otheve.beacon.qq.com/analytics/v2_upload?appkey=0WEB04LNRZ4FG0JE', url: 'https://otheve.beacon.qq.com/analytics/v2_upload?appkey=0WEB04LNRZ4FG0JE', isHttps: true, remoteAddress: '127.0.0.1', remotePort: 62038, fromTunnel: true, isRegExp: true, isRexExp: true, pattern: '^**/analytics/v2_upload***', fromComposer: false, serverName: '', servername: '', certCacheName: '', certCacheTime: 0, isSNI: true, useSNI: true, commonName: '', realUrl: 'https://otheve.beacon.qq.com/analytics/v2_upload?appkey=0WEB04LNRZ4FG0JE', relativeUrl: '', method: 'POST', clientPort: '62038', globalValue: '', proxyValue: '', pacValue: '', pluginVars: [], globalPluginVars: [], headers: { host: 'otheve.beacon.qq.com', 'sec-ch-ua': '"Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"', accept: 'application/json, text/plain, */*', 'content-type': 'application/json;charset=utf-8', dnt: '1', 'sec-ch-ua-mobile': '?0', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36', 'sec-ch-ua-platform': '"macOS"', origin: 'https://yobang.tencentmusic.com', 'sec-fetch-site': 'cross-site', 'sec-fetch-mode': 'cors', 'sec-fetch-dest': 'empty', referer: 'https://yobang.tencentmusic.com/', 'accept-encoding': 'gzip', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', 'x-forwarded-for': '127.0.0.1', connection: 'close' } }, originalRes: { serverIp: '', statusCode: '' }, localStorage: Storage { recycleBin: RecycleBin { _dir: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker/.recycle_bin', _list: [], _map: {} }, _disabled: false, _backupDir: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker/.backup', _files: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker/files', _properties: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker/properties', _backupProps: '/Users/aidenmo/.WhistleAppData/.whistle/.plugins/whistle.data-checker/.backup/properties', _cache: { maxIndex: -1, files: {}, properties: [Object] } }, Storage: [Function: Storage], clientIp: '127.0.0.1', sessionStorage: { set: [Function: set], get: [Function: get], remove: [Function: remove] }, isUIRequest: false, fullUrl: 'https://otheve.beacon.qq.com/analytics/v2_upload?appkey=0WEB04LNRZ4FG0JE', isHttps: true, fromTunnel: true, fromComposer: false, isSNI: true, useSNI: true, [Symbol(kCapture)]: false, [Symbol(RequestTimeout)]: undefined, [Symbol()]: '1667703724025-634', [Symbol()]: { useH2: false, startTime: 1667703724282, id: '1667703724025-634', url: 'https://otheve.beacon.qq.com/analytics/v2_upload?appkey=0WEB04LNRZ4FG0JE', req: { method: 'POST', httpVersion: '1.1', ip: '127.0.0.1', port: '62038', rawHeaderNames: [Object], headers: [Object], size: 837, body: [Getter], base64: '#body#eyJhcHBWZXJzaW9uIjoiODMxOTZiMWUiLCJzZGtJZCI6ImpzIiwic2RrVmVyc2lvbiI6IjQuNS4xMC13ZWIiLCJtYWluQXBwS2V5IjoiMFdFQjA0TE5SWjRGRzBKRSIsInBsYXRmb3JtSWQiOjMsImNvbW1vbiI6eyJBMiI6IjNjNjM1OWU3OGNlMzlkOGIxM2Q1MTk2ZTM4OWNkN2RmIiwiQTgiOiIiLCJBMTIiOiJ6aC1DTiIsIkExNyI6IjE3OTIqMTEyMCoyIiwiQTIzIjoid2ViIiwiQTUwIjoiIiwiQTc2IjoiMFdFQjA0TE5SWjRGRzBKRV8xNjY3NzAzNzIzNTA4IiwiQTEwMSI6Ik1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMDcuMC4wLjAgU2FmYXJpLzUzNy4zNiIsIkExMDIiOiJodHRwczovL3lvYmFuZy50ZW5jZW50bXVzaWMuY29tL2NoYXJ0L3VuaS1jaGFydC9yYW5rTGlzdC8iLCJBMTA0IjoiaHR0cHM6Ly90bWVzaXQudGVuY2VudG11c2ljLmNvbS8iLCJBMTE5IjoiIiwiQTE1MyI6IiJ9LCJldmVudHMiOlt7ImV2ZW50Q29kZSI6InZpZXciLCJldmVudFRpbWUiOiIxNjY3NzAzNzIzNjE5IiwibWFwVmFsdWUiOnsiYml6SWQiOiJ1bmkiLCJwYWdlSWQiOiJ1bmlfcmFua19saXN0X2R5bmFtaWMiLCJzb3VyY2UiOiIiLCJlbnYiOiJwcm8iLCJiaXpOYW1lIjoi55Sx5L2g5qacIiwicGFnZU5hbWUiOiLnlLHkvaDmppzlrp7ml7bmppwiLCJibG9ja05hbWUiOiIiLCJibG9ja0lkIjoiIiwiZGF0YUlkIjoiIiwiYWNjb3VudElkIjoiIiwiQTk5IjoiWSIsIkExMDAiOiI2ODkiLCJBNzIiOiI0LjUuMTAtd2ViIiwiQTg4IjoiMTY2MTA3MjYxNjc2NSJ9fV19' }, res: { ip: '109.244.236.105', port: 443 }, rules: { rule: [Object], _pluginRule: [Object] }, rulesHeaders: {}, version: '2.9.33', nodeVersion: '14.18.0', dnsTime: 1667703724282, requestTime: 1667703724648 } } ```