Skip to content

Commit adbb407

Browse files
Log correct status code on request complete even for requests aborted during payload processing (#165)
1 parent 08c46d3 commit adbb407

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ async function register (server, options) {
9595
: () => true
9696

9797
const requestStartMessage = options.customRequestStartMessage || function () { return 'request start' }
98-
const requestCompleteMessage = options.customRequestCompleteMessage || function (request, responseTime) { return `[response] ${request.method} ${request.path} ${request.raw.res.statusCode} (${responseTime}ms)` }
98+
const requestCompleteMessage = options.customRequestCompleteMessage || function (request, responseTime) { return `[response] ${request.method} ${request.path} ${request.raw.res.headersSent ? request.raw.res.statusCode : '-'} (${responseTime}ms)` }
9999
const requestErrorMessage = options.customRequestErrorMessage || function (request, error) { return error.message } // Will default to `Internal Server Error` by hapi
100100

101101
// expose logger as 'server.logger'

test.js

+52
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
'use strict'
22

3+
const net = require('net')
4+
const stream = require('stream')
35
const Code = require('@hapi/code')
46
const Lab = require('@hapi/lab')
57
const Hoek = require('@hapi/hoek')
@@ -290,6 +292,56 @@ experiment('logs each request', () => {
290292
await finish
291293
})
292294

295+
test('correctly set the status code on requests aborted during response payload processing', async (flags) => {
296+
const opts = { host: '127.0.0.1', port: 3000 }
297+
const server = Hapi.server(opts)
298+
299+
let done
300+
const finish = new Promise(function (resolve, reject) {
301+
done = resolve
302+
})
303+
304+
server.route({
305+
path: '/',
306+
method: 'GET',
307+
handler: (req, h) => {
308+
const source = new stream.Readable({
309+
read () {
310+
if (this.called) {
311+
return
312+
}
313+
314+
this.called = true
315+
this.push('delayed')
316+
}
317+
})
318+
319+
source.pipe(req.raw.res)
320+
return h.abandon
321+
}
322+
})
323+
await registerWithSink(server, 'info', (data, enc, cb) => {
324+
if (data.res) {
325+
expect(data.res.statusCode).to.equal(200)
326+
expect(data.msg).to.match(/\[response\] get \/ - \(\d*ms\)/)
327+
done()
328+
}
329+
cb()
330+
})
331+
332+
await server.start()
333+
flags.onCleanup = () => server.stop()
334+
335+
const client = net.connect(server.info.port, server.info.address, () => {
336+
client.write('GET / HTTP/1.1\r\n\r\n')
337+
})
338+
339+
client.on('data', () => {
340+
client.destroy()
341+
})
342+
await finish
343+
})
344+
293345
test('handles 500s', async () => {
294346
const server = getServer()
295347
let count = 0

0 commit comments

Comments
 (0)