From dd6dacb125c484e382123d734d29d51cf0e40426 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Mon, 30 Aug 2021 14:34:31 -0700 Subject: [PATCH] fix(fetch): throw on network error (#8565) --- src/server/fetch.ts | 1 + tests/browsercontext-fetch.spec.ts | 54 ++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/src/server/fetch.ts b/src/server/fetch.ts index e3b84a8e2b..1a02fffb41 100644 --- a/src/server/fetch.ts +++ b/src/server/fetch.ts @@ -161,6 +161,7 @@ async function sendRequest(context: BrowserContext, url: URL, options: http.Requ body }); }); + response.on('aborted', () => reject(new Error('aborted'))); response.on('error',reject); }); request.on('error', reject); diff --git a/tests/browsercontext-fetch.spec.ts b/tests/browsercontext-fetch.spec.ts index a321cd32c9..cad4c8dc55 100644 --- a/tests/browsercontext-fetch.spec.ts +++ b/tests/browsercontext-fetch.spec.ts @@ -49,6 +49,60 @@ it('should work', async ({context, server}) => { expect(await response.text()).toBe('{"foo": "bar"}\n'); }); +it('should throw on network error', async ({context, server}) => { + server.setRoute('/test', (req, res) => { + req.socket.destroy(); + }); + let error; + // @ts-expect-error + await context._fetch(server.PREFIX + '/test').catch(e => error = e); + expect(error.message).toContain('socket hang up'); +}); + +it('should throw on network error after redirect', async ({context, server}) => { + server.setRedirect('/redirect', '/test'); + server.setRoute('/test', (req, res) => { + req.socket.destroy(); + }); + let error; + // @ts-expect-error + await context._fetch(server.PREFIX + '/redirect').catch(e => error = e); + expect(error.message).toContain('socket hang up'); +}); + +it('should throw on network error when sending body', async ({context, server}) => { + server.setRoute('/test', (req, res) => { + res.writeHead(200, { + 'content-length': 4096, + 'content-type': 'text/html', + }); + res.write('A'); + res.uncork(); + req.socket.destroy(); + }); + let error; + // @ts-expect-error + await context._fetch(server.PREFIX + '/test').catch(e => error = e); + expect(error.message).toContain('Error: aborted'); +}); + +it('should throw on network error when sending body after redirect', async ({context, server}) => { + server.setRedirect('/redirect', '/test'); + server.setRoute('/test', (req, res) => { + res.writeHead(200, { + 'content-length': 4096, + 'content-type': 'text/html', + }); + res.write('<title>A'); + res.uncork(); + req.socket.destroy(); + }); + let error; + // @ts-expect-error + await context._fetch(server.PREFIX + '/redirect').catch(e => error = e); + expect(error.message).toContain('Error: aborted'); +}); + it('should add session cookies to request', async ({context, server}) => { await context.addCookies([{ name: 'username',