From 084b85338317eeb7dab74f4713222f77ef2ac29c Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Fri, 5 Jul 2024 11:35:07 +0200 Subject: [PATCH] test: isolate proxy creds between context --- tests/library/browsercontext-proxy.spec.ts | 42 ++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tests/library/browsercontext-proxy.spec.ts b/tests/library/browsercontext-proxy.spec.ts index ab121ad53f..8fd816ae21 100644 --- a/tests/library/browsercontext-proxy.spec.ts +++ b/tests/library/browsercontext-proxy.spec.ts @@ -14,7 +14,9 @@ * limitations under the License. */ +import http from 'http'; import { browserTest as it, expect } from '../config/browserTest'; +import type net from 'net'; it.skip(({ mode }) => mode.startsWith('service')); @@ -413,3 +415,43 @@ it('does launch without a port', async ({ contextFactory }) => { }); await context.close(); }); + +it('should isolate proxy credentials between contexts on navigation', async ({ contextFactory, browserName }) => { + it.fixme(browserName === 'firefox', 'https://github.com/microsoft/playwright/issues/31525'); + const server = http.createServer((req, res) => { + const authHeader = req.headers['proxy-authorization']; + + if (!authHeader) { + res.writeHead(407, { 'Proxy-Authenticate': 'Basic realm="proxy"' }); + res.end('Proxy authorization required'); + return; + } + + const [username,] = Buffer.from(authHeader.split(' ')[1], 'base64').toString().split(':'); + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end(`Hello
${username}
!\n`); + }); + + const serverURL = await new Promise(resolve => server.listen(0, 'localhost', () => { + resolve(`http://localhost:${(server.address() as net.AddressInfo).port}`); + })); + + const context1 = await contextFactory({ + proxy: { server: serverURL, username: 'user1', password: 'secret1' } + }); + const page1 = await context1.newPage(); + await page1.goto('http://non-existent.com/target.html'); + await expect(page1.getByTestId('user')).toHaveText('user1'); + + const context2 = await contextFactory({ + proxy: { server: serverURL, username: 'user2', password: 'secret2' } + }); + const page2 = await context2.newPage(); + await page2.goto('http://non-existent.com/target.html'); + await expect(page2.getByTestId('user')).toHaveText('user2'); + + await page1.goto('http://non-existent.com/target.html'); + await expect(page1.getByTestId('user')).toHaveText('user1'); + + await new Promise(resolve => server.close(() => resolve())); +});