-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsetHeadersAndNavigateToUrl.ts
More file actions
91 lines (72 loc) · 2.45 KB
/
setHeadersAndNavigateToUrl.ts
File metadata and controls
91 lines (72 loc) · 2.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import {AsyncLocalStorage} from 'node:async_hooks';
import {ADDITIONAL_STEP_TIMEOUT, LogEventType} from '../constants/internal';
import {step} from '../step';
import {getPlaywrightPage} from '../useContext';
import {assertValueIsDefined} from '../utils/asserts';
import {getFullPackConfig} from '../utils/config';
import {applyHeadersMapper} from '../utils/headers';
import {navigateToUrl} from './navigateToUrl';
import type {
MapOptions,
NavigateToUrlOptions,
NavigationReturn,
StringHeaders,
Url,
} from '../types/internal';
/**
* Navigates to the `url` and map custom response and request headers.
*/
export const setHeadersAndNavigateToUrl = async (
url: Url,
{mapRequestHeaders, mapResponseHeaders, skipLogs = false}: MapOptions,
navigateToUrlOptions?: NavigateToUrlOptions,
): Promise<NavigationReturn> => {
let navigationReturn: NavigationReturn | undefined;
const timeout = navigateToUrlOptions?.timeout ?? getFullPackConfig().navigationTimeout;
await step(
`Navigate to ${url} and map headers`,
async () => {
let requestHeaders: StringHeaders | undefined;
let responseHeaders: StringHeaders | undefined;
const page = getPlaywrightPage();
await page.route(
url,
AsyncLocalStorage.bind(async (route) => {
if (mapResponseHeaders === undefined) {
return route.fallback();
}
const response = await route.fetch({timeout});
const headers = response.headers();
applyHeadersMapper(headers, mapResponseHeaders);
responseHeaders = headers;
return route.fulfill({headers, response});
}),
{times: 1},
);
if (mapRequestHeaders !== undefined) {
await page.route(
url,
AsyncLocalStorage.bind(async (route, request) => {
const headers = request.headers();
applyHeadersMapper(headers, mapRequestHeaders);
requestHeaders = headers;
await route.fallback({headers});
}),
{times: 1},
);
}
navigationReturn = await navigateToUrl(url, {skipLogs: true, ...navigateToUrlOptions});
return {requestHeaders, responseHeaders};
},
{
skipLogs,
timeout: timeout + ADDITIONAL_STEP_TIMEOUT,
type: LogEventType.InternalAction,
},
);
assertValueIsDefined(navigationReturn, 'navigationReturn is defined', {
navigateToUrlOptions,
url,
});
return navigationReturn;
};