fix(install): hang on server side connection close (#28278)

This commit is contained in:
Max Schmitt 2023-11-22 20:26:21 +01:00 committed by GitHub
parent e405c1deea
commit 2f1b0d6ff7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 0 deletions

View file

@ -85,6 +85,13 @@ function downloadFile(options: DownloadParams): Promise<void> {
file.on('error', error => promise.reject(error));
response.pipe(file);
response.on('data', onData);
response.on('close', () => {
if (response.complete)
return;
file.close();
log(`-- download failed, server closed connection`);
promise.reject(new Error(`Download failed: server closed connection. URL: ${options.url}`));
});
}, (error: any) => promise.reject(error));
return promise;

View file

@ -68,3 +68,30 @@ test(`playwright cdn should race with a timeout`, async ({ exec }) => {
await new Promise(resolve => server.close(resolve));
}
});
test(`npx playwright install should not hang when CDN closes the connection`, async ({ exec }) => {
let retryCount = 0;
const server = http.createServer((req, res) => {
++retryCount;
res.writeHead(200, {
'Content-Length': 100 * 1024 * 1024,
'Content-Type': 'application/zip',
});
res.end('a');
});
await new Promise<void>(resolve => server.listen(0, resolve));
try {
await exec('npm i playwright');
const result = await exec('npx playwright install', {
env: {
PLAYWRIGHT_DOWNLOAD_HOST: `http://127.0.0.1:${(server.address() as AddressInfo).port}`,
DEBUG: 'pw:install',
},
expectToExitWithError: true
});
expect(retryCount).toBe(3);
expect([...result.matchAll(/Download failed: server closed connection/g)]).toHaveLength(3);
} finally {
await new Promise(resolve => server.close(resolve));
}
});