@checkly/playwright-core 1.41.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/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +3 -0
- package/ThirdPartyNotices.txt +1513 -0
- package/bin/PrintDeps.exe +0 -0
- package/bin/README.md +2 -0
- package/bin/install_media_pack.ps1 +5 -0
- package/bin/reinstall_chrome_beta_linux.sh +40 -0
- package/bin/reinstall_chrome_beta_mac.sh +13 -0
- package/bin/reinstall_chrome_beta_win.ps1 +23 -0
- package/bin/reinstall_chrome_stable_linux.sh +40 -0
- package/bin/reinstall_chrome_stable_mac.sh +12 -0
- package/bin/reinstall_chrome_stable_win.ps1 +23 -0
- package/bin/reinstall_msedge_beta_linux.sh +40 -0
- package/bin/reinstall_msedge_beta_mac.sh +11 -0
- package/bin/reinstall_msedge_beta_win.ps1 +22 -0
- package/bin/reinstall_msedge_dev_linux.sh +40 -0
- package/bin/reinstall_msedge_dev_mac.sh +11 -0
- package/bin/reinstall_msedge_dev_win.ps1 +22 -0
- package/bin/reinstall_msedge_stable_linux.sh +40 -0
- package/bin/reinstall_msedge_stable_mac.sh +11 -0
- package/bin/reinstall_msedge_stable_win.ps1 +23 -0
- package/browsers.json +64 -0
- package/cli.js +17 -0
- package/index.d.ts +17 -0
- package/index.js +33 -0
- package/index.mjs +28 -0
- package/lib/androidServerImpl.js +69 -0
- package/lib/browserServerImpl.js +92 -0
- package/lib/cli/driver.js +97 -0
- package/lib/cli/program.js +582 -0
- package/lib/cli/programWithTestStub.js +67 -0
- package/lib/client/accessibility.js +50 -0
- package/lib/client/android.js +473 -0
- package/lib/client/api.js +272 -0
- package/lib/client/artifact.js +79 -0
- package/lib/client/browser.js +145 -0
- package/lib/client/browserContext.js +509 -0
- package/lib/client/browserType.js +233 -0
- package/lib/client/cdpSession.js +53 -0
- package/lib/client/channelOwner.js +229 -0
- package/lib/client/clientHelper.js +57 -0
- package/lib/client/clientInstrumentation.js +40 -0
- package/lib/client/connection.js +327 -0
- package/lib/client/consoleMessage.js +55 -0
- package/lib/client/coverage.js +41 -0
- package/lib/client/dialog.js +57 -0
- package/lib/client/download.js +62 -0
- package/lib/client/electron.js +130 -0
- package/lib/client/elementHandle.js +291 -0
- package/lib/client/errors.js +77 -0
- package/lib/client/events.js +93 -0
- package/lib/client/fetch.js +343 -0
- package/lib/client/fileChooser.js +45 -0
- package/lib/client/frame.js +506 -0
- package/lib/client/harRouter.js +93 -0
- package/lib/client/input.js +111 -0
- package/lib/client/jsHandle.js +123 -0
- package/lib/client/jsonPipe.js +35 -0
- package/lib/client/localUtils.js +35 -0
- package/lib/client/locator.js +432 -0
- package/lib/client/network.js +601 -0
- package/lib/client/page.js +707 -0
- package/lib/client/playwright.js +74 -0
- package/lib/client/selectors.js +67 -0
- package/lib/client/stream.js +54 -0
- package/lib/client/tracing.js +135 -0
- package/lib/client/types.js +24 -0
- package/lib/client/video.js +51 -0
- package/lib/client/waiter.js +158 -0
- package/lib/client/webError.js +37 -0
- package/lib/client/worker.js +71 -0
- package/lib/client/writableStream.js +54 -0
- package/lib/common/socksProxy.js +569 -0
- package/lib/common/timeoutSettings.js +73 -0
- package/lib/common/types.js +5 -0
- package/lib/generated/consoleApiSource.js +7 -0
- package/lib/generated/injectedScriptSource.js +7 -0
- package/lib/generated/recorderSource.js +7 -0
- package/lib/generated/utilityScriptSource.js +7 -0
- package/lib/image_tools/colorUtils.js +98 -0
- package/lib/image_tools/compare.js +108 -0
- package/lib/image_tools/imageChannel.js +70 -0
- package/lib/image_tools/stats.js +102 -0
- package/lib/inProcessFactory.js +54 -0
- package/lib/inprocess.js +20 -0
- package/lib/outofprocess.js +67 -0
- package/lib/protocol/debug.js +27 -0
- package/lib/protocol/serializers.js +172 -0
- package/lib/protocol/transport.js +82 -0
- package/lib/protocol/validator.js +2599 -0
- package/lib/protocol/validatorPrimitives.js +139 -0
- package/lib/remote/playwrightConnection.js +274 -0
- package/lib/remote/playwrightServer.js +110 -0
- package/lib/server/accessibility.js +62 -0
- package/lib/server/android/android.js +441 -0
- package/lib/server/android/backendAdb.js +172 -0
- package/lib/server/artifact.js +104 -0
- package/lib/server/browser.js +129 -0
- package/lib/server/browserContext.js +609 -0
- package/lib/server/browserType.js +300 -0
- package/lib/server/chromium/appIcon.png +0 -0
- package/lib/server/chromium/chromium.js +346 -0
- package/lib/server/chromium/chromiumSwitches.js +41 -0
- package/lib/server/chromium/crAccessibility.js +237 -0
- package/lib/server/chromium/crBrowser.js +521 -0
- package/lib/server/chromium/crConnection.js +228 -0
- package/lib/server/chromium/crCoverage.js +246 -0
- package/lib/server/chromium/crDevTools.js +104 -0
- package/lib/server/chromium/crDragDrop.js +144 -0
- package/lib/server/chromium/crExecutionContext.js +156 -0
- package/lib/server/chromium/crInput.js +171 -0
- package/lib/server/chromium/crNetworkManager.js +723 -0
- package/lib/server/chromium/crPage.js +1173 -0
- package/lib/server/chromium/crPdf.js +147 -0
- package/lib/server/chromium/crProtocolHelper.js +131 -0
- package/lib/server/chromium/crServiceWorker.js +115 -0
- package/lib/server/chromium/defaultFontFamilies.js +145 -0
- package/lib/server/chromium/videoRecorder.js +155 -0
- package/lib/server/console.js +59 -0
- package/lib/server/cookieStore.js +112 -0
- package/lib/server/debugController.js +236 -0
- package/lib/server/debugger.js +132 -0
- package/lib/server/deviceDescriptors.js +21 -0
- package/lib/server/deviceDescriptorsSource.json +1549 -0
- package/lib/server/dialog.js +70 -0
- package/lib/server/dispatchers/androidDispatcher.js +193 -0
- package/lib/server/dispatchers/artifactDispatcher.js +118 -0
- package/lib/server/dispatchers/browserContextDispatcher.js +306 -0
- package/lib/server/dispatchers/browserDispatcher.js +170 -0
- package/lib/server/dispatchers/browserTypeDispatcher.js +55 -0
- package/lib/server/dispatchers/cdpSessionDispatcher.js +48 -0
- package/lib/server/dispatchers/debugControllerDispatcher.js +103 -0
- package/lib/server/dispatchers/dialogDispatcher.js +44 -0
- package/lib/server/dispatchers/dispatcher.js +400 -0
- package/lib/server/dispatchers/electronDispatcher.js +80 -0
- package/lib/server/dispatchers/elementHandlerDispatcher.js +228 -0
- package/lib/server/dispatchers/frameDispatcher.js +287 -0
- package/lib/server/dispatchers/jsHandleDispatcher.js +102 -0
- package/lib/server/dispatchers/jsonPipeDispatcher.js +61 -0
- package/lib/server/dispatchers/localUtilsDispatcher.js +399 -0
- package/lib/server/dispatchers/networkDispatchers.js +221 -0
- package/lib/server/dispatchers/pageDispatcher.js +363 -0
- package/lib/server/dispatchers/playwrightDispatcher.js +105 -0
- package/lib/server/dispatchers/selectorsDispatcher.js +36 -0
- package/lib/server/dispatchers/streamDispatcher.js +62 -0
- package/lib/server/dispatchers/tracingDispatcher.js +54 -0
- package/lib/server/dispatchers/writableStreamDispatcher.js +55 -0
- package/lib/server/dom.js +808 -0
- package/lib/server/download.js +53 -0
- package/lib/server/electron/electron.js +254 -0
- package/lib/server/electron/loader.js +57 -0
- package/lib/server/errors.js +68 -0
- package/lib/server/fetch.js +611 -0
- package/lib/server/fileChooser.js +42 -0
- package/lib/server/fileUploadUtils.js +71 -0
- package/lib/server/firefox/ffAccessibility.js +215 -0
- package/lib/server/firefox/ffBrowser.js +447 -0
- package/lib/server/firefox/ffConnection.js +168 -0
- package/lib/server/firefox/ffExecutionContext.js +138 -0
- package/lib/server/firefox/ffInput.js +150 -0
- package/lib/server/firefox/ffNetworkManager.js +231 -0
- package/lib/server/firefox/ffPage.js +558 -0
- package/lib/server/firefox/firefox.js +91 -0
- package/lib/server/formData.js +75 -0
- package/lib/server/frameSelectors.js +171 -0
- package/lib/server/frames.js +1597 -0
- package/lib/server/har/harRecorder.js +139 -0
- package/lib/server/har/harTracer.js +539 -0
- package/lib/server/helper.js +103 -0
- package/lib/server/index.js +96 -0
- package/lib/server/input.js +301 -0
- package/lib/server/instrumentation.js +74 -0
- package/lib/server/isomorphic/utilityScriptSerializers.js +212 -0
- package/lib/server/javascript.js +305 -0
- package/lib/server/launchApp.js +90 -0
- package/lib/server/macEditingCommands.js +139 -0
- package/lib/server/network.js +607 -0
- package/lib/server/page.js +793 -0
- package/lib/server/pipeTransport.js +85 -0
- package/lib/server/playwright.js +82 -0
- package/lib/server/progress.js +102 -0
- package/lib/server/protocolError.js +49 -0
- package/lib/server/recorder/codeGenerator.js +153 -0
- package/lib/server/recorder/csharp.js +310 -0
- package/lib/server/recorder/java.js +216 -0
- package/lib/server/recorder/javascript.js +229 -0
- package/lib/server/recorder/jsonl.js +47 -0
- package/lib/server/recorder/language.js +44 -0
- package/lib/server/recorder/python.js +275 -0
- package/lib/server/recorder/recorderActions.js +5 -0
- package/lib/server/recorder/recorderApp.js +181 -0
- package/lib/server/recorder/recorderUtils.js +48 -0
- package/lib/server/recorder/utils.js +45 -0
- package/lib/server/recorder.js +700 -0
- package/lib/server/registry/browserFetcher.js +168 -0
- package/lib/server/registry/dependencies.js +322 -0
- package/lib/server/registry/index.js +925 -0
- package/lib/server/registry/nativeDeps.js +383 -0
- package/lib/server/registry/oopDownloadBrowserMain.js +138 -0
- package/lib/server/screenshotter.js +354 -0
- package/lib/server/selectors.js +73 -0
- package/lib/server/socksInterceptor.js +100 -0
- package/lib/server/trace/recorder/snapshotter.js +168 -0
- package/lib/server/trace/recorder/snapshotterInjected.js +493 -0
- package/lib/server/trace/recorder/tracing.js +552 -0
- package/lib/server/trace/test/inMemorySnapshotter.js +93 -0
- package/lib/server/trace/viewer/traceViewer.js +229 -0
- package/lib/server/transport.js +191 -0
- package/lib/server/types.js +24 -0
- package/lib/server/usKeyboardLayout.js +555 -0
- package/lib/server/webkit/webkit.js +87 -0
- package/lib/server/webkit/wkAccessibility.js +194 -0
- package/lib/server/webkit/wkBrowser.js +328 -0
- package/lib/server/webkit/wkConnection.js +173 -0
- package/lib/server/webkit/wkExecutionContext.js +146 -0
- package/lib/server/webkit/wkInput.js +169 -0
- package/lib/server/webkit/wkInterceptableRequest.js +158 -0
- package/lib/server/webkit/wkPage.js +1198 -0
- package/lib/server/webkit/wkProvisionalPage.js +59 -0
- package/lib/server/webkit/wkWorkers.js +104 -0
- package/lib/third_party/diff_match_patch.js +2222 -0
- package/lib/third_party/pixelmatch.js +255 -0
- package/lib/utils/ascii.js +31 -0
- package/lib/utils/comparators.js +171 -0
- package/lib/utils/crypto.js +33 -0
- package/lib/utils/debug.js +46 -0
- package/lib/utils/debugLogger.js +89 -0
- package/lib/utils/env.js +47 -0
- package/lib/utils/eventsHelper.js +38 -0
- package/lib/utils/fileUtils.js +66 -0
- package/lib/utils/glob.js +83 -0
- package/lib/utils/happy-eyeballs.js +154 -0
- package/lib/utils/headers.js +52 -0
- package/lib/utils/hostPlatform.js +124 -0
- package/lib/utils/httpServer.js +195 -0
- package/lib/utils/index.js +324 -0
- package/lib/utils/isomorphic/cssParser.js +250 -0
- package/lib/utils/isomorphic/cssTokenizer.js +979 -0
- package/lib/utils/isomorphic/locatorGenerators.js +651 -0
- package/lib/utils/isomorphic/locatorParser.js +179 -0
- package/lib/utils/isomorphic/locatorUtils.js +62 -0
- package/lib/utils/isomorphic/selectorParser.js +397 -0
- package/lib/utils/isomorphic/stringUtils.js +107 -0
- package/lib/utils/isomorphic/traceUtils.js +39 -0
- package/lib/utils/linuxUtils.js +78 -0
- package/lib/utils/manualPromise.js +109 -0
- package/lib/utils/mimeType.js +29 -0
- package/lib/utils/multimap.js +75 -0
- package/lib/utils/network.js +189 -0
- package/lib/utils/processLauncher.js +248 -0
- package/lib/utils/profiler.js +53 -0
- package/lib/utils/rtti.js +41 -0
- package/lib/utils/semaphore.js +51 -0
- package/lib/utils/spawnAsync.js +45 -0
- package/lib/utils/stackTrace.js +123 -0
- package/lib/utils/task.js +58 -0
- package/lib/utils/time.js +37 -0
- package/lib/utils/timeoutRunner.js +131 -0
- package/lib/utils/traceUtils.js +44 -0
- package/lib/utils/userAgent.js +105 -0
- package/lib/utils/wsServer.js +125 -0
- package/lib/utils/zipFile.js +75 -0
- package/lib/utils/zones.js +99 -0
- package/lib/utilsBundle.js +81 -0
- package/lib/utilsBundleImpl/index.js +51 -0
- package/lib/utilsBundleImpl/xdg-open +1066 -0
- package/lib/vite/htmlReport/index.html +66 -0
- package/lib/vite/recorder/assets/codeMirrorModule-Hs9-1ZG4.css +1 -0
- package/lib/vite/recorder/assets/codeMirrorModule-I9ks4y7D.js +24 -0
- package/lib/vite/recorder/assets/codicon-zGuYmc9o.ttf +0 -0
- package/lib/vite/recorder/assets/index-ljsTwXtJ.css +1 -0
- package/lib/vite/recorder/assets/index-yg8ypzl6.js +47 -0
- package/lib/vite/recorder/index.html +29 -0
- package/lib/vite/recorder/playwright-logo.svg +9 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-GluP1cQ1.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-fqJB1XDu.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-y3M3aAqy.js +24 -0
- package/lib/vite/traceViewer/assets/wsPort-Rvwd4WC-.js +69 -0
- package/lib/vite/traceViewer/assets/wsPort-dlD7vDkY.js +69 -0
- package/lib/vite/traceViewer/assets/wsPort-qOE2NWrO.js +69 -0
- package/lib/vite/traceViewer/assets/xtermModule-Yt6xwiJ_.js +9 -0
- package/lib/vite/traceViewer/codeMirrorModule.Hs9-1ZG4.css +1 -0
- package/lib/vite/traceViewer/codicon.zGuYmc9o.ttf +0 -0
- package/lib/vite/traceViewer/index.-g_5lMbJ.css +1 -0
- package/lib/vite/traceViewer/index.4X7zDysg.js +2 -0
- package/lib/vite/traceViewer/index.HkJgzlGy.js +2 -0
- package/lib/vite/traceViewer/index.html +26 -0
- package/lib/vite/traceViewer/index.kRjx5sAJ.js +2 -0
- package/lib/vite/traceViewer/playwright-logo.svg +9 -0
- package/lib/vite/traceViewer/snapshot.html +21 -0
- package/lib/vite/traceViewer/sw.bundle.js +4 -0
- package/lib/vite/traceViewer/uiMode.1Wcp_Kto.js +10 -0
- package/lib/vite/traceViewer/uiMode.GTNzARcV.js +10 -0
- package/lib/vite/traceViewer/uiMode.html +17 -0
- package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +1 -0
- package/lib/vite/traceViewer/uiMode.zV-7Lf9v.js +10 -0
- package/lib/vite/traceViewer/wsPort.kSgQKQ0y.css +1 -0
- package/lib/vite/traceViewer/xtermModule.0lwXJFHT.css +32 -0
- package/lib/zipBundle.js +25 -0
- package/lib/zipBundleImpl.js +5 -0
- package/package.json +43 -0
- package/types/protocol.d.ts +20304 -0
- package/types/structs.d.ts +45 -0
- package/types/types.d.ts +20626 -0
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.WebSocket = exports.STATUS_TEXTS = exports.Route = exports.Response = exports.Request = void 0;
|
|
7
|
+
exports.filterCookies = filterCookies;
|
|
8
|
+
exports.kMaxCookieExpiresDateInSeconds = void 0;
|
|
9
|
+
exports.mergeHeaders = mergeHeaders;
|
|
10
|
+
exports.parsedURL = parsedURL;
|
|
11
|
+
exports.rewriteCookies = rewriteCookies;
|
|
12
|
+
exports.singleHeader = singleHeader;
|
|
13
|
+
exports.stripFragmentFromUrl = stripFragmentFromUrl;
|
|
14
|
+
var _utils = require("../utils");
|
|
15
|
+
var _manualPromise = require("../utils/manualPromise");
|
|
16
|
+
var _instrumentation = require("./instrumentation");
|
|
17
|
+
var _fetch = require("./fetch");
|
|
18
|
+
var _browserContext = require("./browserContext");
|
|
19
|
+
/**
|
|
20
|
+
* 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
|
+
|
|
35
|
+
function filterCookies(cookies, urls) {
|
|
36
|
+
const parsedURLs = urls.map(s => new URL(s));
|
|
37
|
+
// Chromiums's cookies are missing sameSite when it is 'None'
|
|
38
|
+
return cookies.filter(c => {
|
|
39
|
+
if (!parsedURLs.length) return true;
|
|
40
|
+
for (const parsedURL of parsedURLs) {
|
|
41
|
+
let domain = c.domain;
|
|
42
|
+
if (!domain.startsWith('.')) domain = '.' + domain;
|
|
43
|
+
if (!('.' + parsedURL.hostname).endsWith(domain)) continue;
|
|
44
|
+
if (!parsedURL.pathname.startsWith(c.path)) continue;
|
|
45
|
+
if (parsedURL.protocol !== 'https:' && parsedURL.hostname !== 'localhost' && c.secure) continue;
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Rollover to 5-digit year:
|
|
53
|
+
// 253402300799 == Fri, 31 Dec 9999 23:59:59 +0000 (UTC)
|
|
54
|
+
// 253402300800 == Sat, 1 Jan 1000 00:00:00 +0000 (UTC)
|
|
55
|
+
const kMaxCookieExpiresDateInSeconds = exports.kMaxCookieExpiresDateInSeconds = 253402300799;
|
|
56
|
+
function rewriteCookies(cookies) {
|
|
57
|
+
return cookies.map(c => {
|
|
58
|
+
(0, _utils.assert)(c.url || c.domain && c.path, 'Cookie should have a url or a domain/path pair');
|
|
59
|
+
(0, _utils.assert)(!(c.url && c.domain), 'Cookie should have either url or domain');
|
|
60
|
+
(0, _utils.assert)(!(c.url && c.path), 'Cookie should have either url or path');
|
|
61
|
+
(0, _utils.assert)(!(c.expires && c.expires < 0 && c.expires !== -1), 'Cookie should have a valid expires, only -1 or a positive number for the unix timestamp in seconds is allowed');
|
|
62
|
+
(0, _utils.assert)(!(c.expires && c.expires > 0 && c.expires > kMaxCookieExpiresDateInSeconds), 'Cookie should have a valid expires, only -1 or a positive number for the unix timestamp in seconds is allowed');
|
|
63
|
+
const copy = {
|
|
64
|
+
...c
|
|
65
|
+
};
|
|
66
|
+
if (copy.url) {
|
|
67
|
+
(0, _utils.assert)(copy.url !== 'about:blank', `Blank page can not have cookie "${c.name}"`);
|
|
68
|
+
(0, _utils.assert)(!copy.url.startsWith('data:'), `Data URL page can not have cookie "${c.name}"`);
|
|
69
|
+
const url = new URL(copy.url);
|
|
70
|
+
copy.domain = url.hostname;
|
|
71
|
+
copy.path = url.pathname.substring(0, url.pathname.lastIndexOf('/') + 1);
|
|
72
|
+
copy.secure = url.protocol === 'https:';
|
|
73
|
+
}
|
|
74
|
+
return copy;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function parsedURL(url) {
|
|
78
|
+
try {
|
|
79
|
+
return new URL(url);
|
|
80
|
+
} catch (e) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function stripFragmentFromUrl(url) {
|
|
85
|
+
if (!url.includes('#')) return url;
|
|
86
|
+
return url.substring(0, url.indexOf('#'));
|
|
87
|
+
}
|
|
88
|
+
class Request extends _instrumentation.SdkObject {
|
|
89
|
+
constructor(context, frame, serviceWorker, redirectedFrom, documentId, url, resourceType, method, postData, headers) {
|
|
90
|
+
super(frame || context, 'request');
|
|
91
|
+
this._response = null;
|
|
92
|
+
this._redirectedFrom = void 0;
|
|
93
|
+
this._redirectedTo = null;
|
|
94
|
+
this._documentId = void 0;
|
|
95
|
+
this._isFavicon = void 0;
|
|
96
|
+
this._failureText = null;
|
|
97
|
+
this._url = void 0;
|
|
98
|
+
this._resourceType = void 0;
|
|
99
|
+
this._method = void 0;
|
|
100
|
+
this._postData = void 0;
|
|
101
|
+
this._headers = void 0;
|
|
102
|
+
this._headersMap = new Map();
|
|
103
|
+
this._frame = null;
|
|
104
|
+
this._serviceWorker = null;
|
|
105
|
+
this._context = void 0;
|
|
106
|
+
this._rawRequestHeadersPromise = new _manualPromise.ManualPromise();
|
|
107
|
+
this._waitForResponsePromise = new _manualPromise.ManualPromise();
|
|
108
|
+
this._responseEndTiming = -1;
|
|
109
|
+
this._overrides = void 0;
|
|
110
|
+
(0, _utils.assert)(!url.startsWith('data:'), 'Data urls should not fire requests');
|
|
111
|
+
this._context = context;
|
|
112
|
+
this._frame = frame;
|
|
113
|
+
this._serviceWorker = serviceWorker;
|
|
114
|
+
this._redirectedFrom = redirectedFrom;
|
|
115
|
+
if (redirectedFrom) redirectedFrom._redirectedTo = this;
|
|
116
|
+
this._documentId = documentId;
|
|
117
|
+
this._url = stripFragmentFromUrl(url);
|
|
118
|
+
this._resourceType = resourceType;
|
|
119
|
+
this._method = method;
|
|
120
|
+
this._postData = postData;
|
|
121
|
+
this._headers = headers;
|
|
122
|
+
this._updateHeadersMap();
|
|
123
|
+
this._isFavicon = url.endsWith('/favicon.ico') || !!(redirectedFrom !== null && redirectedFrom !== void 0 && redirectedFrom._isFavicon);
|
|
124
|
+
}
|
|
125
|
+
_setFailureText(failureText) {
|
|
126
|
+
this._failureText = failureText;
|
|
127
|
+
this._waitForResponsePromise.resolve(null);
|
|
128
|
+
}
|
|
129
|
+
_setOverrides(overrides) {
|
|
130
|
+
this._overrides = overrides;
|
|
131
|
+
this._updateHeadersMap();
|
|
132
|
+
}
|
|
133
|
+
_updateHeadersMap() {
|
|
134
|
+
for (const {
|
|
135
|
+
name,
|
|
136
|
+
value
|
|
137
|
+
} of this.headers()) this._headersMap.set(name.toLowerCase(), value);
|
|
138
|
+
}
|
|
139
|
+
_hasOverrides() {
|
|
140
|
+
return !!this._overrides;
|
|
141
|
+
}
|
|
142
|
+
url() {
|
|
143
|
+
var _this$_overrides;
|
|
144
|
+
return ((_this$_overrides = this._overrides) === null || _this$_overrides === void 0 ? void 0 : _this$_overrides.url) || this._url;
|
|
145
|
+
}
|
|
146
|
+
resourceType() {
|
|
147
|
+
return this._resourceType;
|
|
148
|
+
}
|
|
149
|
+
method() {
|
|
150
|
+
var _this$_overrides2;
|
|
151
|
+
return ((_this$_overrides2 = this._overrides) === null || _this$_overrides2 === void 0 ? void 0 : _this$_overrides2.method) || this._method;
|
|
152
|
+
}
|
|
153
|
+
postDataBuffer() {
|
|
154
|
+
var _this$_overrides3;
|
|
155
|
+
return ((_this$_overrides3 = this._overrides) === null || _this$_overrides3 === void 0 ? void 0 : _this$_overrides3.postData) || this._postData;
|
|
156
|
+
}
|
|
157
|
+
headers() {
|
|
158
|
+
var _this$_overrides4;
|
|
159
|
+
return ((_this$_overrides4 = this._overrides) === null || _this$_overrides4 === void 0 ? void 0 : _this$_overrides4.headers) || this._headers;
|
|
160
|
+
}
|
|
161
|
+
headerValue(name) {
|
|
162
|
+
return this._headersMap.get(name);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// "null" means no raw headers available - we'll use provisional headers as raw headers.
|
|
166
|
+
setRawRequestHeaders(headers) {
|
|
167
|
+
if (!this._rawRequestHeadersPromise.isDone()) this._rawRequestHeadersPromise.resolve(headers || this._headers);
|
|
168
|
+
}
|
|
169
|
+
async rawRequestHeaders() {
|
|
170
|
+
var _this$_overrides5;
|
|
171
|
+
return ((_this$_overrides5 = this._overrides) === null || _this$_overrides5 === void 0 ? void 0 : _this$_overrides5.headers) || this._rawRequestHeadersPromise;
|
|
172
|
+
}
|
|
173
|
+
response() {
|
|
174
|
+
return this._waitForResponsePromise;
|
|
175
|
+
}
|
|
176
|
+
_existingResponse() {
|
|
177
|
+
return this._response;
|
|
178
|
+
}
|
|
179
|
+
_setResponse(response) {
|
|
180
|
+
this._response = response;
|
|
181
|
+
this._waitForResponsePromise.resolve(response);
|
|
182
|
+
}
|
|
183
|
+
_finalRequest() {
|
|
184
|
+
return this._redirectedTo ? this._redirectedTo._finalRequest() : this;
|
|
185
|
+
}
|
|
186
|
+
frame() {
|
|
187
|
+
return this._frame;
|
|
188
|
+
}
|
|
189
|
+
serviceWorker() {
|
|
190
|
+
return this._serviceWorker;
|
|
191
|
+
}
|
|
192
|
+
isNavigationRequest() {
|
|
193
|
+
return !!this._documentId;
|
|
194
|
+
}
|
|
195
|
+
redirectedFrom() {
|
|
196
|
+
return this._redirectedFrom;
|
|
197
|
+
}
|
|
198
|
+
failure() {
|
|
199
|
+
if (this._failureText === null) return null;
|
|
200
|
+
return {
|
|
201
|
+
errorText: this._failureText
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
bodySize() {
|
|
205
|
+
var _this$postDataBuffer;
|
|
206
|
+
return ((_this$postDataBuffer = this.postDataBuffer()) === null || _this$postDataBuffer === void 0 ? void 0 : _this$postDataBuffer.length) || 0;
|
|
207
|
+
}
|
|
208
|
+
async requestHeadersSize() {
|
|
209
|
+
let headersSize = 4; // 4 = 2 spaces + 2 line breaks (GET /path \r\n)
|
|
210
|
+
headersSize += this.method().length;
|
|
211
|
+
headersSize += new URL(this.url()).pathname.length;
|
|
212
|
+
headersSize += 8; // httpVersion
|
|
213
|
+
const headers = await this.rawRequestHeaders();
|
|
214
|
+
for (const header of headers) headersSize += header.name.length + header.value.length + 4; // 4 = ': ' + '\r\n'
|
|
215
|
+
return headersSize;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
exports.Request = Request;
|
|
219
|
+
class Route extends _instrumentation.SdkObject {
|
|
220
|
+
constructor(request, delegate) {
|
|
221
|
+
super(request._frame || request._context, 'route');
|
|
222
|
+
this._request = void 0;
|
|
223
|
+
this._delegate = void 0;
|
|
224
|
+
this._handled = false;
|
|
225
|
+
this._request = request;
|
|
226
|
+
this._delegate = delegate;
|
|
227
|
+
this._request._context.addRouteInFlight(this);
|
|
228
|
+
}
|
|
229
|
+
request() {
|
|
230
|
+
return this._request;
|
|
231
|
+
}
|
|
232
|
+
async abort(errorCode = 'failed') {
|
|
233
|
+
this._startHandling();
|
|
234
|
+
this._request._context.emit(_browserContext.BrowserContext.Events.RequestAborted, this._request);
|
|
235
|
+
await this._delegate.abort(errorCode);
|
|
236
|
+
this._endHandling();
|
|
237
|
+
}
|
|
238
|
+
async redirectNavigationRequest(url) {
|
|
239
|
+
this._startHandling();
|
|
240
|
+
(0, _utils.assert)(this._request.isNavigationRequest());
|
|
241
|
+
this._request.frame().redirectNavigation(url, this._request._documentId, this._request.headerValue('referer'));
|
|
242
|
+
}
|
|
243
|
+
async fulfill(overrides) {
|
|
244
|
+
this._startHandling();
|
|
245
|
+
let body = overrides.body;
|
|
246
|
+
let isBase64 = overrides.isBase64 || false;
|
|
247
|
+
if (body === undefined) {
|
|
248
|
+
if (overrides.fetchResponseUid) {
|
|
249
|
+
const buffer = this._request._context.fetchRequest.fetchResponses.get(overrides.fetchResponseUid) || _fetch.APIRequestContext.findResponseBody(overrides.fetchResponseUid);
|
|
250
|
+
(0, _utils.assert)(buffer, 'Fetch response has been disposed');
|
|
251
|
+
body = buffer.toString('base64');
|
|
252
|
+
isBase64 = true;
|
|
253
|
+
} else {
|
|
254
|
+
body = '';
|
|
255
|
+
isBase64 = false;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const headers = [...(overrides.headers || [])];
|
|
259
|
+
this._maybeAddCorsHeaders(headers);
|
|
260
|
+
this._request._context.emit(_browserContext.BrowserContext.Events.RequestFulfilled, this._request);
|
|
261
|
+
await this._delegate.fulfill({
|
|
262
|
+
status: overrides.status || 200,
|
|
263
|
+
headers,
|
|
264
|
+
body: body,
|
|
265
|
+
isBase64
|
|
266
|
+
});
|
|
267
|
+
this._endHandling();
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// See https://github.com/microsoft/playwright/issues/12929
|
|
271
|
+
_maybeAddCorsHeaders(headers) {
|
|
272
|
+
const origin = this._request.headerValue('origin');
|
|
273
|
+
if (!origin) return;
|
|
274
|
+
const requestUrl = new URL(this._request.url());
|
|
275
|
+
if (!requestUrl.protocol.startsWith('http')) return;
|
|
276
|
+
if (requestUrl.origin === origin.trim()) return;
|
|
277
|
+
const corsHeader = headers.find(({
|
|
278
|
+
name
|
|
279
|
+
}) => name === 'access-control-allow-origin');
|
|
280
|
+
if (corsHeader) return;
|
|
281
|
+
headers.push({
|
|
282
|
+
name: 'access-control-allow-origin',
|
|
283
|
+
value: origin
|
|
284
|
+
});
|
|
285
|
+
headers.push({
|
|
286
|
+
name: 'access-control-allow-credentials',
|
|
287
|
+
value: 'true'
|
|
288
|
+
});
|
|
289
|
+
headers.push({
|
|
290
|
+
name: 'vary',
|
|
291
|
+
value: 'Origin'
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
async continue(overrides) {
|
|
295
|
+
this._startHandling();
|
|
296
|
+
if (overrides.url) {
|
|
297
|
+
const newUrl = new URL(overrides.url);
|
|
298
|
+
const oldUrl = new URL(this._request.url());
|
|
299
|
+
if (oldUrl.protocol !== newUrl.protocol) throw new Error('New URL must have same protocol as overridden URL');
|
|
300
|
+
}
|
|
301
|
+
this._request._setOverrides(overrides);
|
|
302
|
+
if (!overrides.isFallback) this._request._context.emit(_browserContext.BrowserContext.Events.RequestContinued, this._request);
|
|
303
|
+
await this._delegate.continue(this._request, overrides);
|
|
304
|
+
this._endHandling();
|
|
305
|
+
}
|
|
306
|
+
_startHandling() {
|
|
307
|
+
(0, _utils.assert)(!this._handled, 'Route is already handled!');
|
|
308
|
+
this._handled = true;
|
|
309
|
+
}
|
|
310
|
+
_endHandling() {
|
|
311
|
+
this._request._context.removeRouteInFlight(this);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
exports.Route = Route;
|
|
315
|
+
class Response extends _instrumentation.SdkObject {
|
|
316
|
+
constructor(request, status, statusText, headers, timing, getResponseBodyCallback, fromServiceWorker, httpVersion) {
|
|
317
|
+
super(request.frame() || request._context, 'response');
|
|
318
|
+
this._request = void 0;
|
|
319
|
+
this._contentPromise = null;
|
|
320
|
+
this._finishedPromise = new _manualPromise.ManualPromise();
|
|
321
|
+
this._status = void 0;
|
|
322
|
+
this._statusText = void 0;
|
|
323
|
+
this._url = void 0;
|
|
324
|
+
this._headers = void 0;
|
|
325
|
+
this._headersMap = new Map();
|
|
326
|
+
this._getResponseBodyCallback = void 0;
|
|
327
|
+
this._timing = void 0;
|
|
328
|
+
this._serverAddrPromise = new _manualPromise.ManualPromise();
|
|
329
|
+
this._securityDetailsPromise = new _manualPromise.ManualPromise();
|
|
330
|
+
this._rawResponseHeadersPromise = new _manualPromise.ManualPromise();
|
|
331
|
+
this._httpVersion = void 0;
|
|
332
|
+
this._fromServiceWorker = void 0;
|
|
333
|
+
this._encodedBodySizePromise = new _manualPromise.ManualPromise();
|
|
334
|
+
this._transferSizePromise = new _manualPromise.ManualPromise();
|
|
335
|
+
this._responseHeadersSizePromise = new _manualPromise.ManualPromise();
|
|
336
|
+
this._request = request;
|
|
337
|
+
this._timing = timing;
|
|
338
|
+
this._status = status;
|
|
339
|
+
this._statusText = statusText;
|
|
340
|
+
this._url = request.url();
|
|
341
|
+
this._headers = headers;
|
|
342
|
+
for (const {
|
|
343
|
+
name,
|
|
344
|
+
value
|
|
345
|
+
} of this._headers) this._headersMap.set(name.toLowerCase(), value);
|
|
346
|
+
this._getResponseBodyCallback = getResponseBodyCallback;
|
|
347
|
+
this._request._setResponse(this);
|
|
348
|
+
this._httpVersion = httpVersion;
|
|
349
|
+
this._fromServiceWorker = fromServiceWorker;
|
|
350
|
+
}
|
|
351
|
+
_serverAddrFinished(addr) {
|
|
352
|
+
this._serverAddrPromise.resolve(addr);
|
|
353
|
+
}
|
|
354
|
+
_securityDetailsFinished(securityDetails) {
|
|
355
|
+
this._securityDetailsPromise.resolve(securityDetails);
|
|
356
|
+
}
|
|
357
|
+
_requestFinished(responseEndTiming) {
|
|
358
|
+
this._request._responseEndTiming = Math.max(responseEndTiming, this._timing.responseStart);
|
|
359
|
+
// Set start time equal to end when request is served from memory cache.
|
|
360
|
+
if (this._timing.requestStart === -1) this._timing.requestStart = this._request._responseEndTiming;
|
|
361
|
+
this._finishedPromise.resolve();
|
|
362
|
+
}
|
|
363
|
+
_setHttpVersion(httpVersion) {
|
|
364
|
+
this._httpVersion = httpVersion;
|
|
365
|
+
}
|
|
366
|
+
url() {
|
|
367
|
+
return this._url;
|
|
368
|
+
}
|
|
369
|
+
status() {
|
|
370
|
+
return this._status;
|
|
371
|
+
}
|
|
372
|
+
statusText() {
|
|
373
|
+
return this._statusText;
|
|
374
|
+
}
|
|
375
|
+
headers() {
|
|
376
|
+
return this._headers;
|
|
377
|
+
}
|
|
378
|
+
headerValue(name) {
|
|
379
|
+
return this._headersMap.get(name);
|
|
380
|
+
}
|
|
381
|
+
async rawResponseHeaders() {
|
|
382
|
+
return this._rawResponseHeadersPromise;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// "null" means no raw headers available - we'll use provisional headers as raw headers.
|
|
386
|
+
setRawResponseHeaders(headers) {
|
|
387
|
+
if (!this._rawResponseHeadersPromise.isDone()) this._rawResponseHeadersPromise.resolve(headers || this._headers);
|
|
388
|
+
}
|
|
389
|
+
setTransferSize(size) {
|
|
390
|
+
this._transferSizePromise.resolve(size);
|
|
391
|
+
}
|
|
392
|
+
setEncodedBodySize(size) {
|
|
393
|
+
this._encodedBodySizePromise.resolve(size);
|
|
394
|
+
}
|
|
395
|
+
setResponseHeadersSize(size) {
|
|
396
|
+
this._responseHeadersSizePromise.resolve(size);
|
|
397
|
+
}
|
|
398
|
+
timing() {
|
|
399
|
+
return this._timing;
|
|
400
|
+
}
|
|
401
|
+
async serverAddr() {
|
|
402
|
+
return (await this._serverAddrPromise) || null;
|
|
403
|
+
}
|
|
404
|
+
async securityDetails() {
|
|
405
|
+
return (await this._securityDetailsPromise) || null;
|
|
406
|
+
}
|
|
407
|
+
body() {
|
|
408
|
+
if (!this._contentPromise) {
|
|
409
|
+
this._contentPromise = this._finishedPromise.then(async () => {
|
|
410
|
+
if (this._status >= 300 && this._status <= 399) throw new Error('Response body is unavailable for redirect responses');
|
|
411
|
+
return this._getResponseBodyCallback();
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
return this._contentPromise;
|
|
415
|
+
}
|
|
416
|
+
request() {
|
|
417
|
+
return this._request;
|
|
418
|
+
}
|
|
419
|
+
frame() {
|
|
420
|
+
return this._request.frame();
|
|
421
|
+
}
|
|
422
|
+
httpVersion() {
|
|
423
|
+
if (!this._httpVersion) return 'HTTP/1.1';
|
|
424
|
+
if (this._httpVersion === 'http/1.1') return 'HTTP/1.1';
|
|
425
|
+
if (this._httpVersion === 'h2') return 'HTTP/2.0';
|
|
426
|
+
return this._httpVersion;
|
|
427
|
+
}
|
|
428
|
+
fromServiceWorker() {
|
|
429
|
+
return this._fromServiceWorker;
|
|
430
|
+
}
|
|
431
|
+
async responseHeadersSize() {
|
|
432
|
+
const availableSize = await this._responseHeadersSizePromise;
|
|
433
|
+
if (availableSize !== null) return availableSize;
|
|
434
|
+
|
|
435
|
+
// Fallback to calculating it manually.
|
|
436
|
+
let headersSize = 4; // 4 = 2 spaces + 2 line breaks (HTTP/1.1 200 Ok\r\n)
|
|
437
|
+
headersSize += 8; // httpVersion;
|
|
438
|
+
headersSize += 3; // statusCode;
|
|
439
|
+
headersSize += this.statusText().length;
|
|
440
|
+
const headers = await this._rawResponseHeadersPromise;
|
|
441
|
+
for (const header of headers) headersSize += header.name.length + header.value.length + 4; // 4 = ': ' + '\r\n'
|
|
442
|
+
headersSize += 2; // '\r\n'
|
|
443
|
+
return headersSize;
|
|
444
|
+
}
|
|
445
|
+
async sizes() {
|
|
446
|
+
const requestHeadersSize = await this._request.requestHeadersSize();
|
|
447
|
+
const responseHeadersSize = await this.responseHeadersSize();
|
|
448
|
+
let encodedBodySize = await this._encodedBodySizePromise;
|
|
449
|
+
if (encodedBodySize === null) {
|
|
450
|
+
var _headers$find;
|
|
451
|
+
// Fallback to calculating it manually.
|
|
452
|
+
const headers = await this._rawResponseHeadersPromise;
|
|
453
|
+
const contentLength = (_headers$find = headers.find(h => h.name.toLowerCase() === 'content-length')) === null || _headers$find === void 0 ? void 0 : _headers$find.value;
|
|
454
|
+
encodedBodySize = contentLength ? +contentLength : 0;
|
|
455
|
+
}
|
|
456
|
+
let transferSize = await this._transferSizePromise;
|
|
457
|
+
if (transferSize === null) {
|
|
458
|
+
// Fallback to calculating it manually.
|
|
459
|
+
transferSize = responseHeadersSize + encodedBodySize;
|
|
460
|
+
}
|
|
461
|
+
return {
|
|
462
|
+
requestBodySize: this._request.bodySize(),
|
|
463
|
+
requestHeadersSize,
|
|
464
|
+
responseBodySize: encodedBodySize,
|
|
465
|
+
responseHeadersSize,
|
|
466
|
+
transferSize
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
exports.Response = Response;
|
|
471
|
+
class WebSocket extends _instrumentation.SdkObject {
|
|
472
|
+
constructor(parent, url) {
|
|
473
|
+
super(parent, 'ws');
|
|
474
|
+
this._url = void 0;
|
|
475
|
+
this._notified = false;
|
|
476
|
+
this._url = url;
|
|
477
|
+
}
|
|
478
|
+
markAsNotified() {
|
|
479
|
+
// Sometimes we get "onWebSocketRequest" twice, at least in Chromium.
|
|
480
|
+
// Perhaps websocket is restarted because of chrome.webRequest extensions api?
|
|
481
|
+
// Or maybe the handshake response was a redirect?
|
|
482
|
+
if (this._notified) return false;
|
|
483
|
+
this._notified = true;
|
|
484
|
+
return true;
|
|
485
|
+
}
|
|
486
|
+
url() {
|
|
487
|
+
return this._url;
|
|
488
|
+
}
|
|
489
|
+
frameSent(opcode, data) {
|
|
490
|
+
this.emit(WebSocket.Events.FrameSent, {
|
|
491
|
+
opcode,
|
|
492
|
+
data
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
frameReceived(opcode, data) {
|
|
496
|
+
this.emit(WebSocket.Events.FrameReceived, {
|
|
497
|
+
opcode,
|
|
498
|
+
data
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
error(errorMessage) {
|
|
502
|
+
this.emit(WebSocket.Events.SocketError, errorMessage);
|
|
503
|
+
}
|
|
504
|
+
closed() {
|
|
505
|
+
this.emit(WebSocket.Events.Close);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
exports.WebSocket = WebSocket;
|
|
509
|
+
WebSocket.Events = {
|
|
510
|
+
Close: 'close',
|
|
511
|
+
SocketError: 'socketerror',
|
|
512
|
+
FrameReceived: 'framereceived',
|
|
513
|
+
FrameSent: 'framesent'
|
|
514
|
+
};
|
|
515
|
+
// List taken from https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml with extra 306 and 418 codes.
|
|
516
|
+
const STATUS_TEXTS = exports.STATUS_TEXTS = {
|
|
517
|
+
'100': 'Continue',
|
|
518
|
+
'101': 'Switching Protocols',
|
|
519
|
+
'102': 'Processing',
|
|
520
|
+
'103': 'Early Hints',
|
|
521
|
+
'200': 'OK',
|
|
522
|
+
'201': 'Created',
|
|
523
|
+
'202': 'Accepted',
|
|
524
|
+
'203': 'Non-Authoritative Information',
|
|
525
|
+
'204': 'No Content',
|
|
526
|
+
'205': 'Reset Content',
|
|
527
|
+
'206': 'Partial Content',
|
|
528
|
+
'207': 'Multi-Status',
|
|
529
|
+
'208': 'Already Reported',
|
|
530
|
+
'226': 'IM Used',
|
|
531
|
+
'300': 'Multiple Choices',
|
|
532
|
+
'301': 'Moved Permanently',
|
|
533
|
+
'302': 'Found',
|
|
534
|
+
'303': 'See Other',
|
|
535
|
+
'304': 'Not Modified',
|
|
536
|
+
'305': 'Use Proxy',
|
|
537
|
+
'306': 'Switch Proxy',
|
|
538
|
+
'307': 'Temporary Redirect',
|
|
539
|
+
'308': 'Permanent Redirect',
|
|
540
|
+
'400': 'Bad Request',
|
|
541
|
+
'401': 'Unauthorized',
|
|
542
|
+
'402': 'Payment Required',
|
|
543
|
+
'403': 'Forbidden',
|
|
544
|
+
'404': 'Not Found',
|
|
545
|
+
'405': 'Method Not Allowed',
|
|
546
|
+
'406': 'Not Acceptable',
|
|
547
|
+
'407': 'Proxy Authentication Required',
|
|
548
|
+
'408': 'Request Timeout',
|
|
549
|
+
'409': 'Conflict',
|
|
550
|
+
'410': 'Gone',
|
|
551
|
+
'411': 'Length Required',
|
|
552
|
+
'412': 'Precondition Failed',
|
|
553
|
+
'413': 'Payload Too Large',
|
|
554
|
+
'414': 'URI Too Long',
|
|
555
|
+
'415': 'Unsupported Media Type',
|
|
556
|
+
'416': 'Range Not Satisfiable',
|
|
557
|
+
'417': 'Expectation Failed',
|
|
558
|
+
'418': 'I\'m a teapot',
|
|
559
|
+
'421': 'Misdirected Request',
|
|
560
|
+
'422': 'Unprocessable Entity',
|
|
561
|
+
'423': 'Locked',
|
|
562
|
+
'424': 'Failed Dependency',
|
|
563
|
+
'425': 'Too Early',
|
|
564
|
+
'426': 'Upgrade Required',
|
|
565
|
+
'428': 'Precondition Required',
|
|
566
|
+
'429': 'Too Many Requests',
|
|
567
|
+
'431': 'Request Header Fields Too Large',
|
|
568
|
+
'451': 'Unavailable For Legal Reasons',
|
|
569
|
+
'500': 'Internal Server Error',
|
|
570
|
+
'501': 'Not Implemented',
|
|
571
|
+
'502': 'Bad Gateway',
|
|
572
|
+
'503': 'Service Unavailable',
|
|
573
|
+
'504': 'Gateway Timeout',
|
|
574
|
+
'505': 'HTTP Version Not Supported',
|
|
575
|
+
'506': 'Variant Also Negotiates',
|
|
576
|
+
'507': 'Insufficient Storage',
|
|
577
|
+
'508': 'Loop Detected',
|
|
578
|
+
'510': 'Not Extended',
|
|
579
|
+
'511': 'Network Authentication Required'
|
|
580
|
+
};
|
|
581
|
+
function singleHeader(name, value) {
|
|
582
|
+
return [{
|
|
583
|
+
name,
|
|
584
|
+
value
|
|
585
|
+
}];
|
|
586
|
+
}
|
|
587
|
+
function mergeHeaders(headers) {
|
|
588
|
+
const lowerCaseToValue = new Map();
|
|
589
|
+
const lowerCaseToOriginalCase = new Map();
|
|
590
|
+
for (const h of headers) {
|
|
591
|
+
if (!h) continue;
|
|
592
|
+
for (const {
|
|
593
|
+
name,
|
|
594
|
+
value
|
|
595
|
+
} of h) {
|
|
596
|
+
const lower = name.toLowerCase();
|
|
597
|
+
lowerCaseToOriginalCase.set(lower, name);
|
|
598
|
+
lowerCaseToValue.set(lower, value);
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
const result = [];
|
|
602
|
+
for (const [lower, value] of lowerCaseToValue) result.push({
|
|
603
|
+
name: lowerCaseToOriginalCase.get(lower),
|
|
604
|
+
value
|
|
605
|
+
});
|
|
606
|
+
return result;
|
|
607
|
+
}
|