From 97d92682b78ba94a7fa783ff40282e3d12ee5003 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 2 Mar 2018 13:26:28 -0600 Subject: [PATCH 1/3] first pass --- index.js | 9 ++++++++- test/test.verbose.js | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 test/test.verbose.js diff --git a/index.js b/index.js index 04b87f2..73dadc4 100644 --- a/index.js +++ b/index.js @@ -7,7 +7,8 @@ const defaults = { requiredTags: ['handler'], excludeStatus: [], includeId: false, - tags: ['detailed-response'] + tags: ['detailed-response'], + verbose: false }; const contains = (arr1, arr2) => arr1.some(item => arr2.includes(item)); @@ -97,6 +98,12 @@ const register = (server, options) => { } server.log(tags, data); } + const verboseTags = ['unauthenticated']; + if (options.verbose && Object.keys(eventTags).some(tag => verboseTags.contains(tag))) { + const data = getLogData(request, 401); + const tags = [].concat(options.tags); + server.log(tags, data); + } }); // options.request will register a handler that logs a response for every route: diff --git a/test/test.verbose.js b/test/test.verbose.js new file mode 100644 index 0000000..1112828 --- /dev/null +++ b/test/test.verbose.js @@ -0,0 +1,44 @@ +const test = require('tap').test; +const Hapi = require('hapi'); +const boom = require('boom'); + +const wait = (ms) => new Promise(resolve => setTimeout(resolve, ms)); + +test('verbose mode logs accept-encoding event', async (t) => { + const server = new Hapi.Server({ + debug: { + request: ['error'] + }, + port: 8080 + }); + await server.register([ + { plugin: require('../'), + options: { + verbose: true + } + } + ]); + server.route({ + method: 'GET', + path: '/error', + handler(request, h) { + // simulate an accept-encoding event: + request._log(['accept-encoding', 'error'], new Error('did not accept')); + } + }); + server.events.on('log', async (event, tags) => { + console.log('+') + console.log('+') + console.log('+') + console.log('+') + console.log(tags) + // t.ok(tags['accept-encoding']); + await server.stop(); + t.end(); + }); + await server.start(); + try { + await server.inject({ url: '/error' }); + } catch (e) { + } +}); From e79cee0945ad8a6f2fce1f766e468c67d87fd085 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 2 Mar 2018 13:38:03 -0600 Subject: [PATCH 2/3] simplify --- index.js | 8 +------- test/test.response.js | 39 ++++++++++++++++++++++++++++++++++++++ test/test.verbose.js | 44 ------------------------------------------- 3 files changed, 40 insertions(+), 51 deletions(-) delete mode 100644 test/test.verbose.js diff --git a/index.js b/index.js index 73dadc4..0c56ec3 100644 --- a/index.js +++ b/index.js @@ -69,7 +69,7 @@ const register = (server, options) => { if (event.error && event.error.output) { // ignore if required tags were specified, but none of them match any of the event tags: const tagArray = Array.isArray(event.tags) ? event.tags : Object.keys(event.tags); - if (options.requiredTags.length > 0 && !contains(options.requiredTags, tagArray)) { + if (!options.verbose && options.requiredTags.length > 0 && !contains(options.requiredTags, tagArray)) { return; } const statusCode = event.error.output.statusCode; @@ -98,12 +98,6 @@ const register = (server, options) => { } server.log(tags, data); } - const verboseTags = ['unauthenticated']; - if (options.verbose && Object.keys(eventTags).some(tag => verboseTags.contains(tag))) { - const data = getLogData(request, 401); - const tags = [].concat(options.tags); - server.log(tags, data); - } }); // options.request will register a handler that logs a response for every route: diff --git a/test/test.response.js b/test/test.response.js index 044ffb8..56a08eb 100644 --- a/test/test.response.js +++ b/test/test.response.js @@ -513,3 +513,42 @@ test('options.requiredTags just logs everything if set to empty', async (t) => { await server.stop(); t.end(); }); + +test('options.verbose logs all request events', async (t) => { + const server = new Hapi.Server({ + debug: { + request: ['error'] + }, + port: 8080 + }); + await server.register([ + { plugin: require('../'), + options: { + verbose: true + } + } + ]); + server.route({ + method: 'GET', + path: '/error', + handler(request, h) { + // simulate an accept-encoding event: + request._log(['accept-encoding', 'error'], new Error('did not accept')); + } + }); + server.events.on('log', async (event, tags) => { + console.log('+') + console.log('+') + console.log('+') + console.log('+') + console.log(tags) + // t.ok(tags['accept-encoding']); + await server.stop(); + t.end(); + }); + await server.start(); + try { + await server.inject({ url: '/error' }); + } catch (e) { + } +}); diff --git a/test/test.verbose.js b/test/test.verbose.js deleted file mode 100644 index 1112828..0000000 --- a/test/test.verbose.js +++ /dev/null @@ -1,44 +0,0 @@ -const test = require('tap').test; -const Hapi = require('hapi'); -const boom = require('boom'); - -const wait = (ms) => new Promise(resolve => setTimeout(resolve, ms)); - -test('verbose mode logs accept-encoding event', async (t) => { - const server = new Hapi.Server({ - debug: { - request: ['error'] - }, - port: 8080 - }); - await server.register([ - { plugin: require('../'), - options: { - verbose: true - } - } - ]); - server.route({ - method: 'GET', - path: '/error', - handler(request, h) { - // simulate an accept-encoding event: - request._log(['accept-encoding', 'error'], new Error('did not accept')); - } - }); - server.events.on('log', async (event, tags) => { - console.log('+') - console.log('+') - console.log('+') - console.log('+') - console.log(tags) - // t.ok(tags['accept-encoding']); - await server.stop(); - t.end(); - }); - await server.start(); - try { - await server.inject({ url: '/error' }); - } catch (e) { - } -}); From a502f057abef59a525acbc3a537729a8043524e3 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 2 Mar 2018 14:00:09 -0600 Subject: [PATCH 3/3] update test, include original tags --- index.js | 9 +++++++-- test/test.response.js | 23 +++++++++++------------ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/index.js b/index.js index 0c56ec3..c973663 100644 --- a/index.js +++ b/index.js @@ -66,13 +66,14 @@ const register = (server, options) => { if (request.route.settings.plugins['hapi-log-response'] && request.route.settings.plugins['hapi-log-response'].enabled === false) { return; } - if (event.error && event.error.output) { + if (options.verbose || (event.error && event.error.output)) { // ignore if required tags were specified, but none of them match any of the event tags: const tagArray = Array.isArray(event.tags) ? event.tags : Object.keys(event.tags); if (!options.verbose && options.requiredTags.length > 0 && !contains(options.requiredTags, tagArray)) { return; } - const statusCode = event.error.output.statusCode; + // the only request events that have no error are unauthorized: + const statusCode = event.error ? event.error.output.statusCode : 401; // skip 404's, they are covered by the response handler: if (statusCode === 404) { return; @@ -96,6 +97,10 @@ const register = (server, options) => { output: event.error.output }; } + // in verbose mode we might want to log the original tags: + if (options.verbose) { + data.eventTags = eventTags; + } server.log(tags, data); } }); diff --git a/test/test.response.js b/test/test.response.js index 56a08eb..45f5c2d 100644 --- a/test/test.response.js +++ b/test/test.response.js @@ -532,23 +532,22 @@ test('options.verbose logs all request events', async (t) => { method: 'GET', path: '/error', handler(request, h) { - // simulate an accept-encoding event: - request._log(['accept-encoding', 'error'], new Error('did not accept')); + // simulate a 'no authentication scheme' event + request.auth.isAuthenticated = false; + request.auth.credentials = null; + request.error = boom.unauthorized(); + request._log(['auth', 'unauthenticated']); + return h.response('not authenticated').code(401); } }); server.events.on('log', async (event, tags) => { - console.log('+') - console.log('+') - console.log('+') - console.log('+') - console.log(tags) - // t.ok(tags['accept-encoding']); + t.ok(tags['user-error']); + t.ok(event.data.eventTags.auth, 'verbose mode includes original tags'); + t.ok(event.data.eventTags.unauthenticated, 'verbose mode includes original tags'); await server.stop(); t.end(); }); await server.start(); - try { - await server.inject({ url: '/error' }); - } catch (e) { - } + await server.inject({ url: '/error' }); + await wait(1000); });