From 7fc252fffc9a5b78c91fed6cdc91619e005ca5d4 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Tue, 28 Jan 2025 17:05:12 +0000 Subject: [PATCH] test: fetch request through socks proxy over ipv4 (#34522) --- tests/library/browsertype-connect.spec.ts | 101 ++++++++++++++++++---- 1 file changed, 86 insertions(+), 15 deletions(-) diff --git a/tests/library/browsertype-connect.spec.ts b/tests/library/browsertype-connect.spec.ts index 367c0eabfc1d4..386b600ce7e10 100644 --- a/tests/library/browsertype-connect.spec.ts +++ b/tests/library/browsertype-connect.spec.ts @@ -53,7 +53,8 @@ const test = playwrightTest.extend({ const server = createHttpServer((req: http.IncomingMessage, res: http.ServerResponse) => { res.end('from-dummy-server'); }); - await new Promise(resolve => server.listen(0, resolve)); + // Only listen on IPv4 to check that we don't try to connect to it via IPv6. + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); await use((server.address() as net.AddressInfo).port); await new Promise(resolve => server.close(resolve)); }, @@ -792,9 +793,23 @@ for (const kind of ['launchServer', 'run-server'] as const) { const remoteServer = await startRemoteServer(kind); const browser = await connect(remoteServer.wsEndpoint(), { _exposeNetwork: '*' } as any, dummyServerPort); const page = await browser.newPage(); - await page.goto(`http://127.0.0.1:${examplePort}/foo.html`); - expect(await page.content()).toContain('from-dummy-server'); - expect(reachedOriginalTarget).toBe(false); + { + await page.setContent('empty'); + await page.goto(`http://127.0.0.1:${examplePort}/foo.html`); + expect(await page.content()).toContain('from-dummy-server'); + expect(reachedOriginalTarget).toBe(false); + } + { + await page.setContent('empty'); + await page.goto(`http://localhost:${examplePort}/foo.html`); + expect(await page.content()).toContain('from-dummy-server'); + expect(reachedOriginalTarget).toBe(false); + } + { + const error = await page.goto(`http://[::1]:${examplePort}/foo.html`).catch(() => 'failed'); + expect(error).toBe('failed'); + expect(reachedOriginalTarget).toBe(false); + } }); test('should proxy ipv6 localhost requests @smoke', async ({ startRemoteServer, server, browserName, connect, platform, ipV6ServerPort }, testInfo) => { @@ -809,15 +824,27 @@ for (const kind of ['launchServer', 'run-server'] as const) { const remoteServer = await startRemoteServer(kind); const browser = await connect(remoteServer.wsEndpoint(), { exposeNetwork: '*' }, ipV6ServerPort); const page = await browser.newPage(); - await page.goto(`http://[::1]:${examplePort}/foo.html`); - expect(await page.content()).toContain('from-ipv6-server'); - const page2 = await browser.newPage(); - await page2.goto(`http://localhost:${examplePort}/foo.html`); - expect(await page2.content()).toContain('from-ipv6-server'); - expect(reachedOriginalTarget).toBe(false); + { + await page.setContent('empty'); + await page.goto(`http://[::1]:${examplePort}/foo.html`); + expect(await page.content()).toContain('from-ipv6-server'); + expect(reachedOriginalTarget).toBe(false); + } + { + await page.setContent('empty'); + await page.goto(`http://localhost:${examplePort}/foo.html`); + expect(await page.content()).toContain('from-ipv6-server'); + expect(reachedOriginalTarget).toBe(false); + } + { + const error = await page.goto(`http://127.0.0.1:${examplePort}/foo.html`).catch(() => 'failed'); + expect(error).toBe('failed'); + expect(reachedOriginalTarget).toBe(false); + } }); - test('should proxy localhost requests from fetch api', async ({ startRemoteServer, server, browserName, connect, channel, platform, dummyServerPort }, workerInfo) => { + test('should proxy requests from fetch api', async ({ startRemoteServer, server, browserName, connect, channel, platform, dummyServerPort }, workerInfo) => { + test.fixme(true, 'broken because of socks proxy agent error: Socks5 proxy rejected connection - ConnectionRefused'); test.skip(browserName === 'webkit' && platform === 'darwin', 'no localhost proxying'); let reachedOriginalTarget = false; @@ -829,10 +856,54 @@ for (const kind of ['launchServer', 'run-server'] as const) { const remoteServer = await startRemoteServer(kind); const browser = await connect(remoteServer.wsEndpoint(), { exposeNetwork: '*' }, dummyServerPort); const page = await browser.newPage(); - const response = await page.request.get(`http://127.0.0.1:${examplePort}/foo.html`); - expect(response.status()).toBe(200); - expect(await response.text()).toContain('from-dummy-server'); - expect(reachedOriginalTarget).toBe(false); + { + const response = await page.request.get(`http://localhost:${examplePort}/foo.html`); + expect(response.status()).toBe(200); + expect(await response.text()).toContain('from-dummy-server'); + expect(reachedOriginalTarget).toBe(false); + } + { + const response = await page.request.get(`http://127.0.0.1:${examplePort}/foo.html`); + expect(response.status()).toBe(200); + expect(await response.text()).toContain('from-dummy-server'); + expect(reachedOriginalTarget).toBe(false); + } + { + const error = await page.request.get(`http://[::1]:${examplePort}/foo.html`).catch(e => 'failed'); + expect(error).toBe('failed'); + expect(reachedOriginalTarget).toBe(false); + } + }); + + test('should proxy requests from fetch api over ipv6', async ({ startRemoteServer, server, browserName, connect, channel, platform, ipV6ServerPort }, workerInfo) => { + test.skip(browserName === 'webkit' && platform === 'darwin', 'no localhost proxying'); + + let reachedOriginalTarget = false; + server.setRoute('/foo.html', async (req, res) => { + reachedOriginalTarget = true; + res.end(''); + }); + const examplePort = 20_000 + workerInfo.workerIndex * 3; + const remoteServer = await startRemoteServer(kind); + const browser = await connect(remoteServer.wsEndpoint(), { exposeNetwork: '*' }, ipV6ServerPort); + const page = await browser.newPage(); + { + const response = await page.request.get(`http://localhost:${examplePort}/foo.html`); + expect(response.status()).toBe(200); + expect(await response.text()).toContain('from-ipv6-server'); + expect(reachedOriginalTarget).toBe(false); + } + { + const response = await page.request.get(`http://[::1]:${examplePort}/foo.html`); + expect(response.status()).toBe(200); + expect(await response.text()).toContain('from-ipv6-server'); + expect(reachedOriginalTarget).toBe(false); + } + { + const error = await page.request.get(`http://127.0.0.1:${examplePort}/foo.html`).catch(e => 'failed'); + expect(error).toBe('failed'); + expect(reachedOriginalTarget).toBe(false); + } }); test('should proxy local.playwright requests', async ({ connect, server, dummyServerPort, startRemoteServer }, workerInfo) => {