mirror of
https://github.com/microsoft/playwright.git
synced 2024-12-11 12:33:45 +03:00
chore: move fetch proxy tests in its own file (#22936)
The browser has to be launch with `proxy: 'per-context'` option for the tests to work on Windows. Fixes the following: ``` Error: browser.newContext: Browser needs to be launched with the global proxy. If all contexts override the proxy, global proxy will be never used and can be any string, for example "launch({ proxy: { server: 'http://per-context' } })" at D:\a\playwright\playwright\tests\library\browsercontext-fetch.spec.ts:382:19 ```
This commit is contained in:
parent
80f46892cd
commit
e8d994836e
@ -325,103 +325,6 @@ it('should return raw headers', async ({ context, page, server }) => {
|
||||
expect(response.headers()['name-b']).toBe('v4');
|
||||
});
|
||||
|
||||
it('should work with context level proxy', async ({ browserType, contextOptions, server, proxyServer }) => {
|
||||
server.setRoute('/target.html', async (req, res) => {
|
||||
res.end('<title>Served by the proxy</title>');
|
||||
});
|
||||
|
||||
const browser = await browserType.launch({
|
||||
proxy: { server: 'http://per-context' }
|
||||
});
|
||||
|
||||
try {
|
||||
proxyServer.forwardTo(server.PORT);
|
||||
const context = await browser.newContext({
|
||||
...contextOptions,
|
||||
proxy: { server: `localhost:${proxyServer.PORT}` }
|
||||
});
|
||||
|
||||
const [request, response] = await Promise.all([
|
||||
server.waitForRequest('/target.html'),
|
||||
context.request.get(`http://non-existent.com/target.html`)
|
||||
]);
|
||||
expect(response.status()).toBe(200);
|
||||
expect(request.url).toBe('/target.html');
|
||||
} finally {
|
||||
await browser.close();
|
||||
}
|
||||
});
|
||||
|
||||
it('should pass proxy credentials', async ({ browserType, server, proxyServer }) => {
|
||||
proxyServer.forwardTo(server.PORT);
|
||||
let auth;
|
||||
proxyServer.setAuthHandler(req => {
|
||||
auth = req.headers['proxy-authorization'];
|
||||
return !!auth;
|
||||
});
|
||||
const browser = await browserType.launch({
|
||||
proxy: { server: `localhost:${proxyServer.PORT}`, username: 'user', password: 'secret' }
|
||||
});
|
||||
const context = await browser.newContext();
|
||||
const response = await context.request.get('http://non-existent.com/simple.json');
|
||||
expect(proxyServer.connectHosts).toContain('non-existent.com:80');
|
||||
expect(auth).toBe('Basic ' + Buffer.from('user:secret').toString('base64'));
|
||||
expect(await response.json()).toEqual({ foo: 'bar' });
|
||||
await browser.close();
|
||||
});
|
||||
|
||||
it(`should support proxy.bypass`, async ({ browser, browserType, browserName, contextOptions, server, proxyServer }) => {
|
||||
server.setRoute('/target.html', async (req, res) => {
|
||||
res.end('Served by the proxy');
|
||||
});
|
||||
// FYI: using long and weird domain names to avoid ATT DNS hijacking
|
||||
// that resolves everything to some weird search results page.
|
||||
//
|
||||
// @see https://gist.github.com/CollinChaffin/24f6c9652efb3d6d5ef2f5502720ef00
|
||||
proxyServer.forwardTo(server.PORT);
|
||||
const context = await browser.newContext({
|
||||
...contextOptions,
|
||||
proxy: { server: `localhost:${proxyServer.PORT}`, bypass: `1.non.existent.domain.for.the.test, 2.non.existent.domain.for.the.test, .another.test` }
|
||||
});
|
||||
|
||||
{
|
||||
const res = await context.request.get(server.CROSS_PROCESS_PREFIX + '/target.html');
|
||||
expect(await res.text()).toContain('Served by the proxy');
|
||||
expect(proxyServer.connectHosts).toContain(new URL(server.CROSS_PROCESS_PREFIX).host);
|
||||
proxyServer.connectHosts = [];
|
||||
}
|
||||
|
||||
{
|
||||
const res = await context.request.get('http://0.non.existent.domain.for.the.test/target.html');
|
||||
expect(await res.text()).toContain('Served by the proxy');
|
||||
proxyServer.connectHosts = [];
|
||||
}
|
||||
|
||||
{
|
||||
const error = await context.request.get('http://1.non.existent.domain.for.the.test/target.html').catch(e => e);
|
||||
expect(error.message).toBeTruthy();
|
||||
expect(proxyServer.connectHosts).toEqual([]);
|
||||
}
|
||||
|
||||
{
|
||||
const error = await context.request.get('http://2.non.existent.domain.for.the.test/target.html').catch(e => e);
|
||||
expect(error.message).toBeTruthy();
|
||||
expect(proxyServer.connectHosts).toEqual([]);
|
||||
}
|
||||
|
||||
{
|
||||
const error = await context.request.get('http://foo.is.the.another.test/target.html').catch(e => e);
|
||||
expect(error.message).toBeTruthy();
|
||||
expect(proxyServer.connectHosts).toEqual([]);
|
||||
}
|
||||
|
||||
{
|
||||
const res = await context.request.get('http://3.non.existent.domain.for.the.test/target.html');
|
||||
expect(await res.text()).toContain('Served by the proxy');
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
it('should work with http credentials', async ({ context, server }) => {
|
||||
server.setAuth('/empty.html', 'user', 'pass');
|
||||
|
||||
|
140
tests/library/fetch-proxy.spec.ts
Normal file
140
tests/library/fetch-proxy.spec.ts
Normal file
@ -0,0 +1,140 @@
|
||||
/**
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { contextTest as it, expect } from '../config/browserTest';
|
||||
|
||||
it.use({
|
||||
launchOptions: async ({ launchOptions }, use) => {
|
||||
await use({
|
||||
...launchOptions,
|
||||
proxy: { server: 'per-context' }
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
it.skip(({ mode }) => mode !== 'default');
|
||||
|
||||
it('context request should pick up proxy credentials', async ({ browserType, server, proxyServer }) => {
|
||||
proxyServer.forwardTo(server.PORT);
|
||||
let auth;
|
||||
proxyServer.setAuthHandler(req => {
|
||||
auth = req.headers['proxy-authorization'];
|
||||
return !!auth;
|
||||
});
|
||||
const browser = await browserType.launch({
|
||||
proxy: { server: `localhost:${proxyServer.PORT}`, username: 'user', password: 'secret' }
|
||||
});
|
||||
const context = await browser.newContext();
|
||||
const response = await context.request.get('http://non-existent.com/simple.json');
|
||||
expect(proxyServer.connectHosts).toContain('non-existent.com:80');
|
||||
expect(auth).toBe('Basic ' + Buffer.from('user:secret').toString('base64'));
|
||||
expect(await response.json()).toEqual({ foo: 'bar' });
|
||||
await browser.close();
|
||||
});
|
||||
|
||||
it('global request should pick up proxy credentials', async ({ playwright, server, proxyServer }) => {
|
||||
proxyServer.forwardTo(server.PORT);
|
||||
let auth;
|
||||
proxyServer.setAuthHandler(req => {
|
||||
auth = req.headers['proxy-authorization'];
|
||||
return !!auth;
|
||||
});
|
||||
const request = await playwright.request.newContext({
|
||||
proxy: { server: `localhost:${proxyServer.PORT}`, username: 'user', password: 'secret' }
|
||||
});
|
||||
const response = await request.get('http://non-existent.com/simple.json');
|
||||
expect(proxyServer.connectHosts).toContain('non-existent.com:80');
|
||||
expect(auth).toBe('Basic ' + Buffer.from('user:secret').toString('base64'));
|
||||
expect(await response.json()).toEqual({ foo: 'bar' });
|
||||
await request.dispose();
|
||||
});
|
||||
|
||||
it('should work with context level proxy', async ({ contextFactory, contextOptions, server, proxyServer }) => {
|
||||
server.setRoute('/target.html', async (req, res) => {
|
||||
res.end('<title>Served by the proxy</title>');
|
||||
});
|
||||
|
||||
proxyServer.forwardTo(server.PORT);
|
||||
const context = await contextFactory({
|
||||
proxy: { server: `localhost:${proxyServer.PORT}` }
|
||||
});
|
||||
|
||||
const [request, response] = await Promise.all([
|
||||
server.waitForRequest('/target.html'),
|
||||
context.request.get(`http://non-existent.com/target.html`)
|
||||
]);
|
||||
expect(response.status()).toBe(200);
|
||||
expect(request.url).toBe('/target.html');
|
||||
});
|
||||
|
||||
it(`should support proxy.bypass`, async ({ contextFactory, contextOptions, server, proxyServer }) => {
|
||||
server.setRoute('/target.html', async (req, res) => {
|
||||
res.end('Served by the proxy');
|
||||
});
|
||||
// FYI: using long and weird domain names to avoid ATT DNS hijacking
|
||||
// that resolves everything to some weird search results page.
|
||||
//
|
||||
// @see https://gist.github.com/CollinChaffin/24f6c9652efb3d6d5ef2f5502720ef00
|
||||
proxyServer.forwardTo(server.PORT);
|
||||
const context = await contextFactory({
|
||||
...contextOptions,
|
||||
proxy: { server: `localhost:${proxyServer.PORT}`, bypass: `1.non.existent.domain.for.the.test, 2.non.existent.domain.for.the.test, .another.test` }
|
||||
});
|
||||
|
||||
{
|
||||
const res = await context.request.get(server.CROSS_PROCESS_PREFIX + '/target.html');
|
||||
expect(await res.text()).toContain('Served by the proxy');
|
||||
expect(proxyServer.connectHosts).toContain(new URL(server.CROSS_PROCESS_PREFIX).host);
|
||||
proxyServer.connectHosts = [];
|
||||
}
|
||||
|
||||
{
|
||||
const res = await context.request.get('http://0.non.existent.domain.for.the.test/target.html');
|
||||
expect(await res.text()).toContain('Served by the proxy');
|
||||
proxyServer.connectHosts = [];
|
||||
}
|
||||
|
||||
{
|
||||
const error = await context.request.get('http://1.non.existent.domain.for.the.test/target.html').catch(e => e);
|
||||
expect(error.message).toBeTruthy();
|
||||
expect(proxyServer.connectHosts).toEqual([]);
|
||||
}
|
||||
|
||||
{
|
||||
const error = await context.request.get('http://2.non.existent.domain.for.the.test/target.html').catch(e => e);
|
||||
expect(error.message).toBeTruthy();
|
||||
expect(proxyServer.connectHosts).toEqual([]);
|
||||
}
|
||||
|
||||
{
|
||||
const error = await context.request.get('http://foo.is.the.another.test/target.html').catch(e => e);
|
||||
expect(error.message).toBeTruthy();
|
||||
expect(proxyServer.connectHosts).toEqual([]);
|
||||
}
|
||||
|
||||
{
|
||||
const res = await context.request.get('http://3.non.existent.domain.for.the.test/target.html');
|
||||
expect(await res.text()).toContain('Served by the proxy');
|
||||
}
|
||||
});
|
||||
|
||||
it('should use socks proxy', async ({ playwright, server, socksPort }) => {
|
||||
const request = await playwright.request.newContext({ proxy: {
|
||||
server: `socks5://localhost:${socksPort}`,
|
||||
} });
|
||||
const response = await request.get(server.EMPTY_PAGE);
|
||||
expect(await response.text()).toContain('Served by the SOCKS proxy');
|
||||
});
|
@ -153,31 +153,6 @@ it('should support WWW-Authenticate: Basic', async ({ playwright, server }) => {
|
||||
expect(credentials).toBe('user:pass');
|
||||
});
|
||||
|
||||
it('should use socks proxy', async ({ playwright, server, socksPort }) => {
|
||||
const request = await playwright.request.newContext({ proxy: {
|
||||
server: `socks5://localhost:${socksPort}`,
|
||||
} });
|
||||
const response = await request.get(server.EMPTY_PAGE);
|
||||
expect(await response.text()).toContain('Served by the SOCKS proxy');
|
||||
});
|
||||
|
||||
it('should pass proxy credentials', async ({ playwright, server, proxyServer }) => {
|
||||
proxyServer.forwardTo(server.PORT);
|
||||
let auth;
|
||||
proxyServer.setAuthHandler(req => {
|
||||
auth = req.headers['proxy-authorization'];
|
||||
return !!auth;
|
||||
});
|
||||
const request = await playwright.request.newContext({
|
||||
proxy: { server: `localhost:${proxyServer.PORT}`, username: 'user', password: 'secret' }
|
||||
});
|
||||
const response = await request.get('http://non-existent.com/simple.json');
|
||||
expect(proxyServer.connectHosts).toContain('non-existent.com:80');
|
||||
expect(auth).toBe('Basic ' + Buffer.from('user:secret').toString('base64'));
|
||||
expect(await response.json()).toEqual({ foo: 'bar' });
|
||||
await request.dispose();
|
||||
});
|
||||
|
||||
it('should support global ignoreHTTPSErrors option', async ({ playwright, httpsServer }) => {
|
||||
const request = await playwright.request.newContext({ ignoreHTTPSErrors: true });
|
||||
const response = await request.get(httpsServer.EMPTY_PAGE);
|
||||
|
Loading…
Reference in New Issue
Block a user