playwright-fluent
Version:
Fluent API around playwright
139 lines (138 loc) • 6.12 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.onRequestToRespondFromHar = exports.defaultHarRequestResponseOptions = void 0;
const utils_1 = require("../../../utils");
function getAllHarEntries(harFiles) {
const entries = [];
harFiles.forEach((harFile) => {
const harData = (0, utils_1.getHarDataFrom)(harFile);
entries.push(...harData.log.entries);
});
return entries;
}
exports.defaultHarRequestResponseOptions = {
filterAllHarEntriesBeforeProcessing: () => true,
bypassRequestPredicate: () => false,
filterHarEntryByUrl: (requestUrl, harRequestUrl) => (0, utils_1.urlToPathWithoutQueryString)(requestUrl) === (0, utils_1.urlToPathWithoutQueryString)(harRequestUrl),
filterHarEntryByResponseStatus: (status) => status >= 200 && status < 300,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
selectEntryFromFoundHarEntries: (entries) => entries.pop(),
// eslint-disable-next-line @typescript-eslint/no-empty-function
onHarEntryNotFound: () => { },
// eslint-disable-next-line @typescript-eslint/no-empty-function
onHarEntryFound: () => { },
enrichResponseHeaders: (headers) => headers,
filterHarEntryByPostData: (requestPostData, harPostData) => requestPostData === harPostData.text,
filterHarEntryByQueryString: (requestUrl, harRequestUrl) => (0, utils_1.areQueryStringSimilar)(requestUrl, harRequestUrl),
handleRouteOnHarEntryNotFound: (route) => route.continue(),
provideEntryOnHarEntryNotFound: () => null,
};
async function onRequestToRespondFromHar(url, harFiles, page, options) {
if (!page) {
throw new Error(`Cannot intercept requests to '${url}' because no browser has been launched`);
}
if (!Array.isArray(harFiles)) {
throw new Error(`Cannot intercept requests to '${url}' because no HAR file(s) has been provided. You must provide HAR file(s) inside an array.`);
}
if (Array.isArray(harFiles) && harFiles.length === 0) {
throw new Error(`Cannot intercept requests to '${url}' because no HAR file(s) has been provided. You must provide at least one HAR file.`);
}
const allEntries = getAllHarEntries(harFiles).filter(options.filterAllHarEntriesBeforeProcessing);
await page.route((uri) => {
return uri.toString().includes(url);
}, (route, request) => {
if (options.bypassRequestPredicate(request)) {
route.continue();
return;
}
const httpMethod = request.method();
const requestedUrl = request.url();
const requestedPostData = request.postData();
const entries = allEntries
.filter((entry) => entry.request.method === httpMethod)
.filter((entry, index) => options.filterHarEntryByUrl(entry.request.url, requestedUrl, index))
.filter((entry) => entry.response)
.filter((entry) => options.filterHarEntryByResponseStatus(entry.response.status))
.filter((entry, index) => {
if ((0, utils_1.hasQueryString)(requestedUrl) && (0, utils_1.hasQueryString)(entry.request.url)) {
return options.filterHarEntryByQueryString(requestedUrl, entry.request.url, index);
}
return true;
})
.filter((entry, index) => {
if (!entry.request.postData && !requestedPostData) {
return true;
}
if (entry.request.postData && requestedPostData !== null) {
return options.filterHarEntryByPostData(requestedPostData, entry.request.postData, index);
}
switch (httpMethod) {
case 'CONNECT':
case 'GET':
case 'HEAD':
case 'OPTIONS':
case 'TRACE':
case 'DELETE':
return true;
default:
return false;
}
});
if (entries.length === 0) {
const providedEntry = options.provideEntryOnHarEntryNotFound(request, allEntries);
if (providedEntry) {
entries.push(providedEntry);
}
}
if (entries.length === 0) {
options.onHarEntryNotFound(allEntries, requestedUrl, httpMethod);
options.handleRouteOnHarEntryNotFound(route, request, allEntries);
return;
}
let foundEntry = entries[0];
if (entries.length > 1) {
foundEntry = options.selectEntryFromFoundHarEntries(entries, requestedUrl);
}
options.onHarEntryFound(foundEntry, requestedUrl, httpMethod);
const headers = buildHeadersFrom(foundEntry.response.headers);
const enrichedHeaders = options.enrichResponseHeaders(headers);
route.fulfill({
headers: enrichedHeaders,
status: foundEntry.response.status,
contentType: foundEntry.response.content.mimeType,
body: foundEntry.response.content.encoding === 'base64'
? Buffer.from(foundEntry.response.content.text, 'base64')
: foundEntry.response.content.text,
});
return;
});
}
exports.onRequestToRespondFromHar = onRequestToRespondFromHar;
function buildHeadersFrom(harHeaders) {
const headers = (0, utils_1.harHeadersToHttpHeaders)(harHeaders);
if (!hasAccessControlAllowCredentialsHeader(headers)) {
headers['Access-Control-Allow-Credentials'] = 'true';
}
if (!hasAccessControlAllowOriginHeader(headers)) {
headers['Access-Control-Allow-Origin'] = '*';
}
return headers;
}
function hasAccessControlAllowCredentialsHeader(headers) {
if (headers['access-control-allow-credentials']) {
return true;
}
if (headers['Access-Control-Allow-Credentials']) {
return true;
}
return false;
}
function hasAccessControlAllowOriginHeader(headers) {
if (headers['access-control-allow-origin']) {
return true;
}
if (headers['Access-Control-Allow-Origin']) {
return true;
}
return false;
}
;