From cf4d643de57d9af00dd2083398bd0fe635300dad Mon Sep 17 00:00:00 2001 From: Tobias Date: Tue, 16 Jul 2019 10:01:58 +0100 Subject: [PATCH 1/3] Add cookies as an optional property in the request handler --- packages/node/src/handlers.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/node/src/handlers.ts b/packages/node/src/handlers.ts index 9e9e81a67f3c..0265e0a37054 100644 --- a/packages/node/src/handlers.ts +++ b/packages/node/src/handlers.ts @@ -161,6 +161,7 @@ export function parseRequest( [key: string]: any; }, options?: { + cookies?: boolean; request?: boolean; serverName?: boolean; transaction?: boolean | TransactionTypes; @@ -170,6 +171,7 @@ export function parseRequest( ): Event { // tslint:disable-next-line:no-parameter-reassignment options = { + cookies: true, request: true, serverName: true, transaction: true, @@ -190,6 +192,10 @@ export function parseRequest( ...event.request, ...extractRequestData(req), }; + + if (!options.cookies) { + delete event.request.cookies; + } } if (options.serverName) { From 86e4cd7a029c4e0d2ab68019960229ca7a0720f8 Mon Sep 17 00:00:00 2001 From: Tobias Date: Wed, 31 Jul 2019 14:25:06 +0100 Subject: [PATCH 2/3] Update request filtering logic - Revert cookie configuration option. - Add optional array to request argument - Filter any keys from the request interface that don't match the array --- packages/node/src/handlers.ts | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/packages/node/src/handlers.ts b/packages/node/src/handlers.ts index 0265e0a37054..aa5f23abb999 100644 --- a/packages/node/src/handlers.ts +++ b/packages/node/src/handlers.ts @@ -26,7 +26,7 @@ function extractTransaction(req: { [key: string]: any }, type: boolean | Transac stack: [ { name: string; - } + }, ]; }; }; @@ -51,7 +51,7 @@ function extractTransaction(req: { [key: string]: any }, type: boolean | Transac } /** JSDoc */ -function extractRequestData(req: { [key: string]: any }): { [key: string]: string } { +function extractRequestData(req: { [key: string]: any }, keys: boolean | string[]): { [key: string]: string } { // headers: // node, express: req.headers // koa: req.header @@ -112,6 +112,17 @@ function extractRequestData(req: { [key: string]: any }): { [key: string]: strin url: absoluteUrl, }; + const attributes = Array.isArray(keys) ? keys : []; + + if (attributes.length) { + Object.keys(request).forEach(key => { + /** Remove any of the unspecified keys in the options from the request interface */ + if (!attributes.includes(key)) { + delete request[key]; + } + }); + } + return request; } @@ -161,8 +172,7 @@ export function parseRequest( [key: string]: any; }, options?: { - cookies?: boolean; - request?: boolean; + request?: boolean | string[]; serverName?: boolean; transaction?: boolean | TransactionTypes; user?: boolean | string[]; @@ -171,7 +181,6 @@ export function parseRequest( ): Event { // tslint:disable-next-line:no-parameter-reassignment options = { - cookies: true, request: true, serverName: true, transaction: true, @@ -190,12 +199,8 @@ export function parseRequest( if (options.request) { event.request = { ...event.request, - ...extractRequestData(req), + ...extractRequestData(req, options.request), }; - - if (!options.cookies) { - delete event.request.cookies; - } } if (options.serverName) { From 3369545ab6585aec8d97c2d6e69dc13a236f7ca8 Mon Sep 17 00:00:00 2001 From: Tobias Date: Wed, 31 Jul 2019 14:25:37 +0100 Subject: [PATCH 3/3] Add tests for parseRequest user and request objects --- packages/node/test/handlers.test.ts | 73 +++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 packages/node/test/handlers.test.ts diff --git a/packages/node/test/handlers.test.ts b/packages/node/test/handlers.test.ts new file mode 100644 index 000000000000..60b981840bc6 --- /dev/null +++ b/packages/node/test/handlers.test.ts @@ -0,0 +1,73 @@ +import { parseRequest } from '../src/handlers'; +import { Event } from '../src'; + +describe('parseRequest', () => { + const mockReq = { + method: 'GET', + url: '/some/path?key=value', + headers: { + host: 'mattrobenolt.com', + }, + cookies: { test: 'test' }, + body: '', + user: { + id: 123, + username: 'tobias', + email: 'tobias@mail.com', + custom_property: 'foo', + }, + }; + + describe('parseRequest.user properties', () => { + const DEFAULT_USER_KEYS = ['id', 'username', 'email']; + const CUSTOM_USER_KEYS = ['custom_property']; + + test('parseRequest.user only contains the default properties from the user', done => { + const fakeEvent: Event = {}; + const parsedRequest: Event = parseRequest(fakeEvent, mockReq); + const userKeys = Object.keys(parsedRequest.user); + + expect(userKeys).toEqual(DEFAULT_USER_KEYS); + expect(userKeys).not.toEqual(expect.arrayContaining(CUSTOM_USER_KEYS)); + done(); + }); + + test('parseRequest.user only contains the custom properties specified in the options.user array', done => { + const options = { + user: CUSTOM_USER_KEYS, + }; + const fakeEvent: Event = {}; + const parsedRequest: Event = parseRequest(fakeEvent, mockReq, options); + const userKeys = Object.keys(parsedRequest.user); + + expect(userKeys).toEqual(CUSTOM_USER_KEYS); + expect(userKeys).not.toEqual(expect.arrayContaining(DEFAULT_USER_KEYS)); + done(); + }); + }); + + describe('parseRequest.request properties', () => { + test('parseRequest.request only contains the default set of properties from the request', done => { + const DEFAULT_REQUEST_PROPERTIES = ['cookies', 'data', 'headers', 'method', 'query_string', 'url']; + const fakeEvent: Event = {}; + const parsedRequest: Event = parseRequest(fakeEvent, mockReq, {}); + expect(Object.keys(parsedRequest.request)).toEqual(DEFAULT_REQUEST_PROPERTIES); + done(); + }); + + test('parseRequest.request only contains the specified properties in the options.request array', done => { + const EXCLUDED_PROPERTIES = ['cookies', 'method']; + const INCLUDED_PROPERTIES = ['data', 'headers', 'query_string', 'url']; + const options = { + request: INCLUDED_PROPERTIES, + }; + const fakeEvent: Event = {}; + const parsedRequest: Event = parseRequest(fakeEvent, mockReq, options); + const requestKeys = Object.keys(parsedRequest.request); + + expect(requestKeys).toEqual(INCLUDED_PROPERTIES); + expect(requestKeys).not.toEqual(expect.arrayContaining(EXCLUDED_PROPERTIES)); + done(); + }); + }); +});