Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Do not handle server errors. #68

Merged
merged 1 commit into from
May 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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<void>} */ (
;/** @type {Promise<void>} */ (
new Promise(resolve => {
if (listening) {
resolve()
Expand All @@ -71,7 +69,6 @@ const createAdapter = handler => config => new Promise((resolve, reject) => {
}
).then(
(response) => {
server.off('error', reject)
if (listening) {
return response
} else {
Expand All @@ -81,7 +78,6 @@ const createAdapter = handler => config => new Promise((resolve, reject) => {
}
},
(error) => {
server.off('error', reject)
if (listening) {
throw error
} else {
Expand Down
57 changes: 57 additions & 0 deletions test-server.js
Original file line number Diff line number Diff line change
@@ -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))
})
80 changes: 9 additions & 71 deletions test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
const { createServer } = require('http')
const test = require('ava').default
const axiosist = require('.').default

Expand Down Expand Up @@ -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({
Expand All @@ -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' })
})
Loading