Skip to content

Commit 459966e

Browse files
committed
fix(client-certificates): errors during http2 TLS handshake
1 parent e3480d1 commit 459966e

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

packages/playwright-core/src/server/socksClientCertificatesInterceptor.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ class SocksProxyConnection {
169169
this.target.removeListener('close', this._targetCloseEventListener);
170170
// @ts-expect-error
171171
const session: http2.ServerHttp2Session = http2.performServerHandshake(internalTLS);
172+
session.on('error', () => this._targetCloseEventListener());
172173
session.once('stream', (stream: http2.ServerHttp2Stream) => {
173174
stream.respond({
174175
'content-type': 'text/html',

tests/library/client-certificates.spec.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ test.describe('browser', () => {
461461
});
462462

463463
await new Promise<void>(resolve => server.listen(0, 'localhost', resolve));
464-
const port = (server.address() as import('net').AddressInfo).port;
464+
const port = (server.address() as net.AddressInfo).port;
465465
const origin = 'https://' + (browserName === 'webkit' && platform === 'darwin' ? 'local.playwright' : 'localhost');
466466
const serverUrl = `${origin}:${port}`;
467467

@@ -671,6 +671,39 @@ test.describe('browser', () => {
671671
await page.close();
672672
});
673673

674+
test('should handle rejected certificate in handshake with HTTP/2', async ({ browser, asset, browserName, platform }) => {
675+
const server: http2.Http2SecureServer = createHttp2Server({
676+
key: fs.readFileSync(asset('client-certificates/server/server_key.pem')),
677+
cert: fs.readFileSync(asset('client-certificates/server/server_cert.pem')),
678+
ca: [fs.readFileSync(asset('client-certificates/server/server_cert.pem'))],
679+
requestCert: true,
680+
}, async (req: http2.Http2ServerRequest, res: http2.Http2ServerResponse) => {
681+
res.writeHead(200, { 'Content-Type': 'text/html' });
682+
res.end('Hello world');
683+
});
684+
685+
await new Promise<void>(resolve => server.listen(0, 'localhost', resolve));
686+
const port = (server.address() as net.AddressInfo).port;
687+
const serverUrl = 'https://' + (browserName === 'webkit' && platform === 'darwin' ? 'local.playwright' : 'localhost') + ':' + port;
688+
689+
const context = await browser.newContext({
690+
ignoreHTTPSErrors: true,
691+
clientCertificates: [{
692+
origin: 'https://just-there-that-the-client-certificates-proxy-server-is-getting-launched.com',
693+
certPath: asset('client-certificates/client/trusted/cert.pem'),
694+
keyPath: asset('client-certificates/client/trusted/key.pem'),
695+
}],
696+
});
697+
698+
const page = await context.newPage();
699+
700+
// This was triggering an unhandled error before.
701+
await page.goto(serverUrl).catch(e => e);
702+
703+
await context.close();
704+
await new Promise<void>(resolve => server.close(() => resolve()));
705+
});
706+
674707
test.describe('persistentContext', () => {
675708
test('validate input', async ({ launchPersistent }) => {
676709
test.slow();

0 commit comments

Comments
 (0)