patchright-core 1.51.3 → 1.52.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browsers.json +15 -13
- package/lib/androidServerImpl.js +42 -48
- package/lib/browserServerImpl.js +54 -67
- package/lib/cli/driver.js +71 -69
- package/lib/cli/program.js +312 -328
- package/lib/cli/programWithTestStub.js +51 -45
- package/lib/client/accessibility.js +31 -32
- package/lib/client/android.js +141 -228
- package/lib/client/api.js +135 -283
- package/lib/client/artifact.js +39 -36
- package/lib/client/browser.js +57 -61
- package/lib/client/browserContext.js +297 -326
- package/lib/client/browserType.js +92 -106
- package/lib/client/cdpSession.js +29 -31
- package/lib/client/channelOwner.js +82 -95
- package/lib/client/clientHelper.js +46 -38
- package/lib/client/clientInstrumentation.js +40 -37
- package/lib/client/clientStackTrace.js +41 -37
- package/lib/client/clock.js +36 -36
- package/lib/client/connection.js +190 -212
- package/lib/client/consoleMessage.js +31 -28
- package/lib/client/coverage.js +25 -22
- package/lib/client/dialog.js +30 -31
- package/lib/client/download.js +25 -25
- package/lib/client/electron.js +73 -75
- package/lib/client/elementHandle.js +111 -147
- package/lib/client/errors.js +53 -53
- package/lib/client/eventEmitter.js +124 -121
- package/lib/client/events.js +72 -68
- package/lib/client/fetch.js +135 -158
- package/lib/client/fileChooser.js +25 -24
- package/lib/client/fileUtils.js +31 -28
- package/lib/client/frame.js +187 -306
- package/lib/client/harRouter.js +42 -52
- package/lib/client/input.js +40 -69
- package/lib/client/jsHandle.js +56 -71
- package/lib/client/jsonPipe.js +27 -23
- package/lib/client/localUtils.js +29 -28
- package/lib/client/locator.js +161 -245
- package/lib/client/network.js +277 -295
- package/lib/client/page.js +270 -318
- package/lib/client/platform.js +46 -43
- package/lib/client/playwright.js +51 -66
- package/lib/client/selectors.js +48 -46
- package/lib/client/stream.js +29 -25
- package/lib/client/timeoutSettings.js +49 -39
- package/lib/client/tracing.js +48 -84
- package/lib/client/types.js +26 -22
- package/lib/client/video.js +35 -27
- package/lib/client/waiter.js +69 -88
- package/lib/client/webError.js +25 -23
- package/lib/client/webSocket.js +61 -56
- package/lib/client/worker.js +48 -58
- package/lib/client/writableStream.js +27 -23
- package/lib/generated/clockSource.js +26 -5
- package/lib/generated/consoleApiSource.js +26 -5
- package/lib/generated/injectedScriptSource.js +26 -5
- package/lib/generated/pollingRecorderSource.js +26 -5
- package/lib/generated/utilityScriptSource.js +26 -5
- package/lib/generated/webSocketMockSource.js +371 -4
- package/lib/inProcessFactory.js +53 -53
- package/lib/inprocess.js +2 -19
- package/lib/outofprocess.js +53 -46
- package/lib/protocol/debug.js +209 -25
- package/lib/protocol/serializers.js +153 -134
- package/lib/protocol/validator.js +2714 -2714
- package/lib/protocol/validatorPrimitives.js +114 -73
- package/lib/remote/playwrightConnection.js +140 -157
- package/lib/remote/playwrightServer.js +99 -84
- package/lib/server/accessibility.js +44 -37
- package/lib/server/android/android.js +216 -209
- package/lib/server/android/backendAdb.js +89 -82
- package/lib/server/artifact.js +78 -55
- package/lib/server/bidi/bidiBrowser.js +221 -155
- package/lib/server/bidi/bidiChromium.js +106 -79
- package/lib/server/bidi/bidiConnection.js +66 -83
- package/lib/server/bidi/bidiExecutionContext.js +128 -113
- package/lib/server/bidi/bidiFirefox.js +76 -69
- package/lib/server/bidi/bidiInput.js +86 -97
- package/lib/server/bidi/bidiNetworkManager.js +137 -154
- package/lib/server/bidi/bidiOverCdp.js +57 -58
- package/lib/server/bidi/bidiPage.js +247 -219
- package/lib/server/bidi/bidiPdf.js +52 -86
- package/lib/server/bidi/third_party/bidiCommands.d.js +22 -0
- package/lib/server/bidi/third_party/bidiDeserializer.js +55 -50
- package/lib/server/bidi/third_party/bidiKeyboard.js +236 -220
- package/lib/server/bidi/third_party/bidiProtocol.js +144 -131
- package/lib/server/bidi/third_party/bidiSerializer.js +67 -63
- package/lib/server/bidi/third_party/firefoxPrefs.js +141 -119
- package/lib/server/browser.js +76 -84
- package/lib/server/browserContext.js +321 -346
- package/lib/server/browserType.js +169 -182
- package/lib/server/callLog.js +47 -44
- package/lib/server/chromium/chromium.js +212 -190
- package/lib/server/chromium/chromiumSwitches.js +86 -64
- package/lib/server/chromium/crAccessibility.js +157 -131
- package/lib/server/chromium/crBrowser.js +253 -273
- package/lib/server/chromium/crConnection.js +91 -116
- package/lib/server/chromium/crCoverage.js +113 -127
- package/lib/server/chromium/crDevTools.js +59 -51
- package/lib/server/chromium/crDragDrop.js +62 -79
- package/lib/server/chromium/crExecutionContext.js +88 -83
- package/lib/server/chromium/crInput.js +97 -95
- package/lib/server/chromium/crNetworkManager.js +284 -404
- package/lib/server/chromium/crPage.js +522 -608
- package/lib/server/chromium/crPdf.js +54 -86
- package/lib/server/chromium/crProtocolHelper.js +92 -80
- package/lib/server/chromium/crServiceWorker.js +82 -67
- package/lib/server/chromium/defaultFontFamilies.js +152 -135
- package/lib/server/chromium/protocol.d.js +16 -0
- package/lib/server/chromium/videoRecorder.js +65 -99
- package/lib/server/clock.js +62 -50
- package/lib/server/codegen/csharp.js +185 -160
- package/lib/server/codegen/java.js +155 -128
- package/lib/server/codegen/javascript.js +163 -148
- package/lib/server/codegen/jsonl.js +32 -28
- package/lib/server/codegen/language.js +75 -52
- package/lib/server/codegen/languages.js +65 -27
- package/lib/server/codegen/python.js +140 -125
- package/lib/server/codegen/types.js +15 -4
- package/lib/server/console.js +28 -32
- package/lib/server/cookieStore.js +105 -86
- package/lib/server/debugController.js +97 -124
- package/lib/server/debugger.js +82 -78
- package/lib/server/deviceDescriptors.js +37 -24
- package/lib/server/deviceDescriptorsSource.json +50 -50
- package/lib/server/dialog.js +36 -35
- package/lib/server/dispatchers/androidDispatcher.js +196 -107
- package/lib/server/dispatchers/artifactDispatcher.js +62 -62
- package/lib/server/dispatchers/browserContextDispatcher.js +176 -205
- package/lib/server/dispatchers/browserDispatcher.js +78 -97
- package/lib/server/dispatchers/browserTypeDispatcher.js +35 -35
- package/lib/server/dispatchers/cdpSessionDispatcher.js +32 -36
- package/lib/server/dispatchers/debugControllerDispatcher.js +48 -66
- package/lib/server/dispatchers/dialogDispatcher.js +30 -27
- package/lib/server/dispatchers/dispatcher.js +169 -220
- package/lib/server/dispatchers/electronDispatcher.js +54 -57
- package/lib/server/dispatchers/elementHandlerDispatcher.js +77 -119
- package/lib/server/dispatchers/frameDispatcher.js +99 -163
- package/lib/server/dispatchers/jsHandleDispatcher.js +49 -66
- package/lib/server/dispatchers/jsonPipeDispatcher.js +35 -36
- package/lib/server/dispatchers/localUtilsDispatcher.js +95 -80
- package/lib/server/dispatchers/networkDispatchers.js +90 -107
- package/lib/server/dispatchers/pageDispatcher.js +128 -169
- package/lib/server/dispatchers/playwrightDispatcher.js +69 -76
- package/lib/server/dispatchers/selectorsDispatcher.js +28 -24
- package/lib/server/dispatchers/streamDispatcher.js +42 -45
- package/lib/server/dispatchers/tracingDispatcher.js +36 -41
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +96 -131
- package/lib/server/dispatchers/writableStreamDispatcher.js +54 -38
- package/lib/server/dom.js +413 -443
- package/lib/server/download.js +45 -35
- package/lib/server/electron/electron.js +156 -176
- package/lib/server/electron/loader.js +8 -36
- package/lib/server/errors.js +47 -46
- package/lib/server/fetch.js +289 -323
- package/lib/server/fileChooser.js +25 -24
- package/lib/server/fileUploadUtils.js +65 -59
- package/lib/server/firefox/ffAccessibility.js +153 -131
- package/lib/server/firefox/ffBrowser.js +213 -277
- package/lib/server/firefox/ffConnection.js +63 -84
- package/lib/server/firefox/ffExecutionContext.js +91 -73
- package/lib/server/firefox/ffInput.js +67 -69
- package/lib/server/firefox/ffNetworkManager.js +131 -110
- package/lib/server/firefox/ffPage.js +236 -273
- package/lib/server/firefox/firefox.js +76 -67
- package/lib/server/firefox/protocol.d.js +16 -0
- package/lib/server/formData.js +107 -35
- package/lib/server/frameSelectors.js +221 -112
- package/lib/server/frames.js +731 -894
- package/lib/server/har/harRecorder.js +85 -77
- package/lib/server/har/harTracer.js +287 -222
- package/lib/server/harBackend.js +80 -80
- package/lib/server/helper.js +56 -59
- package/lib/server/index.js +59 -99
- package/lib/server/input.js +134 -163
- package/lib/server/instrumentation.js +49 -44
- package/lib/server/javascript.js +143 -134
- package/lib/server/launchApp.js +92 -73
- package/lib/server/localUtils.js +130 -122
- package/lib/server/macEditingCommands.js +141 -137
- package/lib/server/network.js +262 -296
- package/lib/server/page.js +326 -423
- package/lib/server/pageBinding.js +88 -0
- package/lib/server/pipeTransport.js +49 -45
- package/lib/server/playwright.js +60 -67
- package/lib/server/progress.js +56 -51
- package/lib/server/protocolError.js +34 -31
- package/lib/server/recorder/chat.js +70 -86
- package/lib/server/recorder/contextRecorder.js +134 -138
- package/lib/server/recorder/recorderApp.js +127 -136
- package/lib/server/recorder/recorderCollection.js +56 -44
- package/lib/server/recorder/recorderFrontend.js +15 -4
- package/lib/server/recorder/recorderRunner.js +79 -103
- package/lib/server/recorder/recorderUtils.js +56 -45
- package/lib/server/recorder/throttledFile.js +42 -30
- package/lib/server/recorder.js +177 -186
- package/lib/server/registry/browserFetcher.js +106 -101
- package/lib/server/registry/dependencies.js +245 -196
- package/lib/server/registry/index.js +904 -792
- package/lib/server/registry/nativeDeps.js +1073 -464
- package/lib/server/registry/oopDownloadBrowserMain.js +57 -75
- package/lib/server/screenshotter.js +166 -182
- package/lib/server/selectors.js +85 -46
- package/lib/server/socksClientCertificatesInterceptor.js +166 -185
- package/lib/server/socksInterceptor.js +62 -70
- package/lib/server/storageScript.js +94 -100
- package/lib/server/timeoutSettings.js +58 -43
- package/lib/server/trace/recorder/snapshotter.js +70 -89
- package/lib/server/trace/recorder/snapshotterInjected.js +238 -217
- package/lib/server/trace/recorder/tracing.js +321 -333
- package/lib/server/trace/test/inMemorySnapshotter.js +46 -52
- package/lib/server/trace/viewer/traceViewer.js +168 -146
- package/lib/server/transport.js +124 -133
- package/lib/server/types.js +26 -22
- package/lib/server/usKeyboardLayout.js +135 -545
- package/lib/server/utils/ascii.js +39 -26
- package/lib/server/utils/comparators.js +105 -103
- package/lib/server/utils/crypto.js +157 -112
- package/lib/server/utils/debug.js +37 -28
- package/lib/server/utils/debugLogger.js +69 -48
- package/lib/server/utils/env.js +52 -37
- package/lib/server/utils/eventsHelper.js +29 -28
- package/lib/server/utils/expectUtils.js +31 -26
- package/lib/server/utils/fileUtils.js +123 -136
- package/lib/server/utils/happyEyeballs.js +138 -123
- package/lib/server/utils/hostPlatform.js +84 -120
- package/lib/server/utils/httpServer.js +106 -121
- package/lib/server/utils/image_tools/colorUtils.js +42 -51
- package/lib/server/utils/image_tools/compare.js +44 -43
- package/lib/server/utils/image_tools/imageChannel.js +38 -30
- package/lib/server/utils/image_tools/stats.js +40 -40
- package/lib/server/utils/linuxUtils.js +50 -37
- package/lib/server/utils/network.js +143 -86
- package/lib/server/utils/nodePlatform.js +87 -79
- package/lib/server/utils/pipeTransport.js +44 -42
- package/lib/server/utils/processLauncher.js +111 -121
- package/lib/server/utils/profiler.js +52 -39
- package/lib/server/utils/socksProxy.js +280 -339
- package/lib/server/utils/spawnAsync.js +37 -41
- package/lib/server/utils/task.js +31 -38
- package/lib/server/utils/userAgent.js +73 -66
- package/lib/server/utils/wsServer.js +73 -69
- package/lib/server/utils/zipFile.js +36 -37
- package/lib/server/utils/zones.js +37 -34
- package/lib/server/webkit/protocol.d.js +16 -0
- package/lib/server/webkit/webkit.js +76 -63
- package/lib/server/webkit/wkAccessibility.js +161 -118
- package/lib/server/webkit/wkBrowser.js +159 -176
- package/lib/server/webkit/wkConnection.js +59 -83
- package/lib/server/webkit/wkExecutionContext.js +84 -70
- package/lib/server/webkit/wkInput.js +82 -80
- package/lib/server/webkit/wkInterceptableRequest.js +102 -95
- package/lib/server/webkit/wkPage.js +525 -619
- package/lib/server/webkit/wkProvisionalPage.js +45 -56
- package/lib/server/webkit/wkWorkers.js +77 -77
- package/lib/utils/isomorphic/ariaSnapshot.js +144 -152
- package/lib/utils/isomorphic/assert.js +28 -22
- package/lib/utils/isomorphic/builtins.js +86 -0
- package/lib/utils/isomorphic/colors.js +66 -59
- package/lib/utils/isomorphic/cssParser.js +121 -125
- package/lib/utils/isomorphic/cssTokenizer.js +436 -364
- package/lib/utils/isomorphic/headers.js +38 -37
- package/lib/utils/isomorphic/locatorGenerators.js +340 -357
- package/lib/utils/isomorphic/locatorParser.js +96 -105
- package/lib/utils/isomorphic/locatorUtils.js +63 -44
- package/lib/utils/isomorphic/manualPromise.js +47 -39
- package/lib/utils/isomorphic/mimeType.js +448 -25
- package/lib/utils/isomorphic/multimap.js +35 -27
- package/lib/utils/isomorphic/rtti.js +35 -33
- package/lib/utils/isomorphic/selectorParser.js +183 -193
- package/lib/utils/isomorphic/semaphore.js +27 -24
- package/lib/utils/isomorphic/stackTrace.js +87 -98
- package/lib/utils/isomorphic/stringUtils.js +113 -106
- package/lib/utils/isomorphic/time.js +41 -22
- package/lib/utils/isomorphic/timeoutRunner.js +55 -54
- package/lib/utils/isomorphic/traceUtils.js +38 -41
- package/lib/utils/isomorphic/types.js +15 -4
- package/lib/utils/isomorphic/urlMatch.js +112 -67
- package/lib/utils/isomorphic/utilityScriptSerializers.js +248 -0
- package/lib/utils.js +97 -443
- package/lib/utilsBundle.js +101 -52
- package/lib/vite/htmlReport/index.html +21 -15
- package/lib/vite/recorder/assets/{codeMirrorModule-B9YMkrwa.js → codeMirrorModule-CXVeovup.js} +1 -1
- package/lib/vite/recorder/assets/index-BsWQsSGl.js +184 -0
- package/lib/vite/recorder/index.html +1 -1
- package/lib/vite/traceViewer/assets/{codeMirrorModule-1DiydmYA.js → codeMirrorModule-_GLjJL-7.js} +1 -1
- package/lib/vite/traceViewer/assets/defaultSettingsView-DtCQiGHe.js +265 -0
- package/lib/vite/traceViewer/{defaultSettingsView.5fN5lw10.css → defaultSettingsView.QdHITyLI.css} +1 -1
- package/lib/vite/traceViewer/index.cFZzK9RN.js +2 -0
- package/lib/vite/traceViewer/index.html +3 -3
- package/lib/vite/traceViewer/sw.bundle.js +3 -3
- package/lib/vite/traceViewer/uiMode.XVPIqBeS.js +5 -0
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/lib/zipBundle.js +32 -23
- package/package.json +1 -1
- package/types/protocol.d.ts +436 -17
- package/types/types.d.ts +35 -16
- package/lib/server/isomorphic/utilityScriptSerializers.js +0 -229
- package/lib/vite/recorder/assets/index-ELPgmkwA.js +0 -184
- package/lib/vite/traceViewer/assets/defaultSettingsView-l0TyP_G8.js +0 -259
- package/lib/vite/traceViewer/index.BqUZLSro.js +0 -2
- package/lib/vite/traceViewer/uiMode.C1d2m5sF.js +0 -5
|
@@ -1,81 +1,116 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty
|
|
4
|
-
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var crNetworkManager_exports = {};
|
|
30
|
+
__export(crNetworkManager_exports, {
|
|
31
|
+
CRNetworkManager: () => CRNetworkManager
|
|
5
32
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var network =
|
|
12
|
-
var
|
|
13
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
14
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
15
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
-
// undetected-undetected_playwright-patch - custom imports
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Copyright 2017 Google Inc. All rights reserved.
|
|
20
|
-
* Modifications copyright (c) Microsoft Corporation.
|
|
21
|
-
*
|
|
22
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
23
|
-
* you may not use this file except in compliance with the License.
|
|
24
|
-
* You may obtain a copy of the License at
|
|
25
|
-
*
|
|
26
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
27
|
-
*
|
|
28
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
29
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
30
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
31
|
-
* See the License for the specific language governing permissions and
|
|
32
|
-
* limitations under the License.
|
|
33
|
-
*/
|
|
34
|
-
|
|
33
|
+
module.exports = __toCommonJS(crNetworkManager_exports);
|
|
34
|
+
var import_crypto = __toESM(require("crypto"));
|
|
35
|
+
var import_utils = require("../../utils");
|
|
36
|
+
var import_eventsHelper = require("../utils/eventsHelper");
|
|
37
|
+
var import_helper = require("../helper");
|
|
38
|
+
var network = __toESM(require("../network"));
|
|
39
|
+
var import_protocolError = require("../protocolError");
|
|
35
40
|
class CRNetworkManager {
|
|
36
41
|
constructor(page, serviceWorker) {
|
|
37
|
-
this.
|
|
38
|
-
this.
|
|
39
|
-
this._requestIdToRequest = new Map();
|
|
40
|
-
this._requestIdToRequestWillBeSentEvent = new Map();
|
|
42
|
+
this._requestIdToRequest = /* @__PURE__ */ new Map();
|
|
43
|
+
this._requestIdToRequestWillBeSentEvent = /* @__PURE__ */ new Map();
|
|
41
44
|
this._credentials = null;
|
|
42
|
-
this._attemptedAuthentications = new Set();
|
|
45
|
+
this._attemptedAuthentications = /* @__PURE__ */ new Set();
|
|
43
46
|
this._userRequestInterceptionEnabled = false;
|
|
44
47
|
this._protocolRequestInterceptionEnabled = false;
|
|
45
48
|
this._offline = false;
|
|
46
49
|
this._extraHTTPHeaders = [];
|
|
47
|
-
this._requestIdToRequestPausedEvent = new Map();
|
|
50
|
+
this._requestIdToRequestPausedEvent = /* @__PURE__ */ new Map();
|
|
48
51
|
this._responseExtraInfoTracker = new ResponseExtraInfoTracker();
|
|
49
|
-
this._sessions = new Map();
|
|
50
|
-
this._alreadyTrackedNetworkIds = new Set();
|
|
52
|
+
this._sessions = /* @__PURE__ */ new Map();
|
|
53
|
+
this._alreadyTrackedNetworkIds = /* @__PURE__ */ new Set();
|
|
51
54
|
this._page = page;
|
|
52
55
|
this._serviceWorker = serviceWorker;
|
|
53
56
|
}
|
|
54
57
|
async addSession(session, workerFrame, isMain) {
|
|
55
|
-
const sessionInfo = {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
const sessionInfo = { session, isMain, workerFrame, eventListeners: [] };
|
|
59
|
+
sessionInfo.eventListeners = [
|
|
60
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Fetch.requestPaused", this._onRequestPaused.bind(this, sessionInfo)),
|
|
61
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Fetch.authRequired", this._onAuthRequired.bind(this, sessionInfo)),
|
|
62
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Network.requestWillBeSent", this._onRequestWillBeSent.bind(this, sessionInfo)),
|
|
63
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Network.requestWillBeSentExtraInfo", this._onRequestWillBeSentExtraInfo.bind(this)),
|
|
64
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Network.requestServedFromCache", this._onRequestServedFromCache.bind(this)),
|
|
65
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Network.responseReceived", this._onResponseReceived.bind(this, sessionInfo)),
|
|
66
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Network.responseReceivedExtraInfo", this._onResponseReceivedExtraInfo.bind(this)),
|
|
67
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Network.loadingFinished", this._onLoadingFinished.bind(this, sessionInfo)),
|
|
68
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Network.loadingFailed", this._onLoadingFailed.bind(this, sessionInfo))
|
|
69
|
+
];
|
|
62
70
|
if (this._page) {
|
|
63
|
-
sessionInfo.eventListeners.push(...[
|
|
71
|
+
sessionInfo.eventListeners.push(...[
|
|
72
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketCreated", (e) => this._page._frameManager.onWebSocketCreated(e.requestId, e.url)),
|
|
73
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketWillSendHandshakeRequest", (e) => this._page._frameManager.onWebSocketRequest(e.requestId)),
|
|
74
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketHandshakeResponseReceived", (e) => this._page._frameManager.onWebSocketResponse(e.requestId, e.response.status, e.response.statusText)),
|
|
75
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketFrameSent", (e) => e.response.payloadData && this._page._frameManager.onWebSocketFrameSent(e.requestId, e.response.opcode, e.response.payloadData)),
|
|
76
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketFrameReceived", (e) => e.response.payloadData && this._page._frameManager.webSocketFrameReceived(e.requestId, e.response.opcode, e.response.payloadData)),
|
|
77
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketClosed", (e) => this._page._frameManager.webSocketClosed(e.requestId)),
|
|
78
|
+
import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketFrameError", (e) => this._page._frameManager.webSocketError(e.requestId, e.errorMessage))
|
|
79
|
+
]);
|
|
64
80
|
}
|
|
65
81
|
this._sessions.set(session, sessionInfo);
|
|
66
|
-
await Promise.all([
|
|
82
|
+
await Promise.all([
|
|
83
|
+
session.send("Network.enable"),
|
|
84
|
+
this._updateProtocolRequestInterceptionForSession(
|
|
85
|
+
sessionInfo,
|
|
86
|
+
true
|
|
87
|
+
/* initial */
|
|
88
|
+
),
|
|
89
|
+
this._setOfflineForSession(
|
|
90
|
+
sessionInfo,
|
|
91
|
+
true
|
|
92
|
+
/* initial */
|
|
93
|
+
),
|
|
94
|
+
this._setExtraHTTPHeadersForSession(
|
|
95
|
+
sessionInfo,
|
|
96
|
+
true
|
|
97
|
+
/* initial */
|
|
98
|
+
)
|
|
99
|
+
]);
|
|
67
100
|
}
|
|
68
101
|
removeSession(session) {
|
|
69
102
|
const info = this._sessions.get(session);
|
|
70
|
-
if (info)
|
|
103
|
+
if (info)
|
|
104
|
+
import_eventsHelper.eventsHelper.removeEventListeners(info.eventListeners);
|
|
71
105
|
this._sessions.delete(session);
|
|
72
106
|
}
|
|
73
107
|
async _forEachSession(cb) {
|
|
74
|
-
await Promise.all([...this._sessions.values()].map(info => {
|
|
75
|
-
if (info.isMain)
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if ((0,
|
|
108
|
+
await Promise.all([...this._sessions.values()].map((info) => {
|
|
109
|
+
if (info.isMain)
|
|
110
|
+
return cb(info);
|
|
111
|
+
return cb(info).catch((e) => {
|
|
112
|
+
if ((0, import_protocolError.isSessionClosedError)(e))
|
|
113
|
+
return;
|
|
79
114
|
throw e;
|
|
80
115
|
});
|
|
81
116
|
}));
|
|
@@ -85,15 +120,17 @@ class CRNetworkManager {
|
|
|
85
120
|
await this._updateProtocolRequestInterception();
|
|
86
121
|
}
|
|
87
122
|
async setOffline(offline) {
|
|
88
|
-
if (offline === this._offline)
|
|
123
|
+
if (offline === this._offline)
|
|
124
|
+
return;
|
|
89
125
|
this._offline = offline;
|
|
90
|
-
await this._forEachSession(info => this._setOfflineForSession(info));
|
|
126
|
+
await this._forEachSession((info) => this._setOfflineForSession(info));
|
|
91
127
|
}
|
|
92
128
|
async _setOfflineForSession(info, initial) {
|
|
93
|
-
if (initial && !this._offline)
|
|
94
|
-
|
|
95
|
-
if (info.workerFrame)
|
|
96
|
-
|
|
129
|
+
if (initial && !this._offline)
|
|
130
|
+
return;
|
|
131
|
+
if (info.workerFrame)
|
|
132
|
+
return;
|
|
133
|
+
await info.session.send("Network.emulateNetworkConditions", {
|
|
97
134
|
offline: this._offline,
|
|
98
135
|
// values of 0 remove any active throttling. crbug.com/456324#c9
|
|
99
136
|
latency: 0,
|
|
@@ -107,67 +144,61 @@ class CRNetworkManager {
|
|
|
107
144
|
}
|
|
108
145
|
async _updateProtocolRequestInterception() {
|
|
109
146
|
const enabled = this._userRequestInterceptionEnabled || !!this._credentials;
|
|
110
|
-
if (enabled === this._protocolRequestInterceptionEnabled)
|
|
147
|
+
if (enabled === this._protocolRequestInterceptionEnabled)
|
|
148
|
+
return;
|
|
111
149
|
this._protocolRequestInterceptionEnabled = enabled;
|
|
112
|
-
await this._forEachSession(info => this._updateProtocolRequestInterceptionForSession(info));
|
|
150
|
+
await this._forEachSession((info) => this._updateProtocolRequestInterceptionForSession(info));
|
|
113
151
|
}
|
|
114
152
|
async _updateProtocolRequestInterceptionForSession(info, initial) {
|
|
115
153
|
const enabled = this._protocolRequestInterceptionEnabled;
|
|
116
|
-
if (initial && !enabled)
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
let fetchPromise = Promise.resolve(undefined);
|
|
154
|
+
if (initial && !enabled)
|
|
155
|
+
return;
|
|
156
|
+
const cachePromise = info.session.send("Network.setCacheDisabled", { cacheDisabled: false });
|
|
157
|
+
let fetchPromise = Promise.resolve(void 0);
|
|
121
158
|
if (!info.workerFrame) {
|
|
122
|
-
if (enabled)
|
|
123
|
-
handleAuthRequests: true,
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
requestStage: 'Request'
|
|
127
|
-
}]
|
|
128
|
-
});else fetchPromise = info.session.send('Fetch.disable');
|
|
159
|
+
if (enabled)
|
|
160
|
+
fetchPromise = info.session.send("Fetch.enable", { handleAuthRequests: true, patterns: [{ urlPattern: "*", requestStage: "Request" }] });
|
|
161
|
+
else
|
|
162
|
+
fetchPromise = info.session.send("Fetch.disable");
|
|
129
163
|
}
|
|
130
164
|
await Promise.all([cachePromise, fetchPromise]);
|
|
131
165
|
}
|
|
132
166
|
async setExtraHTTPHeaders(extraHTTPHeaders) {
|
|
133
|
-
if (!this._extraHTTPHeaders.length && !extraHTTPHeaders.length)
|
|
167
|
+
if (!this._extraHTTPHeaders.length && !extraHTTPHeaders.length)
|
|
168
|
+
return;
|
|
134
169
|
this._extraHTTPHeaders = extraHTTPHeaders;
|
|
135
|
-
await this._forEachSession(info => this._setExtraHTTPHeadersForSession(info));
|
|
170
|
+
await this._forEachSession((info) => this._setExtraHTTPHeadersForSession(info));
|
|
136
171
|
}
|
|
137
172
|
async _setExtraHTTPHeadersForSession(info, initial) {
|
|
138
|
-
if (initial && !this._extraHTTPHeaders.length)
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
173
|
+
if (initial && !this._extraHTTPHeaders.length)
|
|
174
|
+
return;
|
|
175
|
+
await info.session.send("Network.setExtraHTTPHeaders", { headers: (0, import_utils.headersArrayToObject)(
|
|
176
|
+
this._extraHTTPHeaders,
|
|
177
|
+
false
|
|
178
|
+
/* lowerCase */
|
|
179
|
+
) });
|
|
142
180
|
}
|
|
143
181
|
async clearCache() {
|
|
144
|
-
await this._forEachSession(async info => {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
cacheDisabled:
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
cacheDisabled: false
|
|
151
|
-
});
|
|
152
|
-
if (!info.workerFrame) await info.session.send('Network.clearBrowserCache');
|
|
182
|
+
await this._forEachSession(async (info) => {
|
|
183
|
+
await info.session.send("Network.setCacheDisabled", { cacheDisabled: true });
|
|
184
|
+
if (!this._protocolRequestInterceptionEnabled)
|
|
185
|
+
await info.session.send("Network.setCacheDisabled", { cacheDisabled: false });
|
|
186
|
+
if (!info.workerFrame)
|
|
187
|
+
await info.session.send("Network.clearBrowserCache");
|
|
153
188
|
});
|
|
154
189
|
}
|
|
155
190
|
_onRequestWillBeSent(sessionInfo, event) {
|
|
156
|
-
|
|
157
|
-
if (this._protocolRequestInterceptionEnabled && !event.request.url.startsWith('data:')) {
|
|
191
|
+
if (this._protocolRequestInterceptionEnabled && !event.request.url.startsWith("data:")) {
|
|
158
192
|
const requestId = event.requestId;
|
|
159
193
|
const requestPausedEvent = this._requestIdToRequestPausedEvent.get(requestId);
|
|
160
194
|
if (requestPausedEvent) {
|
|
161
195
|
this._onRequest(sessionInfo, event, requestPausedEvent.sessionInfo, requestPausedEvent.event);
|
|
162
196
|
this._requestIdToRequestPausedEvent.delete(requestId);
|
|
163
197
|
} else {
|
|
164
|
-
this._requestIdToRequestWillBeSentEvent.set(event.requestId, {
|
|
165
|
-
sessionInfo,
|
|
166
|
-
event
|
|
167
|
-
});
|
|
198
|
+
this._requestIdToRequestWillBeSentEvent.set(event.requestId, { sessionInfo, event });
|
|
168
199
|
}
|
|
169
200
|
} else {
|
|
170
|
-
this._onRequest(sessionInfo, event,
|
|
201
|
+
this._onRequest(sessionInfo, event, void 0, void 0);
|
|
171
202
|
}
|
|
172
203
|
}
|
|
173
204
|
_onRequestServedFromCache(event) {
|
|
@@ -177,159 +208,105 @@ class CRNetworkManager {
|
|
|
177
208
|
this._responseExtraInfoTracker.requestWillBeSentExtraInfo(event);
|
|
178
209
|
}
|
|
179
210
|
_onAuthRequired(sessionInfo, event) {
|
|
180
|
-
let response =
|
|
211
|
+
let response = "Default";
|
|
181
212
|
const shouldProvideCredentials = this._shouldProvideCredentials(event.request.url);
|
|
182
213
|
if (this._attemptedAuthentications.has(event.requestId)) {
|
|
183
|
-
response =
|
|
214
|
+
response = "CancelAuth";
|
|
184
215
|
} else if (shouldProvideCredentials) {
|
|
185
|
-
response =
|
|
216
|
+
response = "ProvideCredentials";
|
|
186
217
|
this._attemptedAuthentications.add(event.requestId);
|
|
187
218
|
}
|
|
188
|
-
const {
|
|
189
|
-
|
|
190
|
-
password
|
|
191
|
-
} = shouldProvideCredentials && this._credentials ? this._credentials : {
|
|
192
|
-
username: undefined,
|
|
193
|
-
password: undefined
|
|
194
|
-
};
|
|
195
|
-
sessionInfo.session._sendMayFail('Fetch.continueWithAuth', {
|
|
219
|
+
const { username, password } = shouldProvideCredentials && this._credentials ? this._credentials : { username: void 0, password: void 0 };
|
|
220
|
+
sessionInfo.session._sendMayFail("Fetch.continueWithAuth", {
|
|
196
221
|
requestId: event.requestId,
|
|
197
|
-
authChallengeResponse: {
|
|
198
|
-
response,
|
|
199
|
-
username,
|
|
200
|
-
password
|
|
201
|
-
}
|
|
222
|
+
authChallengeResponse: { response, username, password }
|
|
202
223
|
});
|
|
203
224
|
}
|
|
204
225
|
_shouldProvideCredentials(url) {
|
|
205
|
-
if (!this._credentials)
|
|
226
|
+
if (!this._credentials)
|
|
227
|
+
return false;
|
|
206
228
|
return !this._credentials.origin || new URL(url).origin.toLowerCase() === this._credentials.origin.toLowerCase();
|
|
207
229
|
}
|
|
208
230
|
_onRequestPaused(sessionInfo, event) {
|
|
209
231
|
if (this._alreadyTrackedNetworkIds.has(event.networkId)) return;
|
|
210
232
|
if (!event.networkId) {
|
|
211
|
-
|
|
212
|
-
// it will never receive Network.requestWillBeSent. Continue the request to not affect it.
|
|
213
|
-
sessionInfo.session._sendMayFail('Fetch.continueRequest', {
|
|
214
|
-
requestId: event.requestId
|
|
215
|
-
});
|
|
233
|
+
sessionInfo.session._sendMayFail("Fetch.continueRequest", { requestId: event.requestId });
|
|
216
234
|
return;
|
|
217
235
|
}
|
|
218
|
-
if (event.request.url.startsWith(
|
|
236
|
+
if (event.request.url.startsWith("data:"))
|
|
237
|
+
return;
|
|
219
238
|
const requestId = event.networkId;
|
|
220
239
|
const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(requestId);
|
|
221
240
|
if (requestWillBeSentEvent) {
|
|
222
241
|
this._onRequest(requestWillBeSentEvent.sessionInfo, requestWillBeSentEvent.event, sessionInfo, event);
|
|
223
242
|
this._requestIdToRequestWillBeSentEvent.delete(requestId);
|
|
224
243
|
} else {
|
|
225
|
-
var _existingRequest$_rou;
|
|
226
244
|
const existingRequest = this._requestIdToRequest.get(requestId);
|
|
227
|
-
const alreadyContinuedParams = existingRequest
|
|
245
|
+
const alreadyContinuedParams = existingRequest?._route?._alreadyContinuedParams;
|
|
228
246
|
if (alreadyContinuedParams && !event.redirectedRequestId) {
|
|
229
|
-
|
|
230
|
-
// For example, when no-cors request hits a "less public address space", it should be resent with cors.
|
|
231
|
-
// There are some more examples here: https://source.chromium.org/chromium/chromium/src/+/main:services/network/url_loader.cc;l=1205-1234;drc=d5dd931e0ad3d9ffe74888ec62a3cc106efd7ea6
|
|
232
|
-
// There are probably even more cases deep inside the network stack.
|
|
233
|
-
//
|
|
234
|
-
// Anyway, in this case, continue the request in the same way as before, and it should go through.
|
|
235
|
-
//
|
|
236
|
-
// Note: make sure not to prematurely continue the redirect, which shares the
|
|
237
|
-
// `networkId` between the original request and the redirect.
|
|
238
|
-
sessionInfo.session._sendMayFail('Fetch.continueRequest', {
|
|
247
|
+
sessionInfo.session._sendMayFail("Fetch.continueRequest", {
|
|
239
248
|
...alreadyContinuedParams,
|
|
240
249
|
requestId: event.requestId
|
|
241
250
|
});
|
|
242
251
|
return;
|
|
243
252
|
}
|
|
244
|
-
this._requestIdToRequestPausedEvent.set(requestId, {
|
|
245
|
-
sessionInfo,
|
|
246
|
-
event
|
|
247
|
-
});
|
|
253
|
+
this._requestIdToRequestPausedEvent.set(requestId, { sessionInfo, event });
|
|
248
254
|
}
|
|
249
255
|
}
|
|
250
256
|
_onRequest(requestWillBeSentSessionInfo, requestWillBeSentEvent, requestPausedSessionInfo, requestPausedEvent) {
|
|
251
|
-
var _this$_page, _this$_page2, _this$_page3;
|
|
252
257
|
if (this._alreadyTrackedNetworkIds.has(requestWillBeSentEvent.initiator.requestId)) return;
|
|
253
|
-
if (requestWillBeSentEvent.request.url.startsWith(
|
|
258
|
+
if (requestWillBeSentEvent.request.url.startsWith("data:"))
|
|
259
|
+
return;
|
|
254
260
|
let redirectedFrom = null;
|
|
255
261
|
if (requestWillBeSentEvent.redirectResponse) {
|
|
256
|
-
const
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
redirectedFrom = request;
|
|
262
|
+
const request2 = this._requestIdToRequest.get(requestWillBeSentEvent.requestId);
|
|
263
|
+
if (request2) {
|
|
264
|
+
this._handleRequestRedirect(request2, requestWillBeSentEvent.redirectResponse, requestWillBeSentEvent.timestamp, requestWillBeSentEvent.redirectHasExtraInfo);
|
|
265
|
+
redirectedFrom = request2;
|
|
261
266
|
}
|
|
262
267
|
}
|
|
263
|
-
let frame = requestWillBeSentEvent.frameId ?
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
if (!frame && this._page && requestPausedEvent && requestPausedEvent.frameId) frame = this._page._frameManager.frame(requestPausedEvent.frameId);
|
|
268
|
-
|
|
269
|
-
// Check if it's main resource request interception (targetId === main frame id).
|
|
270
|
-
if (!frame && this._page && requestWillBeSentEvent.frameId === ((_this$_page2 = this._page) === null || _this$_page2 === void 0 ? void 0 : _this$_page2._delegate)._targetId) {
|
|
271
|
-
// Main resource request for the page is being intercepted so the Frame is not created
|
|
272
|
-
// yet. Precreate it here for the purposes of request interception. It will be updated
|
|
273
|
-
// later as soon as the request continues and we receive frame tree from the page.
|
|
268
|
+
let frame = requestWillBeSentEvent.frameId ? this._page?._frameManager.frame(requestWillBeSentEvent.frameId) : requestWillBeSentSessionInfo.workerFrame;
|
|
269
|
+
if (!frame && this._page && requestPausedEvent && requestPausedEvent.frameId)
|
|
270
|
+
frame = this._page._frameManager.frame(requestPausedEvent.frameId);
|
|
271
|
+
if (!frame && this._page && requestWillBeSentEvent.frameId === (this._page?._delegate)._targetId) {
|
|
274
272
|
frame = this._page._frameManager.frameAttached(requestWillBeSentEvent.frameId, null);
|
|
275
273
|
}
|
|
276
|
-
|
|
277
|
-
// CORS options preflight request is generated by the network stack. If interception is enabled,
|
|
278
|
-
// we accept all CORS options, assuming that this was intended when setting route.
|
|
279
|
-
//
|
|
280
|
-
// Note: it would be better to match the URL against interception patterns.
|
|
281
|
-
const isInterceptedOptionsPreflight = !!requestPausedEvent && requestPausedEvent.request.method === 'OPTIONS' && requestWillBeSentEvent.initiator.type === 'preflight';
|
|
274
|
+
const isInterceptedOptionsPreflight = !!requestPausedEvent && requestPausedEvent.request.method === "OPTIONS" && requestWillBeSentEvent.initiator.type === "preflight";
|
|
282
275
|
if (isInterceptedOptionsPreflight && (this._page || this._serviceWorker).needsRequestInterception()) {
|
|
283
276
|
const requestHeaders = requestPausedEvent.request.headers;
|
|
284
|
-
const responseHeaders = [
|
|
285
|
-
name:
|
|
286
|
-
value: requestHeaders[
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
value: 'true'
|
|
293
|
-
}];
|
|
294
|
-
if (requestHeaders['Access-Control-Request-Headers']) responseHeaders.push({
|
|
295
|
-
name: 'Access-Control-Allow-Headers',
|
|
296
|
-
value: requestHeaders['Access-Control-Request-Headers']
|
|
297
|
-
});
|
|
298
|
-
requestPausedSessionInfo.session._sendMayFail('Fetch.fulfillRequest', {
|
|
277
|
+
const responseHeaders = [
|
|
278
|
+
{ name: "Access-Control-Allow-Origin", value: requestHeaders["Origin"] || "*" },
|
|
279
|
+
{ name: "Access-Control-Allow-Methods", value: requestHeaders["Access-Control-Request-Method"] || "GET, POST, OPTIONS, DELETE" },
|
|
280
|
+
{ name: "Access-Control-Allow-Credentials", value: "true" }
|
|
281
|
+
];
|
|
282
|
+
if (requestHeaders["Access-Control-Request-Headers"])
|
|
283
|
+
responseHeaders.push({ name: "Access-Control-Allow-Headers", value: requestHeaders["Access-Control-Request-Headers"] });
|
|
284
|
+
requestPausedSessionInfo.session._sendMayFail("Fetch.fulfillRequest", {
|
|
299
285
|
requestId: requestPausedEvent.requestId,
|
|
300
286
|
responseCode: 204,
|
|
301
287
|
responsePhrase: network.statusText(204),
|
|
302
288
|
responseHeaders,
|
|
303
|
-
body:
|
|
289
|
+
body: ""
|
|
304
290
|
});
|
|
305
291
|
return;
|
|
306
292
|
}
|
|
307
|
-
|
|
308
|
-
// Non-service-worker requests MUST have a frame—if they don't, we pretend there was no request
|
|
309
293
|
if (!frame && !this._serviceWorker) {
|
|
310
|
-
if (requestPausedEvent)
|
|
311
|
-
requestId: requestPausedEvent.requestId
|
|
312
|
-
});
|
|
294
|
+
if (requestPausedEvent)
|
|
295
|
+
requestPausedSessionInfo.session._sendMayFail("Fetch.continueRequest", { requestId: requestPausedEvent.requestId });
|
|
313
296
|
return;
|
|
314
297
|
}
|
|
315
298
|
let route = null;
|
|
316
299
|
let headersOverride;
|
|
317
300
|
if (requestPausedEvent) {
|
|
318
|
-
// We do not support intercepting redirects.
|
|
319
301
|
if (redirectedFrom || !this._userRequestInterceptionEnabled && this._protocolRequestInterceptionEnabled) {
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
headersOverride = (_redirectedFrom = redirectedFrom) === null || _redirectedFrom === void 0 || (_redirectedFrom = _redirectedFrom._originalRequestRoute) === null || _redirectedFrom === void 0 || (_redirectedFrom = _redirectedFrom._alreadyContinuedParams) === null || _redirectedFrom === void 0 ? void 0 : _redirectedFrom.headers;
|
|
323
|
-
requestPausedSessionInfo.session._sendMayFail('Fetch.continueRequest', {
|
|
324
|
-
requestId: requestPausedEvent.requestId,
|
|
325
|
-
headers: headersOverride
|
|
326
|
-
});
|
|
302
|
+
headersOverride = redirectedFrom?._originalRequestRoute?._alreadyContinuedParams?.headers;
|
|
303
|
+
requestPausedSessionInfo.session._sendMayFail("Fetch.continueRequest", { requestId: requestPausedEvent.requestId, headers: headersOverride });
|
|
327
304
|
} else {
|
|
328
305
|
route = new RouteImpl(requestPausedSessionInfo.session, requestPausedEvent.requestId, this._page, requestPausedEvent.networkId, this);
|
|
329
306
|
}
|
|
330
307
|
}
|
|
331
|
-
const isNavigationRequest = requestWillBeSentEvent.requestId === requestWillBeSentEvent.loaderId && requestWillBeSentEvent.type ===
|
|
332
|
-
const documentId = isNavigationRequest ? requestWillBeSentEvent.loaderId :
|
|
308
|
+
const isNavigationRequest = requestWillBeSentEvent.requestId === requestWillBeSentEvent.loaderId && requestWillBeSentEvent.type === "Document";
|
|
309
|
+
const documentId = isNavigationRequest ? requestWillBeSentEvent.loaderId : void 0;
|
|
333
310
|
const request = new InterceptableRequest({
|
|
334
311
|
session: requestWillBeSentSessionInfo.session,
|
|
335
312
|
context: (this._page || this._serviceWorker)._browserContext,
|
|
@@ -344,47 +321,27 @@ class CRNetworkManager {
|
|
|
344
321
|
});
|
|
345
322
|
this._requestIdToRequest.set(requestWillBeSentEvent.requestId, request);
|
|
346
323
|
if (route) {
|
|
347
|
-
|
|
348
|
-
// Use the headers from the Fetch.requestPausedPayload and release the allHeaders()
|
|
349
|
-
// right away, so that client can call it from the route handler.
|
|
350
|
-
request.request.setRawRequestHeaders((0, _utils.headersObjectToArray)(requestPausedEvent.request.headers, '\n'));
|
|
324
|
+
request.request.setRawRequestHeaders((0, import_utils.headersObjectToArray)(requestPausedEvent.request.headers, "\n"));
|
|
351
325
|
}
|
|
352
|
-
(
|
|
326
|
+
(this._page?._frameManager || this._serviceWorker).requestStarted(request.request, route || void 0);
|
|
353
327
|
}
|
|
354
328
|
_createResponse(request, responsePayload, hasExtraInfo) {
|
|
355
|
-
var _responsePayload$secu, _responsePayload$secu2, _responsePayload$secu3, _responsePayload$secu4, _responsePayload$secu5;
|
|
356
329
|
const getResponseBody = async () => {
|
|
357
|
-
|
|
358
|
-
const
|
|
359
|
-
const expectedLength = contentLengthHeader ? +contentLengthHeader[1] : undefined;
|
|
330
|
+
const contentLengthHeader = Object.entries(responsePayload.headers).find((header) => header[0].toLowerCase() === "content-length");
|
|
331
|
+
const expectedLength = contentLengthHeader ? +contentLengthHeader[1] : void 0;
|
|
360
332
|
const session = request.session;
|
|
361
|
-
const
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
if (
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
if ((_request$_route = request._route) !== null && _request$_route !== void 0 && _request$_route._fulfilled) return Buffer.from('');
|
|
368
|
-
|
|
369
|
-
// For <link prefetch we are going to receive empty body with non-empty content-length expectation. Reach out for the actual content.
|
|
370
|
-
const resource = await session.send('Network.loadNetworkResource', {
|
|
371
|
-
url: request.request.url(),
|
|
372
|
-
frameId: this._serviceWorker ? undefined : request.request.frame()._id,
|
|
373
|
-
options: {
|
|
374
|
-
disableCache: false,
|
|
375
|
-
includeCredentials: true
|
|
376
|
-
}
|
|
377
|
-
});
|
|
333
|
+
const response2 = await session.send("Network.getResponseBody", { requestId: request._requestId });
|
|
334
|
+
if (response2.body || !expectedLength)
|
|
335
|
+
return Buffer.from(response2.body, response2.base64Encoded ? "base64" : "utf8");
|
|
336
|
+
if (request._route?._fulfilled)
|
|
337
|
+
return Buffer.from("");
|
|
338
|
+
const resource = await session.send("Network.loadNetworkResource", { url: request.request.url(), frameId: this._serviceWorker ? void 0 : request.request.frame()._id, options: { disableCache: false, includeCredentials: true } });
|
|
378
339
|
const chunks = [];
|
|
379
340
|
while (resource.resource.stream) {
|
|
380
|
-
const chunk = await session.send(
|
|
381
|
-
|
|
382
|
-
});
|
|
383
|
-
chunks.push(Buffer.from(chunk.data, chunk.base64Encoded ? 'base64' : 'utf-8'));
|
|
341
|
+
const chunk = await session.send("IO.read", { handle: resource.resource.stream });
|
|
342
|
+
chunks.push(Buffer.from(chunk.data, chunk.base64Encoded ? "base64" : "utf-8"));
|
|
384
343
|
if (chunk.eof) {
|
|
385
|
-
await session.send(
|
|
386
|
-
handle: resource.resource.stream
|
|
387
|
-
});
|
|
344
|
+
await session.send("IO.close", { handle: resource.resource.stream });
|
|
388
345
|
break;
|
|
389
346
|
}
|
|
390
347
|
}
|
|
@@ -394,7 +351,7 @@ class CRNetworkManager {
|
|
|
394
351
|
let timing;
|
|
395
352
|
if (timingPayload && !this._responseExtraInfoTracker.servedFromCache(request._requestId)) {
|
|
396
353
|
timing = {
|
|
397
|
-
startTime: (timingPayload.requestTime - request._timestamp + request._wallTime) *
|
|
354
|
+
startTime: (timingPayload.requestTime - request._timestamp + request._wallTime) * 1e3,
|
|
398
355
|
domainLookupStart: timingPayload.dnsStart,
|
|
399
356
|
domainLookupEnd: timingPayload.dnsEnd,
|
|
400
357
|
connectStart: timingPayload.connectStart,
|
|
@@ -405,7 +362,7 @@ class CRNetworkManager {
|
|
|
405
362
|
};
|
|
406
363
|
} else {
|
|
407
364
|
timing = {
|
|
408
|
-
startTime: request._wallTime *
|
|
365
|
+
startTime: request._wallTime * 1e3,
|
|
409
366
|
domainLookupStart: -1,
|
|
410
367
|
domainLookupEnd: -1,
|
|
411
368
|
connectStart: -1,
|
|
@@ -415,8 +372,8 @@ class CRNetworkManager {
|
|
|
415
372
|
responseStart: -1
|
|
416
373
|
};
|
|
417
374
|
}
|
|
418
|
-
const response = new network.Response(request.request, responsePayload.status, responsePayload.statusText, (0,
|
|
419
|
-
if (responsePayload
|
|
375
|
+
const response = new network.Response(request.request, responsePayload.status, responsePayload.statusText, (0, import_utils.headersObjectToArray)(responsePayload.headers), timing, getResponseBody, !!responsePayload.fromServiceWorker, responsePayload.protocol);
|
|
376
|
+
if (responsePayload?.remoteIPAddress && typeof responsePayload?.remotePort === "number") {
|
|
420
377
|
response._serverAddrFinished({
|
|
421
378
|
ipAddress: responsePayload.remoteIPAddress,
|
|
422
379
|
port: responsePayload.remotePort
|
|
@@ -425,137 +382,96 @@ class CRNetworkManager {
|
|
|
425
382
|
response._serverAddrFinished();
|
|
426
383
|
}
|
|
427
384
|
response._securityDetailsFinished({
|
|
428
|
-
protocol: responsePayload
|
|
429
|
-
subjectName: responsePayload
|
|
430
|
-
issuer: responsePayload
|
|
431
|
-
validFrom: responsePayload
|
|
432
|
-
validTo: responsePayload
|
|
385
|
+
protocol: responsePayload?.securityDetails?.protocol,
|
|
386
|
+
subjectName: responsePayload?.securityDetails?.subjectName,
|
|
387
|
+
issuer: responsePayload?.securityDetails?.issuer,
|
|
388
|
+
validFrom: responsePayload?.securityDetails?.validFrom,
|
|
389
|
+
validTo: responsePayload?.securityDetails?.validTo
|
|
433
390
|
});
|
|
434
391
|
this._responseExtraInfoTracker.processResponse(request._requestId, response, hasExtraInfo);
|
|
435
392
|
return response;
|
|
436
393
|
}
|
|
437
394
|
_deleteRequest(request) {
|
|
438
395
|
this._requestIdToRequest.delete(request._requestId);
|
|
439
|
-
if (request._interceptionId)
|
|
396
|
+
if (request._interceptionId)
|
|
397
|
+
this._attemptedAuthentications.delete(request._interceptionId);
|
|
440
398
|
}
|
|
441
399
|
_handleRequestRedirect(request, responsePayload, timestamp, hasExtraInfo) {
|
|
442
|
-
var _this$_page4, _this$_page5;
|
|
443
400
|
const response = this._createResponse(request, responsePayload, hasExtraInfo);
|
|
444
401
|
response.setTransferSize(null);
|
|
445
402
|
response.setEncodedBodySize(null);
|
|
446
|
-
response._requestFinished((timestamp - request._timestamp) *
|
|
403
|
+
response._requestFinished((timestamp - request._timestamp) * 1e3);
|
|
447
404
|
this._deleteRequest(request);
|
|
448
|
-
(
|
|
449
|
-
(
|
|
405
|
+
(this._page?._frameManager || this._serviceWorker).requestReceivedResponse(response);
|
|
406
|
+
(this._page?._frameManager || this._serviceWorker).reportRequestFinished(request.request, response);
|
|
450
407
|
}
|
|
451
408
|
_onResponseReceivedExtraInfo(event) {
|
|
452
409
|
this._responseExtraInfoTracker.responseReceivedExtraInfo(event);
|
|
453
410
|
}
|
|
454
411
|
_onResponseReceived(sessionInfo, event) {
|
|
455
|
-
var _this$_page6;
|
|
456
412
|
let request = this._requestIdToRequest.get(event.requestId);
|
|
457
|
-
// For frame-level Requests that are handled by a Service Worker's fetch handler, we'll never get a requestPaused event, so we need to
|
|
458
|
-
// manually create the request. In an ideal world, crNetworkManager would be able to know this on Network.requestWillBeSent, but there
|
|
459
|
-
// is not enough metadata there.
|
|
460
413
|
if (!request && event.response.fromServiceWorker) {
|
|
461
414
|
const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(event.requestId);
|
|
462
415
|
if (requestWillBeSentEvent) {
|
|
463
416
|
this._requestIdToRequestWillBeSentEvent.delete(event.requestId);
|
|
464
|
-
this._onRequest(sessionInfo, requestWillBeSentEvent.event,
|
|
417
|
+
this._onRequest(sessionInfo, requestWillBeSentEvent.event, void 0, void 0);
|
|
465
418
|
request = this._requestIdToRequest.get(event.requestId);
|
|
466
419
|
}
|
|
467
420
|
}
|
|
468
|
-
|
|
469
|
-
|
|
421
|
+
if (!request)
|
|
422
|
+
return;
|
|
470
423
|
const response = this._createResponse(request, event.response, event.hasExtraInfo);
|
|
471
|
-
(
|
|
424
|
+
(this._page?._frameManager || this._serviceWorker).requestReceivedResponse(response);
|
|
472
425
|
}
|
|
473
426
|
_onLoadingFinished(sessionInfo, event) {
|
|
474
|
-
var _this$_page7;
|
|
475
427
|
this._responseExtraInfoTracker.loadingFinished(event);
|
|
476
428
|
const request = this._requestIdToRequest.get(event.requestId);
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
if (!request) return;
|
|
429
|
+
if (!request)
|
|
430
|
+
return;
|
|
480
431
|
this._maybeUpdateOOPIFMainRequest(sessionInfo, request);
|
|
481
|
-
|
|
482
|
-
// Under certain conditions we never get the Network.responseReceived
|
|
483
|
-
// event from protocol. @see https://crbug.com/883475
|
|
484
432
|
const response = request.request._existingResponse();
|
|
485
433
|
if (response) {
|
|
486
434
|
response.setTransferSize(event.encodedDataLength);
|
|
487
|
-
response.responseHeadersSize().then(size => response.setEncodedBodySize(event.encodedDataLength - size));
|
|
488
|
-
response._requestFinished(
|
|
435
|
+
response.responseHeadersSize().then((size) => response.setEncodedBodySize(event.encodedDataLength - size));
|
|
436
|
+
response._requestFinished(import_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));
|
|
489
437
|
}
|
|
490
438
|
this._deleteRequest(request);
|
|
491
|
-
(
|
|
439
|
+
(this._page?._frameManager || this._serviceWorker).reportRequestFinished(request.request, response);
|
|
492
440
|
}
|
|
493
441
|
_onLoadingFailed(sessionInfo, event) {
|
|
494
|
-
var _this$_page8;
|
|
495
442
|
this._responseExtraInfoTracker.loadingFailed(event);
|
|
496
443
|
let request = this._requestIdToRequest.get(event.requestId);
|
|
497
444
|
if (!request) {
|
|
498
445
|
const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(event.requestId);
|
|
499
446
|
if (requestWillBeSentEvent) {
|
|
500
|
-
// This is a case where request has failed before we had a chance to intercept it.
|
|
501
|
-
// We stop waiting for Fetch.requestPaused (it might never come), and dispatch request event
|
|
502
|
-
// right away, followed by requestfailed event.
|
|
503
447
|
this._requestIdToRequestWillBeSentEvent.delete(event.requestId);
|
|
504
|
-
this._onRequest(sessionInfo, requestWillBeSentEvent.event,
|
|
448
|
+
this._onRequest(sessionInfo, requestWillBeSentEvent.event, void 0, void 0);
|
|
505
449
|
request = this._requestIdToRequest.get(event.requestId);
|
|
506
450
|
}
|
|
507
451
|
}
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
// @see https://crbug.com/750469
|
|
511
|
-
if (!request) return;
|
|
452
|
+
if (!request)
|
|
453
|
+
return;
|
|
512
454
|
this._maybeUpdateOOPIFMainRequest(sessionInfo, request);
|
|
513
455
|
const response = request.request._existingResponse();
|
|
514
456
|
if (response) {
|
|
515
457
|
response.setTransferSize(null);
|
|
516
458
|
response.setEncodedBodySize(null);
|
|
517
|
-
response._requestFinished(
|
|
459
|
+
response._requestFinished(import_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));
|
|
518
460
|
} else {
|
|
519
|
-
// Loading failed before response has arrived - there will be no extra info events.
|
|
520
461
|
request.request.setRawRequestHeaders(null);
|
|
521
462
|
}
|
|
522
463
|
this._deleteRequest(request);
|
|
523
|
-
request.request._setFailureText(event.errorText || event.blockedReason ||
|
|
524
|
-
(
|
|
464
|
+
request.request._setFailureText(event.errorText || event.blockedReason || "");
|
|
465
|
+
(this._page?._frameManager || this._serviceWorker).requestFailed(request.request, !!event.canceled);
|
|
525
466
|
}
|
|
526
467
|
_maybeUpdateOOPIFMainRequest(sessionInfo, request) {
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
// a child session, migrate it there.
|
|
530
|
-
if (request.session !== sessionInfo.session && !sessionInfo.isMain && request._documentId === request._requestId) request.session = sessionInfo.session;
|
|
468
|
+
if (request.session !== sessionInfo.session && !sessionInfo.isMain && request._documentId === request._requestId)
|
|
469
|
+
request.session = sessionInfo.session;
|
|
531
470
|
}
|
|
532
471
|
}
|
|
533
|
-
exports.CRNetworkManager = CRNetworkManager;
|
|
534
472
|
class InterceptableRequest {
|
|
535
473
|
constructor(options) {
|
|
536
|
-
|
|
537
|
-
this._requestId = void 0;
|
|
538
|
-
this._interceptionId = void 0;
|
|
539
|
-
this._documentId = void 0;
|
|
540
|
-
this._timestamp = void 0;
|
|
541
|
-
this._wallTime = void 0;
|
|
542
|
-
this._route = void 0;
|
|
543
|
-
// Only first request in the chain can be intercepted, so this will
|
|
544
|
-
// store the first and only Route in the chain (if any).
|
|
545
|
-
this._originalRequestRoute = void 0;
|
|
546
|
-
this.session = void 0;
|
|
547
|
-
const {
|
|
548
|
-
session,
|
|
549
|
-
context,
|
|
550
|
-
frame,
|
|
551
|
-
documentId,
|
|
552
|
-
route,
|
|
553
|
-
requestWillBeSentEvent,
|
|
554
|
-
requestPausedEvent,
|
|
555
|
-
redirectedFrom,
|
|
556
|
-
serviceWorker,
|
|
557
|
-
headersOverride
|
|
558
|
-
} = options;
|
|
474
|
+
const { session, context, frame, documentId, route, requestWillBeSentEvent, requestPausedEvent, redirectedFrom, serviceWorker, headersOverride } = options;
|
|
559
475
|
this.session = session;
|
|
560
476
|
this._timestamp = requestWillBeSentEvent.timestamp;
|
|
561
477
|
this._wallTime = requestWillBeSentEvent.wallTime;
|
|
@@ -563,25 +479,23 @@ class InterceptableRequest {
|
|
|
563
479
|
this._interceptionId = requestPausedEvent && requestPausedEvent.requestId;
|
|
564
480
|
this._documentId = documentId;
|
|
565
481
|
this._route = route;
|
|
566
|
-
this._originalRequestRoute = route
|
|
482
|
+
this._originalRequestRoute = route ?? redirectedFrom?._originalRequestRoute;
|
|
567
483
|
const {
|
|
568
484
|
headers,
|
|
569
485
|
method,
|
|
570
486
|
url,
|
|
571
487
|
postDataEntries = null
|
|
572
488
|
} = requestPausedEvent ? requestPausedEvent.request : requestWillBeSentEvent.request;
|
|
573
|
-
const type = (requestWillBeSentEvent.type ||
|
|
489
|
+
const type = (requestWillBeSentEvent.type || "").toLowerCase();
|
|
574
490
|
let postDataBuffer = null;
|
|
575
|
-
const entries = postDataEntries
|
|
576
|
-
if (entries && entries.length)
|
|
577
|
-
|
|
491
|
+
const entries = postDataEntries?.filter((entry) => entry.bytes);
|
|
492
|
+
if (entries && entries.length)
|
|
493
|
+
postDataBuffer = Buffer.concat(entries.map((entry) => Buffer.from(entry.bytes, "base64")));
|
|
494
|
+
this.request = new network.Request(context, frame, serviceWorker, redirectedFrom?.request || null, documentId, url, type, method, postDataBuffer, headersOverride || (0, import_utils.headersObjectToArray)(headers));
|
|
578
495
|
}
|
|
579
496
|
}
|
|
580
497
|
class RouteImpl {
|
|
581
498
|
constructor(session, interceptionId, page, networkId, sessionManager) {
|
|
582
|
-
this._session = void 0;
|
|
583
|
-
this._interceptionId = void 0;
|
|
584
|
-
this._alreadyContinuedParams = void 0;
|
|
585
499
|
this._fulfilled = false;
|
|
586
500
|
this._sessionManager = void 0;
|
|
587
501
|
this._networkId = void 0;
|
|
@@ -591,7 +505,7 @@ class RouteImpl {
|
|
|
591
505
|
this._page = page;
|
|
592
506
|
this._networkId = networkId;
|
|
593
507
|
this._sessionManager = sessionManager;
|
|
594
|
-
|
|
508
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Fetch.requestPaused", async (e) => await this._networkRequestIntercepted(e));
|
|
595
509
|
}
|
|
596
510
|
async continue(overrides) {
|
|
597
511
|
this._alreadyContinuedParams = {
|
|
@@ -599,41 +513,35 @@ class RouteImpl {
|
|
|
599
513
|
url: overrides.url,
|
|
600
514
|
headers: overrides.headers,
|
|
601
515
|
method: overrides.method,
|
|
602
|
-
postData: overrides.postData ? overrides.postData.toString(
|
|
516
|
+
postData: overrides.postData ? overrides.postData.toString("base64") : void 0
|
|
603
517
|
};
|
|
604
|
-
if (overrides.url && (overrides.url ===
|
|
518
|
+
if (overrides.url && (overrides.url === "http://patchright-init-script-inject.internal/" || overrides.url === "https://patchright-init-script-inject.internal/")) {
|
|
605
519
|
await catchDisallowedErrors(async () => {
|
|
606
520
|
this._sessionManager._alreadyTrackedNetworkIds.add(this._networkId);
|
|
607
|
-
this._session.send(
|
|
608
|
-
requestId: this._interceptionId,
|
|
609
|
-
interceptResponse: true
|
|
610
|
-
});
|
|
521
|
+
this._session.send("Fetch.continueRequest", { requestId: this._interceptionId, interceptResponse: true });
|
|
611
522
|
});
|
|
612
523
|
} else {
|
|
613
524
|
await catchDisallowedErrors(async () => {
|
|
614
|
-
await this._session.send(
|
|
525
|
+
await this._session.send("Fetch.continueRequest", this._alreadyContinuedParams);
|
|
615
526
|
});
|
|
616
527
|
}
|
|
617
528
|
}
|
|
618
529
|
async fulfill(response) {
|
|
619
|
-
const isTextHtml = response.resourceType ===
|
|
530
|
+
const isTextHtml = response.resourceType === "Document" || response.headers.some((header) => header.name === "content-type" && header.value.includes("text/html"));
|
|
620
531
|
var allInjections = [...this._page._delegate._mainFrameSession._evaluateOnNewDocumentScripts];
|
|
621
532
|
for (const binding of this._page._delegate._browserContext._pageBindings.values()) {
|
|
622
533
|
if (!allInjections.includes(binding)) allInjections.push(binding);
|
|
623
534
|
}
|
|
624
535
|
if (isTextHtml && allInjections.length) {
|
|
625
|
-
|
|
626
|
-
let scriptNonce = _crypto.default.randomBytes(22).toString('hex');
|
|
536
|
+
let scriptNonce = import_crypto.default.randomBytes(22).toString("hex");
|
|
627
537
|
for (let i = 0; i < response.headers.length; i++) {
|
|
628
|
-
if (response.headers[i].name ===
|
|
629
|
-
// Search for an existing script-src nonce that we can hijack
|
|
538
|
+
if (response.headers[i].name === "content-security-policy" || response.headers[i].name === "content-security-policy-report-only") {
|
|
630
539
|
let cspValue = response.headers[i].value;
|
|
631
540
|
const nonceRegex = /script-src[^;]*'nonce-([\w-]+)'/;
|
|
632
541
|
const nonceMatch = cspValue.match(nonceRegex);
|
|
633
542
|
if (nonceMatch) {
|
|
634
543
|
scriptNonce = nonceMatch[1];
|
|
635
544
|
} else {
|
|
636
|
-
// Add the new nonce value to the script-src directive
|
|
637
545
|
const scriptSrcRegex = /(script-src[^;]*)(;|$)/;
|
|
638
546
|
const newCspValue = cspValue.replace(scriptSrcRegex, `$1 'nonce-${scriptNonce}'$2`);
|
|
639
547
|
response.headers[i].value = newCspValue;
|
|
@@ -642,22 +550,22 @@ class RouteImpl {
|
|
|
642
550
|
}
|
|
643
551
|
}
|
|
644
552
|
let injectionHTML = "";
|
|
645
|
-
allInjections.forEach(script => {
|
|
646
|
-
let scriptId =
|
|
553
|
+
allInjections.forEach((script) => {
|
|
554
|
+
let scriptId = import_crypto.default.randomBytes(22).toString("hex");
|
|
647
555
|
injectionHTML += `<script class="${this._page._delegate.initScriptTag}" nonce="${scriptNonce}" type="text/javascript">document.getElementById("${scriptId}")?.remove();${script.source}</script>`;
|
|
648
556
|
});
|
|
649
557
|
if (response.isBase64) {
|
|
650
558
|
response.isBase64 = false;
|
|
651
|
-
response.body = injectionHTML + Buffer.from(response.body,
|
|
559
|
+
response.body = injectionHTML + Buffer.from(response.body, "base64").toString("utf-8");
|
|
652
560
|
} else {
|
|
653
561
|
response.body = injectionHTML + response.body;
|
|
654
562
|
}
|
|
655
563
|
}
|
|
656
564
|
this._fulfilled = true;
|
|
657
|
-
const body = response.isBase64 ? response.body : Buffer.from(response.body).toString(
|
|
565
|
+
const body = response.isBase64 ? response.body : Buffer.from(response.body).toString("base64");
|
|
658
566
|
const responseHeaders = splitSetCookieHeader(response.headers);
|
|
659
567
|
await catchDisallowedErrors(async () => {
|
|
660
|
-
await this._session.send(
|
|
568
|
+
await this._session.send("Fetch.fulfillRequest", {
|
|
661
569
|
requestId: response.interceptionId ? response.interceptionId : this._interceptionId,
|
|
662
570
|
responseCode: response.status,
|
|
663
571
|
responsePhrase: network.statusText(response.status),
|
|
@@ -666,34 +574,26 @@ class RouteImpl {
|
|
|
666
574
|
});
|
|
667
575
|
});
|
|
668
576
|
}
|
|
669
|
-
async abort(errorCode =
|
|
577
|
+
async abort(errorCode = "failed") {
|
|
670
578
|
const errorReason = errorReasons[errorCode];
|
|
671
|
-
(0,
|
|
579
|
+
(0, import_utils.assert)(errorReason, "Unknown error code: " + errorCode);
|
|
672
580
|
await catchDisallowedErrors(async () => {
|
|
673
|
-
await this._session.send(
|
|
581
|
+
await this._session.send("Fetch.failRequest", {
|
|
674
582
|
requestId: this._interceptionId,
|
|
675
583
|
errorReason
|
|
676
584
|
});
|
|
677
585
|
});
|
|
678
586
|
}
|
|
679
587
|
async _networkRequestIntercepted(event) {
|
|
680
|
-
if (event.resourceType !==
|
|
681
|
-
/*await catchDisallowedErrors(async () => {
|
|
682
|
-
await this._session.send('Fetch.continueRequest', { requestId: event.requestId });
|
|
683
|
-
});*/
|
|
588
|
+
if (event.resourceType !== "Document") {
|
|
684
589
|
return;
|
|
685
590
|
}
|
|
686
591
|
if (this._networkId != event.networkId || !this._sessionManager._alreadyTrackedNetworkIds.has(event.networkId)) return;
|
|
687
592
|
try {
|
|
688
593
|
if (event.responseStatusCode >= 301 && event.responseStatusCode <= 308 || event.redirectedRequestId && !event.responseStatusCode) {
|
|
689
|
-
await this._session.send(
|
|
690
|
-
requestId: event.requestId,
|
|
691
|
-
interceptResponse: true
|
|
692
|
-
});
|
|
594
|
+
await this._session.send("Fetch.continueRequest", { requestId: event.requestId, interceptResponse: true });
|
|
693
595
|
} else {
|
|
694
|
-
const responseBody = await this._session.send(
|
|
695
|
-
requestId: event.requestId
|
|
696
|
-
});
|
|
596
|
+
const responseBody = await this._session.send("Fetch.getResponseBody", { requestId: event.requestId });
|
|
697
597
|
await this.fulfill({
|
|
698
598
|
headers: event.responseHeaders,
|
|
699
599
|
isBase64: true,
|
|
@@ -704,70 +604,51 @@ class RouteImpl {
|
|
|
704
604
|
});
|
|
705
605
|
}
|
|
706
606
|
} catch (error) {
|
|
707
|
-
await this._session._sendMayFail(
|
|
708
|
-
requestId: event.requestId
|
|
709
|
-
});
|
|
607
|
+
await this._session._sendMayFail("Fetch.continueRequest", { requestId: event.requestId });
|
|
710
608
|
}
|
|
711
609
|
}
|
|
712
610
|
}
|
|
713
|
-
|
|
714
|
-
// In certain cases, protocol will return error if the request was already canceled
|
|
715
|
-
// or the page was closed. We should tolerate these errors but propagate other.
|
|
716
611
|
async function catchDisallowedErrors(callback) {
|
|
717
612
|
try {
|
|
718
613
|
return await callback();
|
|
719
614
|
} catch (e) {
|
|
720
|
-
if ((0,
|
|
615
|
+
if ((0, import_protocolError.isProtocolError)(e) && e.message.includes("Invalid http status code or phrase"))
|
|
616
|
+
throw e;
|
|
617
|
+
if ((0, import_protocolError.isProtocolError)(e) && e.message.includes("Unsafe header"))
|
|
618
|
+
throw e;
|
|
721
619
|
}
|
|
722
620
|
}
|
|
723
621
|
function splitSetCookieHeader(headers) {
|
|
724
|
-
const index = headers.findIndex(({
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
if (index === -1) return headers;
|
|
622
|
+
const index = headers.findIndex(({ name }) => name.toLowerCase() === "set-cookie");
|
|
623
|
+
if (index === -1)
|
|
624
|
+
return headers;
|
|
728
625
|
const header = headers[index];
|
|
729
|
-
const values = header.value.split(
|
|
730
|
-
if (values.length === 1)
|
|
626
|
+
const values = header.value.split("\n");
|
|
627
|
+
if (values.length === 1)
|
|
628
|
+
return headers;
|
|
731
629
|
const result = headers.slice();
|
|
732
|
-
result.splice(index, 1, ...values.map(value => ({
|
|
733
|
-
name: header.name,
|
|
734
|
-
value
|
|
735
|
-
})));
|
|
630
|
+
result.splice(index, 1, ...values.map((value) => ({ name: header.name, value })));
|
|
736
631
|
return result;
|
|
737
632
|
}
|
|
738
633
|
const errorReasons = {
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
634
|
+
"aborted": "Aborted",
|
|
635
|
+
"accessdenied": "AccessDenied",
|
|
636
|
+
"addressunreachable": "AddressUnreachable",
|
|
637
|
+
"blockedbyclient": "BlockedByClient",
|
|
638
|
+
"blockedbyresponse": "BlockedByResponse",
|
|
639
|
+
"connectionaborted": "ConnectionAborted",
|
|
640
|
+
"connectionclosed": "ConnectionClosed",
|
|
641
|
+
"connectionfailed": "ConnectionFailed",
|
|
642
|
+
"connectionrefused": "ConnectionRefused",
|
|
643
|
+
"connectionreset": "ConnectionReset",
|
|
644
|
+
"internetdisconnected": "InternetDisconnected",
|
|
645
|
+
"namenotresolved": "NameNotResolved",
|
|
646
|
+
"timedout": "TimedOut",
|
|
647
|
+
"failed": "Failed"
|
|
753
648
|
};
|
|
754
|
-
// This class aligns responses with response headers from extra info:
|
|
755
|
-
// - Network.requestWillBeSent, Network.responseReceived, Network.loadingFinished/loadingFailed are
|
|
756
|
-
// dispatched using one channel.
|
|
757
|
-
// - Network.requestWillBeSentExtraInfo and Network.responseReceivedExtraInfo are dispatched on
|
|
758
|
-
// another channel. Those channels are not associated, so events come in random order.
|
|
759
|
-
//
|
|
760
|
-
// This class will associate responses with the new headers. These extra info headers will become
|
|
761
|
-
// available to client reliably upon requestfinished event only. It consumes CDP
|
|
762
|
-
// signals on one end and processResponse(network.Response) signals on the other hands. It then makes
|
|
763
|
-
// sure that responses have all the extra headers in place by the time request finishes.
|
|
764
|
-
//
|
|
765
|
-
// The shape of the instrumentation API is deliberately following the CDP, so that it
|
|
766
|
-
// is clear what is called when and what this means to the tracker without extra
|
|
767
|
-
// documentation.
|
|
768
649
|
class ResponseExtraInfoTracker {
|
|
769
650
|
constructor() {
|
|
770
|
-
this._requests = new Map();
|
|
651
|
+
this._requests = /* @__PURE__ */ new Map();
|
|
771
652
|
}
|
|
772
653
|
requestWillBeSentExtraInfo(event) {
|
|
773
654
|
const info = this._getOrCreateEntry(event.requestId);
|
|
@@ -781,7 +662,7 @@ class ResponseExtraInfoTracker {
|
|
|
781
662
|
}
|
|
782
663
|
servedFromCache(requestId) {
|
|
783
664
|
const info = this._requests.get(requestId);
|
|
784
|
-
return !!
|
|
665
|
+
return !!info?.servedFromCache;
|
|
785
666
|
}
|
|
786
667
|
responseReceivedExtraInfo(event) {
|
|
787
668
|
const info = this._getOrCreateEntry(event.requestId);
|
|
@@ -790,12 +671,8 @@ class ResponseExtraInfoTracker {
|
|
|
790
671
|
this._checkFinished(info);
|
|
791
672
|
}
|
|
792
673
|
processResponse(requestId, response, hasExtraInfo) {
|
|
793
|
-
var _info;
|
|
794
674
|
let info = this._requests.get(requestId);
|
|
795
|
-
|
|
796
|
-
// https://bugs.chromium.org/p/chromium/issues/detail?id=1340398
|
|
797
|
-
if (!hasExtraInfo || (_info = info) !== null && _info !== void 0 && _info.servedFromCache) {
|
|
798
|
-
// Use "provisional" headers as "raw" ones.
|
|
675
|
+
if (!hasExtraInfo || info?.servedFromCache) {
|
|
799
676
|
response.request().setRawRequestHeaders(null);
|
|
800
677
|
response.setResponseHeadersSize(null);
|
|
801
678
|
response.setRawResponseHeaders(null);
|
|
@@ -807,13 +684,15 @@ class ResponseExtraInfoTracker {
|
|
|
807
684
|
}
|
|
808
685
|
loadingFinished(event) {
|
|
809
686
|
const info = this._requests.get(event.requestId);
|
|
810
|
-
if (!info)
|
|
687
|
+
if (!info)
|
|
688
|
+
return;
|
|
811
689
|
info.loadingFinished = event;
|
|
812
690
|
this._checkFinished(info);
|
|
813
691
|
}
|
|
814
692
|
loadingFailed(event) {
|
|
815
693
|
const info = this._requests.get(event.requestId);
|
|
816
|
-
if (!info)
|
|
694
|
+
if (!info)
|
|
695
|
+
return;
|
|
817
696
|
info.loadingFailed = event;
|
|
818
697
|
this._checkFinished(info);
|
|
819
698
|
}
|
|
@@ -821,7 +700,7 @@ class ResponseExtraInfoTracker {
|
|
|
821
700
|
let info = this._requests.get(requestId);
|
|
822
701
|
if (!info) {
|
|
823
702
|
info = {
|
|
824
|
-
requestId
|
|
703
|
+
requestId,
|
|
825
704
|
requestWillBeSentExtraInfo: [],
|
|
826
705
|
responseReceivedExtraInfo: [],
|
|
827
706
|
responses: []
|
|
@@ -834,28 +713,29 @@ class ResponseExtraInfoTracker {
|
|
|
834
713
|
const response = info.responses[index];
|
|
835
714
|
const requestExtraInfo = info.requestWillBeSentExtraInfo[index];
|
|
836
715
|
if (response && requestExtraInfo) {
|
|
837
|
-
response.request().setRawRequestHeaders((0,
|
|
838
|
-
info.requestWillBeSentExtraInfo[index] =
|
|
716
|
+
response.request().setRawRequestHeaders((0, import_utils.headersObjectToArray)(requestExtraInfo.headers, "\n"));
|
|
717
|
+
info.requestWillBeSentExtraInfo[index] = void 0;
|
|
839
718
|
}
|
|
840
719
|
const responseExtraInfo = info.responseReceivedExtraInfo[index];
|
|
841
720
|
if (response && responseExtraInfo) {
|
|
842
|
-
|
|
843
|
-
response.
|
|
844
|
-
|
|
845
|
-
info.responseReceivedExtraInfo[index] = undefined;
|
|
721
|
+
response.setResponseHeadersSize(responseExtraInfo.headersText?.length || 0);
|
|
722
|
+
response.setRawResponseHeaders((0, import_utils.headersObjectToArray)(responseExtraInfo.headers, "\n"));
|
|
723
|
+
info.responseReceivedExtraInfo[index] = void 0;
|
|
846
724
|
}
|
|
847
725
|
}
|
|
848
726
|
_checkFinished(info) {
|
|
849
|
-
if (!info.loadingFinished && !info.loadingFailed)
|
|
727
|
+
if (!info.loadingFinished && !info.loadingFailed)
|
|
728
|
+
return;
|
|
850
729
|
if (info.responses.length <= info.responseReceivedExtraInfo.length) {
|
|
851
|
-
// We have extra info for each response.
|
|
852
730
|
this._stopTracking(info.requestId);
|
|
853
731
|
return;
|
|
854
732
|
}
|
|
855
|
-
|
|
856
|
-
// We are not done yet.
|
|
857
733
|
}
|
|
858
734
|
_stopTracking(requestId) {
|
|
859
735
|
this._requests.delete(requestId);
|
|
860
736
|
}
|
|
861
|
-
}
|
|
737
|
+
}
|
|
738
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
739
|
+
0 && (module.exports = {
|
|
740
|
+
CRNetworkManager
|
|
741
|
+
});
|