fix(install): hang on server side connection close (#28278)
This commit is contained in:
parent
e405c1deea
commit
2f1b0d6ff7
|
|
@ -85,6 +85,13 @@ function downloadFile(options: DownloadParams): Promise<void> {
|
||||||
file.on('error', error => promise.reject(error));
|
file.on('error', error => promise.reject(error));
|
||||||
response.pipe(file);
|
response.pipe(file);
|
||||||
response.on('data', onData);
|
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));
|
}, (error: any) => promise.reject(error));
|
||||||
return promise;
|
return promise;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -68,3 +68,30 @@ test(`playwright cdn should race with a timeout`, async ({ exec }) => {
|
||||||
await new Promise(resolve => server.close(resolve));
|
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));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue