Best JavaScript code snippet using playwright-internal
harTracer.js
Source:harTracer.js
...274 }));275 this._addBarrier(page, response.securityDetails().then(details => {276 if (details) harEntry._securityDetails = details;277 }));278 this._addBarrier(page, request.rawRequestHeaders().then(headers => {279 for (const header of headers.filter(header => header.name.toLowerCase() === 'cookie')) harEntry.request.cookies.push(...header.value.split(';').map(parseCookie));280 harEntry.request.headers = headers;281 }));282 this._addBarrier(page, response.rawResponseHeaders().then(headers => {283 for (const header of headers.filter(header => header.name.toLowerCase() === 'set-cookie')) harEntry.response.cookies.push(parseCookie(header.value));284 harEntry.response.headers = headers;285 const contentType = headers.find(header => header.name.toLowerCase() === 'content-type');286 if (contentType) harEntry.response.content.mimeType = contentType.value;287 }));288 }289 async flush() {290 await Promise.all(this._barrierPromises);291 }292 stop() {...
network.js
Source:network.js
...105 }106 _actualHeaders() {107 if (!this._actualHeadersPromise) {108 this._actualHeadersPromise = this._wrapApiCall(async channel => {109 return new RawHeaders((await channel.rawRequestHeaders()).headers);110 });111 }112 return this._actualHeadersPromise;113 }114 async allHeaders() {115 return (await this._actualHeaders()).headers();116 }117 async headersArray() {118 return (await this._actualHeaders()).headersArray();119 }120 async headerValue(name) {121 return (await this._actualHeaders()).get(name);122 }123 async response() {...
proxy.js
Source:proxy.js
1"use strict";2// Node JS imports3var ejs = require("ejs");4var fs = require("fs");5var http = require("http");6var https = require("https");7var querystring = require("querystring");8var url = require("url");9// local imports10var config = require("../config");11var httpConstants = require("../http-constants");12var patterns = require("./patterns");13// initialize the Node server14var server = http.createServer();15// start the server, listening at localhost on the port configured in config.js16server.listen(config.proxyPort, handleListening);17// any time the "request" event is emitted by the Node server, invoke our #handleRequest method18server.on("request", handleRequest);19/** callback invoked once when the proxy server starts up */20function handleListening() {21 console.log("proxy started, listening on port " + config.proxyPort);22}23/**24 * callback invoked each time an HTTP request comes in to the proxy server25 *26 * @param proxiedRequest an instance of http.IncomingMessage. the request from the user to the proxy server (to localhost)27 * @param proxiedResponse an instance of http.ServerResponse. the response from the proxy server to the user. this will either be the response passed along from the destination website/application,28 * or, if SQL injection was detected, a response originating from the proxy saying the request was blocked.29 */30function handleRequest(proxiedRequest, proxiedResponse) {31 console.log("handling request");32 33 var requestBody = "";34 function handleRequestData(data) {35 requestBody += data;36 }37 function handleRequestEnd() {38 function handleResponse(rawResponse) {39 // first copy the headers, including the HTTP status code, from the raw response into proxied response to the end user40 proxiedResponse.writeHead(rawResponse.statusCode, rawResponse.headers);41 // now pipe the raw response body directly into the proxied response to the end user42 rawResponse.pipe(proxiedResponse);43 // all done. we don't need to watch for rawResponse's 'end' event.44 }45 function handleRawRequest() {46 var requestOptions = getRawRequestOptions(proxiedRequest);47 console.log("firing " + (requestOptions.port === 443 ? "SSL" : "non-SSL") + " request to: ");48 console.log(requestOptions);49 var request = null;50 if (requestOptions.port === 443 || config.forceSSL) // use SSL if the target (raw) port is 443, OR if the user has set the force_ssl flag51 request = https.request(requestOptions, handleResponse);52 else // default to non-SSL53 request = http.request(requestOptions, handleResponse);54 request.on("error", function(error) {55 if (httpConstants.errorCodes.UNRESOLVED_HOST === error.code) {56 // unknown host ... config.target_host in config.js is either wrong, or down57 proxiedResponse.write("Could not resolve host: " + requestOptions.hostname);58 }59 else {60 // we don't expect this to ever happen, throw generic message61 console.log(error);62 proxiedResponse.write("unknown proxy error occurred.");63 }64 proxiedResponse.end(); // close our response to our caller now, nothing left to do.65 });66 67 // copy the request body from the incoming user's request (proxied request) to our outgoing request to the real destination.68 // the request body it separate from the requestOptions (method, url, protocol, etc), which are handled by getRawRequestOptions().69 // request body is not applicable to GET requests, but doesn't hurt.70 request.write(requestBody);71 request.end();72 }73 // call getProxiedRequestParams() to get our request's params, and pass them along for scanning74 var blockedReason = scanParameters(getProxiedRequestParams(proxiedRequest, requestBody));75 76 if(blockedReason) { // scanParameters() returns a reason the request should be blocked, if any.77 proxiedResponse.statusCode = httpConstants.responseCodes.HTTP_SUCCESS_OK; // 200 is default, but being explicit78 if(proxiedRequest.method === "GET") { // respond to blocked GET requests with HTML. presumably the request is from a browser, though no way to be sure.79 proxiedResponse.setHeader(httpConstants.headers.HEADER_KEY_CONTENT, httpConstants.headers.HEADER_VALUE_TEXT);80 proxiedResponse.write(renderBlockedHTML(blockedReason)); // render our variables into the template and write the whole string as our response body81 }82 else { // respond to all other blocked requests with JSON. they're not originating from a browser.83 proxiedResponse.setHeader(httpConstants.headers.HEADER_KEY_CONTENT, httpConstants.headers.HEADER_VALUE_JSON);84 proxiedResponse.write(renderBlockedJSON(blockedReason)); // render our variables into the template and write the whole string as our response body85 }86 proxiedResponse.end(); // call proxiedResponse.end() to mark the proxiedResponse complete, sets proxiedResponse.finish to true87 } else {88 handleRawRequest(); // scanParameters() returns null for requests that have been verified benign89 }90 }91 92 proxiedRequest.on("data", handleRequestData);93 94 proxiedRequest.on("end", handleRequestEnd);95}96/**97 * gather all parameters from the request being proxied, both from the query string and the request body, into a single object. for example, given the query string:98 * ?username=rmarsh&password=beer99 *100 * and the request body:101 * {102 * "username": "randy.marsh",103 * "firstName": "randy",104 * "lastName": "marsh"105 * }106 *107 * return:108 * {109 * query.username: "rmarsh",110 * query.password: "beer",111 * body.username: "randy.marsh",112 * body.firstName: "randy",113 * body.lastName: "marsh"114 * }115 *116 * this ensures potential collisions between query string and request body are avoided, and callers get all parameters to scan as desired. it's not this function's concern117 * that query string and request body are usually mutually exclusvie, or that request body on GET/DELETE/OPTIONS requests would likely be ignored by the server anyway;118 * just return everything.119 *120 * @param proxiedRequest121 * @param requestBody122 * @returns {{}}123 */124function getProxiedRequestParams(proxiedRequest, requestBody) {125 var requestParams = {};126 var key = "";127 var urlParts = url.parse(proxiedRequest.url, true); // url#parse() breaks a URI string into an Object of individual parts, one of the parts being the query string128 if(urlParts.query !== null) { // a query string is only expected for GET, DELETE, and HEAD, but always process it if found129 for(key in urlParts.query) {130 if(urlParts.query.hasOwnProperty(key))131 requestParams["query."+key] = urlParts.query[key];132 }133 }134 if(requestBody !== null) { // a request body is only expected for POST and PUT, but always process it if found135 var body = querystring.parse(requestBody);136 for(key in body) {137 if(body.hasOwnProperty(key))138 requestParams["body."+key] = body[key];139 }140 }141 // get URL attributes too, like /api/users/129, or /api/customers/7/users/129142 var urlAttributes = urlParts.pathname.split("/");143 for(var index=0; index<urlAttributes.length; index++) {144 // since attributes aren't key value pairs, just values, the value of key here will be 0, 1, 2, etc. doesn't affect anything145 if(urlAttributes[index].length > 0)146 requestParams["pathname."+index] = decodeURIComponent(urlAttributes[index]); // example: pathname.1=129147 }148 return requestParams;149}150/**151 * given an incoming request being proxied, build a configuration options Object for the raw request that will be passed along to the server. for the most part this just152 * involves copying over properties from the proxied request, with substitutions for host, port, and a few headers.153 *154 * @param proxiedRequest155 * @returns {{hostname: string, port: number, method: (*|chainableBehavior.method|string|method|parserOnHeadersComplete.incoming.method|IncomingMessage.method), path: string, headers: {}}}156 */157function getRawRequestOptions(proxiedRequest) {158 var relativePath = proxiedRequest.url;159 if(proxiedRequest.url.substring(0, 1) === "/")160 relativePath = relativePath.substring(1, relativePath.length);161 // there are certain headers, namely "host", which we don't want to pass along. the rest should pass through to the destination.162 var rawRequestHeaders = {};163 if(typeof proxiedRequest.headers !== "undefined" && proxiedRequest.headers !== null) { // if the proxied request has any headers ...164 // ... then copy all of them into our headers for our raw request. note that this only does a shallow copy.165 rawRequestHeaders = Object.assign({}, proxiedRequest.headers);166 delete rawRequestHeaders.host; // ... except omit the "host" header from our raw request167 }168 /* copy the request method, path+query params, and headers from the user's proxied request to our outbound request to the real destination. only the169 hostname and port will be different. it's worth noting that for POST/PUT, the Content-Length header must match the request body. so if we were to170 modify the request body at any point in our proxying, we'd have to update Content-Length as well.171 */172 var requestOptions = {173 "hostname": config.targetHost,174 "port": config.targetPort,175 "method": proxiedRequest.method,176 "path": "/" + relativePath,177 "headers": rawRequestHeaders178 };179 return requestOptions;180}181/**182 * scan the given parameters object. if any parameter value contains suspicious SQL injection text, return a description of the suspicous parameter. returns null otherwise, including183 * null or empty parameters.184 *185 * @param parameters186 * @returns {boolean} a description of the suspicous parameter. ex.: "SQL command. (ex. DROP)"187 */188function scanParameters(parameters) {189 if(parameters !== null) {190 for(var key in parameters) {191 if (parameters.hasOwnProperty(key)) {192 for (var index = 0; index < patterns.length; index++) {193 if (patterns[index].regex.test(parameters[key])) { // does this SQL injection regex match the value of this param?194 console.log("suspicious parameter identified: " + patterns[index].description);195 return patterns[index].description; // return, no need to scan rest of the parameters196 }197 }198 }199 }200 }201 return null;202}203/**204 * Render the "request blocked" page with the given reason the request was deemed suspicous and thus blocked.205 *206 * @param description a string describing the reason the proxied request was blocked. ex.: "SQL command. (ex. DROP)"207 * @returns {String} the full HTML of the "request blocked" as a string.208 */209function renderBlockedHTML(description) {210 var template = fs.readFileSync(__dirname + "/view/index.html", "utf8");211 var renderData = {212 description: description213 };214 return ejs.render(template, renderData);215}216/**217 * generate the JSON response body to respond to non-browser requests letting them know their request has been blocked. this returns the raw string containing218 * JSON markup and is intended to be used with the "Content-Type: application/json" response header.219 *220 * @param description221 * @returns {String} JSON string, ex.: '{"success":false,"message":"SQL command. (ex. DROP)"}'222 */223function renderBlockedJSON(description) {224 var responseBody = {225 success: false,226 message: description227 };228 return JSON.stringify(responseBody);...
networkDispatchers.js
Source:networkDispatchers.js
...42 isNavigationRequest: request.isNavigationRequest(),43 redirectedFrom: RequestDispatcher.fromNullable(scope, request.redirectedFrom())44 });45 }46 async rawRequestHeaders(params) {47 return {48 headers: await this._object.rawRequestHeaders()49 };50 }51 async response() {52 return {53 response: (0, _dispatcher.lookupNullableDispatcher)(await this._object.response())54 };55 }56}57exports.RequestDispatcher = RequestDispatcher;58class ResponseDispatcher extends _dispatcher.Dispatcher {59 static from(scope, response) {60 const result = (0, _dispatcher.existingDispatcher)(response);61 return result || new ResponseDispatcher(scope, response);62 }...
HTTPProtocol.js
Source:HTTPProtocol.js
1dojo.provide("plugins.protocols.HTTPProtocol");2dojo.require("plugins.protocols.Protocol");3plugins.protocols.HTTPProtocol.label = 'HTTP Protocol';4dojo.declare("plugins.protocols.HTTPProtocolPane",5 [ plugins.protocols.ProtocolPane ],6 {7 templatePath: dojo.moduleUrl("plugins", "protocols/HTTPProtocol/HTTPProtocolPane.html"),8 postMixInProperties: function() {9 this.inherited('postMixInProperties', arguments);10 if (this.templatePath) this.templateString = "";11 },12 widgetsInTemplate: true,13 postCreate: function(){14 this.inherited("postCreate", arguments);15 },16 populateWithDefaults: function() {17 this.inherited('populateWithDefaults', arguments);18 this.form.attr('value', {MaxRequestContentLength: 1048576, MaxResponseContentLength: 1048576});19 },20 getHeight: function() {21 return this.pane_end.offsetTop;22 },23 _addCustomConfigValues: function(config, item) {24 var store = pion.protocols.config_store;25 config.options = [];26 // By default, RawRequestHeaders and RawResponseHeaders are both false.27 if (store.hasAttribute(item, 'RawRequestHeaders')) {28 if (store.getValue(item, 'RawRequestHeaders').toString() == 'true') {29 config.options.push('RawRequestHeaders');30 }31 }32 if (store.hasAttribute(item, 'RawResponseHeaders')) {33 if (store.getValue(item, 'RawResponseHeaders').toString() == 'true') {34 config.options.push('RawResponseHeaders');35 }36 }37 // By default, AllowUtf8Conversion is true.38 var allow_utf8_conversion = true;39 if (store.hasAttribute(item, 'AllowUtf8Conversion')) {40 allow_utf8_conversion = (store.getValue(item, 'AllowUtf8Conversion').toString() == 'true');41 }42 if (allow_utf8_conversion) {43 config.options.push('AllowUtf8Conversion');44 }45 this.updateDisabling({target: {checked: allow_utf8_conversion}});46 // By default, AllowSearchingContentForCharset is the same as AllowUtf8Conversion.47 var allow_searching_content_for_charset = allow_utf8_conversion;48 if (store.hasAttribute(item, 'AllowSearchingContentForCharset')) {49 allow_searching_content_for_charset = (store.getValue(item, 'AllowSearchingContentForCharset').toString() == 'true');50 }51 if (allow_searching_content_for_charset) {52 config.options.push('AllowSearchingContentForCharset');53 }54 },55 _makeCustomElements: function(config) {56 // If the 'allow searching' checkbox is disabled, temporarily enable it and reread the form values,57 // so that if the box is checked, AllowSearchingContentForCharset will be included in config.options.58 var allow_searching_was_disabled = this.allow_searching.attr('disabled');59 if (allow_searching_was_disabled) {60 this.allow_searching.attr('disabled', false);61 config = this.form.attr('value');62 }63 var put_data = '<RawRequestHeaders>';64 put_data += (dojo.indexOf(config.options, 'RawRequestHeaders') != -1); // 'true' iff corresponding checkbox was checked65 put_data += '</RawRequestHeaders><RawResponseHeaders>';66 put_data += (dojo.indexOf(config.options, 'RawResponseHeaders') != -1); // 'true' iff corresponding checkbox was checked67 put_data += '</RawResponseHeaders><AllowUtf8Conversion>';68 put_data += (dojo.indexOf(config.options, 'AllowUtf8Conversion') != -1); // 'true' iff corresponding checkbox was checked69 put_data += '</AllowUtf8Conversion><AllowSearchingContentForCharset>';70 put_data += (dojo.indexOf(config.options, 'AllowSearchingContentForCharset') != -1); // 'true' iff corresponding checkbox was checked71 put_data += '</AllowSearchingContentForCharset>';72 // Restore original disabled status of 'allow searching' checkbox.73 if (allow_searching_was_disabled) {74 this.allow_searching.attr('disabled', true);75 }76 return put_data;77 },78 updateDisabling: function(e) {79 if (e.target.checked) {80 dojo.removeClass(this.allow_searching_label, 'disabled');81 this.allow_searching.attr('disabled', false);82 } else {83 dojo.addClass(this.allow_searching_label, 'disabled');84 this.allow_searching.attr('disabled', true);85 }86 }87 }...
cacheKeyGenerator.js
Source:cacheKeyGenerator.js
1'use strict';2const _ = require('underscore');3const lowerCase = array => {4 const result = [];5 for(let i = 0; i < array.length; i++) {6 result.push(array[i].toLowerCase());7 }8 return result;9};10const normaliseUrl = url => {11 const pathname = url.pathname.toLowerCase();12 const sortedQueryKeys = _.keys(url.query).sort();13 let normalisedQuery = '';14 sortedQueryKeys.forEach(key => {15 normalisedQuery += `${key}=${url.query[key]}&`16 });17 if(normalisedQuery.length > 0) {18 normalisedQuery = `?${normalisedQuery}`19 }20 return `${pathname}${normalisedQuery}`;21};22const normaliseHeaders = (rawRequestHeaders, varyByHeaders) => {23 if(!varyByHeaders) {24 return null;25 }26 const requestHeaders = _.map(_.keys(rawRequestHeaders), requestHeaderKey => {27 return {28 key: requestHeaderKey.toLowerCase(),29 value: rawRequestHeaders[requestHeaderKey]30 }31 });32 const varyByHeaderKeys = _.sortBy(lowerCase(varyByHeaders));33 const filteredHeaders = _.compact(_.map(varyByHeaderKeys, varyByHeaderKey => {34 const requestHeader = _.find(requestHeaders, requestHeader => { return requestHeader.key === varyByHeaderKey; });35 return requestHeader ? `${requestHeader.key}=${requestHeader.value.replace(/(\s+)/gi, '')}` : null;36 }));37 return filteredHeaders.join('|');38};39module.exports = {40 generateCacheKey: (req, options) => {41 const partition = options.partition || 'default';42 const method = req.route.method.toLowerCase();43 const path = normaliseUrl(req.url);44 const headers = normaliseHeaders(req.headers, options.varyByHeaders);45 return _.compact([partition, method, path, headers]).join('|');46 }...
Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const context = await browser.newContext();5 const page = await context.newPage();6 await page.route('**/*', route => {7 console.log(route.request().rawRequestHeaders());8 route.continue();9 });10 await browser.close();11})();
Using AI Code Generation
1const { chromium } = require('playwright');2const fs = require('fs');3const path = require('path');4(async () => {5 const browser = await chromium.launch();6 const context = await browser.newContext();7 const page = await context.newPage();8 await page.route('**', route => {9 const headers = route.request().rawRequestHeaders();10 console.log('rawRequestHeaders', headers);11 route.continue();12 });13 await browser.close();14})();15import { chromium } from 'playwright';16import fs from 'fs';17import path from 'path';18(async () => {19 const browser = await chromium.launch();20 const context = await browser.newContext();21 const page = await context.newPage();22 await page.route('**', route => {23 const headers = route.request().rawRequestHeaders();24 console.log('rawRequestHeaders', headers);25 route.continue();26 });27 await browser.close();28})();29const { chromium } = require('playwright');30const fs = require('fs');31const path = require('path');32(async () => {33 const browser = await chromium.launch();34 const context = await browser.newContext();35 const page = await context.newPage();36 await page.route('**', route => {37 const headers = route.request().rawRequestHeaders();38 console.log('rawRequestHeaders', headers);39 route.fulfill({40 headers: {41 },42 });43 });44 await browser.close();45})();46import { chromium } from 'playwright';47import fs from 'fs';48import path from '
Using AI Code Generation
1const { chromium } = require('playwright');2const { rawRequestHeaders } = require('playwright/lib/server/chromium/crNetworkManager');3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();7 await page.route('**/*', route => {8 const headers = rawRequestHeaders(route.request());9 console.log(headers);10 route.continue();11 });12 await browser.close();13})();14{ 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4469.0 Safari/537.36' }15{ 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4469.0 Safari/537.36' }16{ 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4469.0 Safari/537.36' }17{ 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4469.0 Safari/537.36' }18{ 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4469.0 Safari/537.36' }19{ 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4469.0 Safari/537.36' }20{ 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4469.0 Safari/537.36' }21{ 'user-agent': 'Mozilla
Using AI Code Generation
1const { chromium } = require('playwright');2const { rawRequestHeaders } = require('playwright/lib/protocol/network.js');3(async () => {4 const browser = await chromium.launch({ headless: false });5 const context = await browser.newContext();6 const page = await context.newPage();7 await page.route('**', route => {8 rawRequestHeaders(route.request()).then(headers => {9 console.log(headers);10 route.continue();11 });12 });13 await browser.close();14})();15const { chromium } = require('playwright');16const { rawResponseHeaders } = require('playwright/lib/protocol/network.js');17(async () => {18 const browser = await chromium.launch({ headless: false });19 const context = await browser.newContext();20 const page = await context.newPage();21 await page.route('**', route => {22 rawResponseHeaders(route.request()).then(headers => {23 console.log(headers);24 route.continue();25 });26 });27 await browser.close();28})();29const { chromium } = require('playwright');30const { rawResponse } = require('playwright/lib/protocol/network.js');31(async () => {32 const browser = await chromium.launch({ headless: false });33 const context = await browser.newContext();34 const page = await context.newPage();35 await page.route('**', route => {36 rawResponse(route.request()).then(response => {37 console.log(response);38 route.continue();39 });40 });41 await browser.close();42})();43const { chromium } = require('playwright');44const { rawRequest } = require('playwright/lib/protocol/network.js');45(async () => {46 const browser = await chromium.launch({ headless: false });47 const context = await browser.newContext();48 const page = await context.newPage();49 await page.route('**', route => {50 rawRequest(route.request()).then(request => {51 console.log(request);52 route.continue();53 });54 });55 await browser.close();56})();
Using AI Code Generation
1const { chromium } = require('playwright-chromium');2const path = require('path');3const fs = require('fs');4const utils = require('./utils.js');5(async () => {6 const browser = await chromium.launch({ headless: false, slowMo: 50 });7 const context = await browser.newContext();8 const page = await context.newPage();9 await page.route('**', async (route, request) => {10 const headers = utils.rawRequestHeaders(request);11 console.log(headers);12 await route.continue();13 });14 await page.screenshot({ path: 'google.png' });15 await browser.close();16})();17const { chromium } = require('playwright-chromium');18const path = require('path');19const fs = require('fs');20module.exports = {21 rawRequestHeaders: (request) => {22 const headers = {};23 const rawHeaders = request._rawRequestHeaders;24 for (let i = 0; i < rawHeaders.length; i += 2) {25 headers[rawHeaders[i]] = rawHeaders[i + 1];26 }27 return headers;28 }29}
Using AI Code Generation
1const { chromium } = require('playwright');2const { HttpServer } = require('playwright-core/lib/server/httpServer');3const { HttpServerRequest } = require('playwright-core/lib/server/httpServer');4const { HttpServerResponse } = require('playwright-core/lib/server/httpServer');5const { HttpServerSession } = require('playwright-core/lib/server/httpServer');6const { HttpServerWebSocket } = require('playwright-core/lib/server/httpServer');7const { HttpServerWebSocketFrame } = require('playwright-core/lib/server/httpServer');8(async () => {9 const browser = await chromium.launch();10 const context = await browser.newContext();11 const page = await context.newPage();12 await browser.close();13})();14class HttpServer {15 constructor() {16 this._sessions = new Map();17 this._lastSessionId = 0;18 this._server = null;19 this._routes = [];20 this._requestCallback = null;21 this._responseCallback = null;22 this._webSocketCallback = null;23 this._webSocketFrameSentCallback = null;24 this._webSocketFrameReceivedCallback = null;25 this._webSocketClosedCallback = null;26 }27 setRequestCallback(callback) {28 this._requestCallback = callback;29 }30 setResponseCallback(callback) {31 this._responseCallback = callback;32 }33 setWebSocketCallback(callback) {34 this._webSocketCallback = callback;35 }36 setWebSocketFrameSentCallback(callback) {37 this._webSocketFrameSentCallback = callback;38 }39 setWebSocketFrameReceivedCallback(callback) {40 this._webSocketFrameReceivedCallback = callback;41 }42 setWebSocketClosedCallback(callback) {43 this._webSocketClosedCallback = callback;44 }45 route(url, handler) {46 this._routes.push({ url, handler });47 }48 async start(port) {49 if (this._server)50 return;51 const server = this._server = http.createServer((request, response) => this._onRequest(request, response));52 server.on('upgrade', (request, socket, head) => this._onWebSocketRequest(request, socket,
Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch({4 });5 const context = await browser.newContext();6 const page = await context.newPage();7 await page.route('**', route => {8 route.fulfill({9 });10 });11 page.on('request', async request => {12 console.log(await request.rawRequestHeaders());13 });14 await browser.close();15})();16const { chromium } = require('playwright');17(async () => {18 const browser = await chromium.launch({19 });20 const context = await browser.newContext();21 const page = await context.newPage();22 await page.route('**', route => {23 route.fulfill({
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!