patchright-core 1.51.2 → 1.52.0
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 +54 -69
- 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 +375 -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 +288 -403
- 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 +77 -111
- package/lib/server/frames.js +741 -891
- 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 +329 -426
- 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 +90 -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-DVQi6prl.js} +1 -1
- package/lib/vite/recorder/assets/index-97EUAAbk.js +184 -0
- package/lib/vite/recorder/index.html +1 -1
- package/lib/vite/traceViewer/assets/{codeMirrorModule-DpJ-EmBQ.js → codeMirrorModule-dvXVzLxY.js} +1 -1
- package/lib/vite/traceViewer/assets/defaultSettingsView-BjymbO6M.js +265 -0
- package/lib/vite/traceViewer/{defaultSettingsView.5fN5lw10.css → defaultSettingsView.QdHITyLI.css} +1 -1
- package/lib/vite/traceViewer/index.ChIUCJnj.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.html +3 -3
- package/lib/vite/traceViewer/uiMode.jUCiCtdp.js +5 -0
- 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-DTenqiGw.js +0 -259
- package/lib/vite/traceViewer/index.CUq7VgrV.js +0 -2
- package/lib/vite/traceViewer/uiMode.CHJSAD7F.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,130 +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
|
-
|
|
400
|
+
const response = this._createResponse(request, responsePayload, hasExtraInfo);
|
|
401
|
+
response.setTransferSize(null);
|
|
402
|
+
response.setEncodedBodySize(null);
|
|
403
|
+
response._requestFinished((timestamp - request._timestamp) * 1e3);
|
|
404
|
+
this._deleteRequest(request);
|
|
405
|
+
(this._page?._frameManager || this._serviceWorker).requestReceivedResponse(response);
|
|
406
|
+
(this._page?._frameManager || this._serviceWorker).reportRequestFinished(request.request, response);
|
|
443
407
|
}
|
|
444
408
|
_onResponseReceivedExtraInfo(event) {
|
|
445
409
|
this._responseExtraInfoTracker.responseReceivedExtraInfo(event);
|
|
446
410
|
}
|
|
447
411
|
_onResponseReceived(sessionInfo, event) {
|
|
448
|
-
var _this$_page4;
|
|
449
412
|
let request = this._requestIdToRequest.get(event.requestId);
|
|
450
|
-
// 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
|
|
451
|
-
// manually create the request. In an ideal world, crNetworkManager would be able to know this on Network.requestWillBeSent, but there
|
|
452
|
-
// is not enough metadata there.
|
|
453
413
|
if (!request && event.response.fromServiceWorker) {
|
|
454
414
|
const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(event.requestId);
|
|
455
415
|
if (requestWillBeSentEvent) {
|
|
456
416
|
this._requestIdToRequestWillBeSentEvent.delete(event.requestId);
|
|
457
|
-
this._onRequest(sessionInfo, requestWillBeSentEvent.event,
|
|
417
|
+
this._onRequest(sessionInfo, requestWillBeSentEvent.event, void 0, void 0);
|
|
458
418
|
request = this._requestIdToRequest.get(event.requestId);
|
|
459
419
|
}
|
|
460
420
|
}
|
|
461
|
-
|
|
462
|
-
|
|
421
|
+
if (!request)
|
|
422
|
+
return;
|
|
463
423
|
const response = this._createResponse(request, event.response, event.hasExtraInfo);
|
|
464
|
-
(
|
|
424
|
+
(this._page?._frameManager || this._serviceWorker).requestReceivedResponse(response);
|
|
465
425
|
}
|
|
466
426
|
_onLoadingFinished(sessionInfo, event) {
|
|
467
|
-
var _this$_page5;
|
|
468
427
|
this._responseExtraInfoTracker.loadingFinished(event);
|
|
469
428
|
const request = this._requestIdToRequest.get(event.requestId);
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
if (!request) return;
|
|
429
|
+
if (!request)
|
|
430
|
+
return;
|
|
473
431
|
this._maybeUpdateOOPIFMainRequest(sessionInfo, request);
|
|
474
|
-
|
|
475
|
-
// Under certain conditions we never get the Network.responseReceived
|
|
476
|
-
// event from protocol. @see https://crbug.com/883475
|
|
477
432
|
const response = request.request._existingResponse();
|
|
478
433
|
if (response) {
|
|
479
434
|
response.setTransferSize(event.encodedDataLength);
|
|
480
|
-
response.responseHeadersSize().then(size => response.setEncodedBodySize(event.encodedDataLength - size));
|
|
481
|
-
response._requestFinished(
|
|
435
|
+
response.responseHeadersSize().then((size) => response.setEncodedBodySize(event.encodedDataLength - size));
|
|
436
|
+
response._requestFinished(import_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));
|
|
482
437
|
}
|
|
483
438
|
this._deleteRequest(request);
|
|
484
|
-
(
|
|
439
|
+
(this._page?._frameManager || this._serviceWorker).reportRequestFinished(request.request, response);
|
|
485
440
|
}
|
|
486
441
|
_onLoadingFailed(sessionInfo, event) {
|
|
487
|
-
var _this$_page6;
|
|
488
442
|
this._responseExtraInfoTracker.loadingFailed(event);
|
|
489
443
|
let request = this._requestIdToRequest.get(event.requestId);
|
|
490
444
|
if (!request) {
|
|
491
445
|
const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(event.requestId);
|
|
492
446
|
if (requestWillBeSentEvent) {
|
|
493
|
-
// This is a case where request has failed before we had a chance to intercept it.
|
|
494
|
-
// We stop waiting for Fetch.requestPaused (it might never come), and dispatch request event
|
|
495
|
-
// right away, followed by requestfailed event.
|
|
496
447
|
this._requestIdToRequestWillBeSentEvent.delete(event.requestId);
|
|
497
|
-
this._onRequest(sessionInfo, requestWillBeSentEvent.event,
|
|
448
|
+
this._onRequest(sessionInfo, requestWillBeSentEvent.event, void 0, void 0);
|
|
498
449
|
request = this._requestIdToRequest.get(event.requestId);
|
|
499
450
|
}
|
|
500
451
|
}
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
// @see https://crbug.com/750469
|
|
504
|
-
if (!request) return;
|
|
452
|
+
if (!request)
|
|
453
|
+
return;
|
|
505
454
|
this._maybeUpdateOOPIFMainRequest(sessionInfo, request);
|
|
506
455
|
const response = request.request._existingResponse();
|
|
507
456
|
if (response) {
|
|
508
457
|
response.setTransferSize(null);
|
|
509
458
|
response.setEncodedBodySize(null);
|
|
510
|
-
response._requestFinished(
|
|
459
|
+
response._requestFinished(import_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));
|
|
511
460
|
} else {
|
|
512
|
-
// Loading failed before response has arrived - there will be no extra info events.
|
|
513
461
|
request.request.setRawRequestHeaders(null);
|
|
514
462
|
}
|
|
515
463
|
this._deleteRequest(request);
|
|
516
|
-
request.request._setFailureText(event.errorText || event.blockedReason ||
|
|
517
|
-
(
|
|
464
|
+
request.request._setFailureText(event.errorText || event.blockedReason || "");
|
|
465
|
+
(this._page?._frameManager || this._serviceWorker).requestFailed(request.request, !!event.canceled);
|
|
518
466
|
}
|
|
519
467
|
_maybeUpdateOOPIFMainRequest(sessionInfo, request) {
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
// a child session, migrate it there.
|
|
523
|
-
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;
|
|
524
470
|
}
|
|
525
471
|
}
|
|
526
|
-
exports.CRNetworkManager = CRNetworkManager;
|
|
527
472
|
class InterceptableRequest {
|
|
528
473
|
constructor(options) {
|
|
529
|
-
|
|
530
|
-
this._requestId = void 0;
|
|
531
|
-
this._interceptionId = void 0;
|
|
532
|
-
this._documentId = void 0;
|
|
533
|
-
this._timestamp = void 0;
|
|
534
|
-
this._wallTime = void 0;
|
|
535
|
-
this._route = void 0;
|
|
536
|
-
// Only first request in the chain can be intercepted, so this will
|
|
537
|
-
// store the first and only Route in the chain (if any).
|
|
538
|
-
this._originalRequestRoute = void 0;
|
|
539
|
-
this.session = void 0;
|
|
540
|
-
const {
|
|
541
|
-
session,
|
|
542
|
-
context,
|
|
543
|
-
frame,
|
|
544
|
-
documentId,
|
|
545
|
-
route,
|
|
546
|
-
requestWillBeSentEvent,
|
|
547
|
-
requestPausedEvent,
|
|
548
|
-
redirectedFrom,
|
|
549
|
-
serviceWorker,
|
|
550
|
-
headersOverride
|
|
551
|
-
} = options;
|
|
474
|
+
const { session, context, frame, documentId, route, requestWillBeSentEvent, requestPausedEvent, redirectedFrom, serviceWorker, headersOverride } = options;
|
|
552
475
|
this.session = session;
|
|
553
476
|
this._timestamp = requestWillBeSentEvent.timestamp;
|
|
554
477
|
this._wallTime = requestWillBeSentEvent.wallTime;
|
|
@@ -556,25 +479,23 @@ class InterceptableRequest {
|
|
|
556
479
|
this._interceptionId = requestPausedEvent && requestPausedEvent.requestId;
|
|
557
480
|
this._documentId = documentId;
|
|
558
481
|
this._route = route;
|
|
559
|
-
this._originalRequestRoute = route
|
|
482
|
+
this._originalRequestRoute = route ?? redirectedFrom?._originalRequestRoute;
|
|
560
483
|
const {
|
|
561
484
|
headers,
|
|
562
485
|
method,
|
|
563
486
|
url,
|
|
564
487
|
postDataEntries = null
|
|
565
488
|
} = requestPausedEvent ? requestPausedEvent.request : requestWillBeSentEvent.request;
|
|
566
|
-
const type = (requestWillBeSentEvent.type ||
|
|
489
|
+
const type = (requestWillBeSentEvent.type || "").toLowerCase();
|
|
567
490
|
let postDataBuffer = null;
|
|
568
|
-
const entries = postDataEntries
|
|
569
|
-
if (entries && entries.length)
|
|
570
|
-
|
|
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));
|
|
571
495
|
}
|
|
572
496
|
}
|
|
573
497
|
class RouteImpl {
|
|
574
498
|
constructor(session, interceptionId, page, networkId, sessionManager) {
|
|
575
|
-
this._session = void 0;
|
|
576
|
-
this._interceptionId = void 0;
|
|
577
|
-
this._alreadyContinuedParams = void 0;
|
|
578
499
|
this._fulfilled = false;
|
|
579
500
|
this._sessionManager = void 0;
|
|
580
501
|
this._networkId = void 0;
|
|
@@ -584,7 +505,7 @@ class RouteImpl {
|
|
|
584
505
|
this._page = page;
|
|
585
506
|
this._networkId = networkId;
|
|
586
507
|
this._sessionManager = sessionManager;
|
|
587
|
-
|
|
508
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Fetch.requestPaused", async (e) => await this._networkRequestIntercepted(e));
|
|
588
509
|
}
|
|
589
510
|
async continue(overrides) {
|
|
590
511
|
this._alreadyContinuedParams = {
|
|
@@ -592,41 +513,35 @@ class RouteImpl {
|
|
|
592
513
|
url: overrides.url,
|
|
593
514
|
headers: overrides.headers,
|
|
594
515
|
method: overrides.method,
|
|
595
|
-
postData: overrides.postData ? overrides.postData.toString(
|
|
516
|
+
postData: overrides.postData ? overrides.postData.toString("base64") : void 0
|
|
596
517
|
};
|
|
597
|
-
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/")) {
|
|
598
519
|
await catchDisallowedErrors(async () => {
|
|
599
520
|
this._sessionManager._alreadyTrackedNetworkIds.add(this._networkId);
|
|
600
|
-
this._session.send(
|
|
601
|
-
requestId: this._interceptionId,
|
|
602
|
-
interceptResponse: true
|
|
603
|
-
});
|
|
521
|
+
this._session.send("Fetch.continueRequest", { requestId: this._interceptionId, interceptResponse: true });
|
|
604
522
|
});
|
|
605
523
|
} else {
|
|
606
524
|
await catchDisallowedErrors(async () => {
|
|
607
|
-
await this._session.send(
|
|
525
|
+
await this._session.send("Fetch.continueRequest", this._alreadyContinuedParams);
|
|
608
526
|
});
|
|
609
527
|
}
|
|
610
528
|
}
|
|
611
529
|
async fulfill(response) {
|
|
612
|
-
const isTextHtml = response.resourceType ===
|
|
530
|
+
const isTextHtml = response.resourceType === "Document" || response.headers.some((header) => header.name === "content-type" && header.value.includes("text/html"));
|
|
613
531
|
var allInjections = [...this._page._delegate._mainFrameSession._evaluateOnNewDocumentScripts];
|
|
614
532
|
for (const binding of this._page._delegate._browserContext._pageBindings.values()) {
|
|
615
533
|
if (!allInjections.includes(binding)) allInjections.push(binding);
|
|
616
534
|
}
|
|
617
535
|
if (isTextHtml && allInjections.length) {
|
|
618
|
-
|
|
619
|
-
let scriptNonce = _crypto.default.randomBytes(22).toString('hex');
|
|
536
|
+
let scriptNonce = import_crypto.default.randomBytes(22).toString("hex");
|
|
620
537
|
for (let i = 0; i < response.headers.length; i++) {
|
|
621
|
-
if (response.headers[i].name ===
|
|
622
|
-
// 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") {
|
|
623
539
|
let cspValue = response.headers[i].value;
|
|
624
540
|
const nonceRegex = /script-src[^;]*'nonce-([\w-]+)'/;
|
|
625
541
|
const nonceMatch = cspValue.match(nonceRegex);
|
|
626
542
|
if (nonceMatch) {
|
|
627
543
|
scriptNonce = nonceMatch[1];
|
|
628
544
|
} else {
|
|
629
|
-
// Add the new nonce value to the script-src directive
|
|
630
545
|
const scriptSrcRegex = /(script-src[^;]*)(;|$)/;
|
|
631
546
|
const newCspValue = cspValue.replace(scriptSrcRegex, `$1 'nonce-${scriptNonce}'$2`);
|
|
632
547
|
response.headers[i].value = newCspValue;
|
|
@@ -635,22 +550,22 @@ class RouteImpl {
|
|
|
635
550
|
}
|
|
636
551
|
}
|
|
637
552
|
let injectionHTML = "";
|
|
638
|
-
allInjections.forEach(script => {
|
|
639
|
-
let scriptId =
|
|
553
|
+
allInjections.forEach((script) => {
|
|
554
|
+
let scriptId = import_crypto.default.randomBytes(22).toString("hex");
|
|
640
555
|
injectionHTML += `<script class="${this._page._delegate.initScriptTag}" nonce="${scriptNonce}" type="text/javascript">document.getElementById("${scriptId}")?.remove();${script.source}</script>`;
|
|
641
556
|
});
|
|
642
557
|
if (response.isBase64) {
|
|
643
558
|
response.isBase64 = false;
|
|
644
|
-
response.body = injectionHTML + Buffer.from(response.body,
|
|
559
|
+
response.body = injectionHTML + Buffer.from(response.body, "base64").toString("utf-8");
|
|
645
560
|
} else {
|
|
646
561
|
response.body = injectionHTML + response.body;
|
|
647
562
|
}
|
|
648
563
|
}
|
|
649
564
|
this._fulfilled = true;
|
|
650
|
-
const body = response.isBase64 ? response.body : Buffer.from(response.body).toString(
|
|
565
|
+
const body = response.isBase64 ? response.body : Buffer.from(response.body).toString("base64");
|
|
651
566
|
const responseHeaders = splitSetCookieHeader(response.headers);
|
|
652
567
|
await catchDisallowedErrors(async () => {
|
|
653
|
-
await this._session.send(
|
|
568
|
+
await this._session.send("Fetch.fulfillRequest", {
|
|
654
569
|
requestId: response.interceptionId ? response.interceptionId : this._interceptionId,
|
|
655
570
|
responseCode: response.status,
|
|
656
571
|
responsePhrase: network.statusText(response.status),
|
|
@@ -659,36 +574,26 @@ class RouteImpl {
|
|
|
659
574
|
});
|
|
660
575
|
});
|
|
661
576
|
}
|
|
662
|
-
async abort(errorCode =
|
|
577
|
+
async abort(errorCode = "failed") {
|
|
663
578
|
const errorReason = errorReasons[errorCode];
|
|
664
|
-
(0,
|
|
579
|
+
(0, import_utils.assert)(errorReason, "Unknown error code: " + errorCode);
|
|
665
580
|
await catchDisallowedErrors(async () => {
|
|
666
|
-
await this._session.send(
|
|
581
|
+
await this._session.send("Fetch.failRequest", {
|
|
667
582
|
requestId: this._interceptionId,
|
|
668
583
|
errorReason
|
|
669
584
|
});
|
|
670
585
|
});
|
|
671
586
|
}
|
|
672
587
|
async _networkRequestIntercepted(event) {
|
|
673
|
-
if (event.resourceType !==
|
|
674
|
-
await catchDisallowedErrors(async () => {
|
|
675
|
-
await this._session.send('Fetch.continueRequest', {
|
|
676
|
-
requestId: event.requestId
|
|
677
|
-
});
|
|
678
|
-
});
|
|
588
|
+
if (event.resourceType !== "Document") {
|
|
679
589
|
return;
|
|
680
590
|
}
|
|
681
591
|
if (this._networkId != event.networkId || !this._sessionManager._alreadyTrackedNetworkIds.has(event.networkId)) return;
|
|
682
592
|
try {
|
|
683
593
|
if (event.responseStatusCode >= 301 && event.responseStatusCode <= 308 || event.redirectedRequestId && !event.responseStatusCode) {
|
|
684
|
-
await this._session.send(
|
|
685
|
-
requestId: event.requestId,
|
|
686
|
-
interceptResponse: true
|
|
687
|
-
});
|
|
594
|
+
await this._session.send("Fetch.continueRequest", { requestId: event.requestId, interceptResponse: true });
|
|
688
595
|
} else {
|
|
689
|
-
const responseBody = await this._session.send(
|
|
690
|
-
requestId: event.requestId
|
|
691
|
-
});
|
|
596
|
+
const responseBody = await this._session.send("Fetch.getResponseBody", { requestId: event.requestId });
|
|
692
597
|
await this.fulfill({
|
|
693
598
|
headers: event.responseHeaders,
|
|
694
599
|
isBase64: true,
|
|
@@ -699,70 +604,51 @@ class RouteImpl {
|
|
|
699
604
|
});
|
|
700
605
|
}
|
|
701
606
|
} catch (error) {
|
|
702
|
-
await this._session._sendMayFail(
|
|
703
|
-
requestId: event.requestId
|
|
704
|
-
});
|
|
607
|
+
await this._session._sendMayFail("Fetch.continueRequest", { requestId: event.requestId });
|
|
705
608
|
}
|
|
706
609
|
}
|
|
707
610
|
}
|
|
708
|
-
|
|
709
|
-
// In certain cases, protocol will return error if the request was already canceled
|
|
710
|
-
// or the page was closed. We should tolerate these errors but propagate other.
|
|
711
611
|
async function catchDisallowedErrors(callback) {
|
|
712
612
|
try {
|
|
713
613
|
return await callback();
|
|
714
614
|
} catch (e) {
|
|
715
|
-
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;
|
|
716
619
|
}
|
|
717
620
|
}
|
|
718
621
|
function splitSetCookieHeader(headers) {
|
|
719
|
-
const index = headers.findIndex(({
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
if (index === -1) return headers;
|
|
622
|
+
const index = headers.findIndex(({ name }) => name.toLowerCase() === "set-cookie");
|
|
623
|
+
if (index === -1)
|
|
624
|
+
return headers;
|
|
723
625
|
const header = headers[index];
|
|
724
|
-
const values = header.value.split(
|
|
725
|
-
if (values.length === 1)
|
|
626
|
+
const values = header.value.split("\n");
|
|
627
|
+
if (values.length === 1)
|
|
628
|
+
return headers;
|
|
726
629
|
const result = headers.slice();
|
|
727
|
-
result.splice(index, 1, ...values.map(value => ({
|
|
728
|
-
name: header.name,
|
|
729
|
-
value
|
|
730
|
-
})));
|
|
630
|
+
result.splice(index, 1, ...values.map((value) => ({ name: header.name, value })));
|
|
731
631
|
return result;
|
|
732
632
|
}
|
|
733
633
|
const errorReasons = {
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
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"
|
|
748
648
|
};
|
|
749
|
-
// This class aligns responses with response headers from extra info:
|
|
750
|
-
// - Network.requestWillBeSent, Network.responseReceived, Network.loadingFinished/loadingFailed are
|
|
751
|
-
// dispatched using one channel.
|
|
752
|
-
// - Network.requestWillBeSentExtraInfo and Network.responseReceivedExtraInfo are dispatched on
|
|
753
|
-
// another channel. Those channels are not associated, so events come in random order.
|
|
754
|
-
//
|
|
755
|
-
// This class will associate responses with the new headers. These extra info headers will become
|
|
756
|
-
// available to client reliably upon requestfinished event only. It consumes CDP
|
|
757
|
-
// signals on one end and processResponse(network.Response) signals on the other hands. It then makes
|
|
758
|
-
// sure that responses have all the extra headers in place by the time request finishes.
|
|
759
|
-
//
|
|
760
|
-
// The shape of the instrumentation API is deliberately following the CDP, so that it
|
|
761
|
-
// is clear what is called when and what this means to the tracker without extra
|
|
762
|
-
// documentation.
|
|
763
649
|
class ResponseExtraInfoTracker {
|
|
764
650
|
constructor() {
|
|
765
|
-
this._requests = new Map();
|
|
651
|
+
this._requests = /* @__PURE__ */ new Map();
|
|
766
652
|
}
|
|
767
653
|
requestWillBeSentExtraInfo(event) {
|
|
768
654
|
const info = this._getOrCreateEntry(event.requestId);
|
|
@@ -776,7 +662,7 @@ class ResponseExtraInfoTracker {
|
|
|
776
662
|
}
|
|
777
663
|
servedFromCache(requestId) {
|
|
778
664
|
const info = this._requests.get(requestId);
|
|
779
|
-
return !!
|
|
665
|
+
return !!info?.servedFromCache;
|
|
780
666
|
}
|
|
781
667
|
responseReceivedExtraInfo(event) {
|
|
782
668
|
const info = this._getOrCreateEntry(event.requestId);
|
|
@@ -785,12 +671,8 @@ class ResponseExtraInfoTracker {
|
|
|
785
671
|
this._checkFinished(info);
|
|
786
672
|
}
|
|
787
673
|
processResponse(requestId, response, hasExtraInfo) {
|
|
788
|
-
var _info;
|
|
789
674
|
let info = this._requests.get(requestId);
|
|
790
|
-
|
|
791
|
-
// https://bugs.chromium.org/p/chromium/issues/detail?id=1340398
|
|
792
|
-
if (!hasExtraInfo || (_info = info) !== null && _info !== void 0 && _info.servedFromCache) {
|
|
793
|
-
// Use "provisional" headers as "raw" ones.
|
|
675
|
+
if (!hasExtraInfo || info?.servedFromCache) {
|
|
794
676
|
response.request().setRawRequestHeaders(null);
|
|
795
677
|
response.setResponseHeadersSize(null);
|
|
796
678
|
response.setRawResponseHeaders(null);
|
|
@@ -802,13 +684,15 @@ class ResponseExtraInfoTracker {
|
|
|
802
684
|
}
|
|
803
685
|
loadingFinished(event) {
|
|
804
686
|
const info = this._requests.get(event.requestId);
|
|
805
|
-
if (!info)
|
|
687
|
+
if (!info)
|
|
688
|
+
return;
|
|
806
689
|
info.loadingFinished = event;
|
|
807
690
|
this._checkFinished(info);
|
|
808
691
|
}
|
|
809
692
|
loadingFailed(event) {
|
|
810
693
|
const info = this._requests.get(event.requestId);
|
|
811
|
-
if (!info)
|
|
694
|
+
if (!info)
|
|
695
|
+
return;
|
|
812
696
|
info.loadingFailed = event;
|
|
813
697
|
this._checkFinished(info);
|
|
814
698
|
}
|
|
@@ -816,7 +700,7 @@ class ResponseExtraInfoTracker {
|
|
|
816
700
|
let info = this._requests.get(requestId);
|
|
817
701
|
if (!info) {
|
|
818
702
|
info = {
|
|
819
|
-
requestId
|
|
703
|
+
requestId,
|
|
820
704
|
requestWillBeSentExtraInfo: [],
|
|
821
705
|
responseReceivedExtraInfo: [],
|
|
822
706
|
responses: []
|
|
@@ -829,28 +713,29 @@ class ResponseExtraInfoTracker {
|
|
|
829
713
|
const response = info.responses[index];
|
|
830
714
|
const requestExtraInfo = info.requestWillBeSentExtraInfo[index];
|
|
831
715
|
if (response && requestExtraInfo) {
|
|
832
|
-
response.request().setRawRequestHeaders((0,
|
|
833
|
-
info.requestWillBeSentExtraInfo[index] =
|
|
716
|
+
response.request().setRawRequestHeaders((0, import_utils.headersObjectToArray)(requestExtraInfo.headers, "\n"));
|
|
717
|
+
info.requestWillBeSentExtraInfo[index] = void 0;
|
|
834
718
|
}
|
|
835
719
|
const responseExtraInfo = info.responseReceivedExtraInfo[index];
|
|
836
720
|
if (response && responseExtraInfo) {
|
|
837
|
-
|
|
838
|
-
response.
|
|
839
|
-
|
|
840
|
-
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;
|
|
841
724
|
}
|
|
842
725
|
}
|
|
843
726
|
_checkFinished(info) {
|
|
844
|
-
if (!info.loadingFinished && !info.loadingFailed)
|
|
727
|
+
if (!info.loadingFinished && !info.loadingFailed)
|
|
728
|
+
return;
|
|
845
729
|
if (info.responses.length <= info.responseReceivedExtraInfo.length) {
|
|
846
|
-
// We have extra info for each response.
|
|
847
730
|
this._stopTracking(info.requestId);
|
|
848
731
|
return;
|
|
849
732
|
}
|
|
850
|
-
|
|
851
|
-
// We are not done yet.
|
|
852
733
|
}
|
|
853
734
|
_stopTracking(requestId) {
|
|
854
735
|
this._requests.delete(requestId);
|
|
855
736
|
}
|
|
856
|
-
}
|
|
737
|
+
}
|
|
738
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
739
|
+
0 && (module.exports = {
|
|
740
|
+
CRNetworkManager
|
|
741
|
+
});
|