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