diff --git a/packages/node/src/handlers.ts b/packages/node/src/handlers.ts index 9e9e81a67f3c..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,7 +172,7 @@ export function parseRequest( [key: string]: any; }, options?: { - request?: boolean; + request?: boolean | string[]; serverName?: boolean; transaction?: boolean | TransactionTypes; user?: boolean | string[]; @@ -188,7 +199,7 @@ export function parseRequest( if (options.request) { event.request = { ...event.request, - ...extractRequestData(req), + ...extractRequestData(req, options.request), }; } 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(); + }); + }); +});