Skip to content

Commit

Permalink
test: fetch request through socks proxy over ipv4 (#34522)
Browse files Browse the repository at this point in the history
  • Loading branch information
dgozman authored Jan 28, 2025
1 parent 63f96ef commit 7fc252f
Showing 1 changed file with 86 additions and 15 deletions.
101 changes: 86 additions & 15 deletions tests/library/browsertype-connect.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ const test = playwrightTest.extend<ExtraFixtures>({
const server = createHttpServer((req: http.IncomingMessage, res: http.ServerResponse) => {
res.end('<html><body>from-dummy-server</body></html>');
});
await new Promise<void>(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<void>(resolve => server.listen(0, '127.0.0.1', resolve));
await use((server.address() as net.AddressInfo).port);
await new Promise<Error>(resolve => server.close(resolve));
},
Expand Down Expand Up @@ -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) => {
Expand All @@ -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;
Expand All @@ -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('<html><body></body></html>');
});
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) => {
Expand Down

0 comments on commit 7fc252f

Please sign in to comment.