From 6f9f761175f94ec1740a677ca88a37201f52b0b8 Mon Sep 17 00:00:00 2001 From: George Cheng Date: Wed, 29 May 2024 07:56:45 +0000 Subject: [PATCH] Do not handle server errors. --- index.js | 6 +--- test-server.js | 57 +++++++++++++++++++++++++++++++++++ test.js | 80 ++++++-------------------------------------------- 3 files changed, 67 insertions(+), 76 deletions(-) create mode 100644 test-server.js diff --git a/index.js b/index.js index 5b358bf..40d52b4 100644 --- a/index.js +++ b/index.js @@ -51,9 +51,7 @@ const createAdapter = handler => config => new Promise((resolve, reject) => { const server = handler instanceof Server ? handler : createServer(handler) const listening = server.listening - server.on('error', reject); - - /** @type {Promise} */ ( + ;/** @type {Promise} */ ( new Promise(resolve => { if (listening) { resolve() @@ -71,7 +69,6 @@ const createAdapter = handler => config => new Promise((resolve, reject) => { } ).then( (response) => { - server.off('error', reject) if (listening) { return response } else { @@ -81,7 +78,6 @@ const createAdapter = handler => config => new Promise((resolve, reject) => { } }, (error) => { - server.off('error', reject) if (listening) { throw error } else { diff --git a/test-server.js b/test-server.js new file mode 100644 index 0000000..5fcf4fa --- /dev/null +++ b/test-server.js @@ -0,0 +1,57 @@ +const { createServer } = require('http') +const test = require('ava').default +const axiosist = require('.').default + +test('should work with unlistened http server', async t => { + const server = createServer((req, res) => res.end('foo')) + const response = await axiosist(server).get('/') + + t.is(/** @type {string} */(response.data), 'foo') + t.false(server.listening) +}) + +test('should work with unlistened http server (client failure)', async t => { + const server = createServer((req, res) => res.end('bar')) + + await t.throwsAsync(axiosist(server).get('/', { maxContentLength: 1 }), { message: /maxContentLength/ }) + t.false(server.listening) +}) + +test('should work with unlistened http server (server failure)', async t => { + const server = createServer((req, res) => res.destroy()) + + await t.throwsAsync(axiosist(server).get('/'), { message: 'socket hang up' }) + t.false(server.listening) +}) + +test('should work with listened http server', async t => { + const server = createServer((req, res) => res.end('bar')) + await new Promise(resolve => server.listen(resolve)) + + const response = await axiosist(server).get('/') + + t.is(/** @type {string} */(response.data), 'bar') + t.true(server.listening) + + await new Promise(resolve => server.close(resolve)) +}) + +test('should work with listened http server (client failure)', async t => { + const server = createServer((req, res) => res.end('bar')) + await new Promise(resolve => server.listen(resolve)) + + await t.throwsAsync(axiosist(server).get('/', { maxContentLength: 1 }), { message: 'maxContentLength size of 1 exceeded' }) + t.true(server.listening) + + await new Promise(resolve => server.close(resolve)) +}) + +test('should work with listened http server (server failure)', async t => { + const server = createServer((req, res) => res.destroy()) + await new Promise(resolve => server.listen(resolve)) + + await t.throwsAsync(axiosist(server).get('/'), { message: 'socket hang up' }) + t.true(server.listening) + + await new Promise(resolve => server.close(resolve)) +}) diff --git a/test.js b/test.js index 66b2ff0..3b4f964 100644 --- a/test.js +++ b/test.js @@ -1,4 +1,3 @@ -const { createServer } = require('http') const test = require('ava').default const axiosist = require('.').default @@ -98,7 +97,15 @@ test('should response the right body', async t => { t.is(/** @type {string} */(response.data), 'foo') }) -test('should fail correctly', async t => { +test('should handle server failure', async t => { + await t.throwsAsync(axiosist((req, res) => { + res.destroy() + }).request({ + url: '/' + }), { message: 'socket hang up' }) +}) + +test('should handle client failure', async t => { await t.throwsAsync(axiosist((req, res) => { res.end('foo') }).request({ @@ -117,72 +124,3 @@ test('should response redirect', async t => { t.is(response.status, 302) t.is(response.headers.location, 'http://example.com/') }) - -test('should work with unlistened http server', async t => { - const server = createServer((req, res) => res.end('foo')) - const response = await axiosist(server).get('/') - - t.is(/** @type {string} */(response.data), 'foo') - t.false(server.listening) -}) - -test('should work with listened http server', async t => { - const server = createServer((req, res) => res.end('bar')) - await new Promise(resolve => server.listen(resolve)) - - const response = await axiosist(server).get('/') - - t.is(/** @type {string} */(response.data), 'bar') - t.true(server.listening) - - await new Promise(resolve => server.close(resolve)) -}) - -test('should work with listened http server (failed request)', async t => { - const server = createServer((req, res) => res.end('bar')) - await new Promise(resolve => server.listen(resolve)) - - await t.throwsAsync(axiosist(server).get('/', { maxContentLength: 1 })) - t.true(server.listening) - - await new Promise(resolve => server.close(resolve)) -}) - -test('should fail with client error', async t => { - /** @type {import('http').Server} */ - const server = createServer((req, res) => res.destroy()) - await t.throwsAsync(axiosist(server).get('/'), { message: 'socket hang up' }) -}) - -test('should not keep error listeners', async t => { - const server = createServer((req, res) => res.end()) - - await axiosist(server).get('/') - t.is(server.listenerCount('error'), 0) -}) - -test('should not keep error listeners (client error)', async t => { - const server = createServer((req, res) => res.end('foo')) - - await t.throwsAsync(axiosist(server).get('/', { maxContentLength: 1 })) - t.is(server.listenerCount('error'), 0) -}) - -test('should fail with server error', async t => { - const server = createServer() - server.on('request', (req, res) => { - server.emit('error', new Error('foo')) - res.end() - }) - await t.throwsAsync(axiosist(server).get('/'), { message: 'foo' }) -}) - -test('should fail with handled server error', async t => { - const server = createServer() - server.on('request', (req, res) => { - server.emit('error', new Error('foo')) - res.end() - }) - server.on('error', (err) => console.error(err)) - await t.throwsAsync(axiosist(server).get('/'), { message: 'foo' }) -})