UNPKG

@exceptionless/node

Version:
75 lines 3.11 kB
import { getCookies, isEmpty, isMatch, KnownEventDataKeys, stringify } from "@exceptionless/core"; export class NodeRequestInfoPlugin { priority = 70; name = "NodeRequestInfoPlugin"; run(context) { if (context.event.data && !context.event.data[KnownEventDataKeys.RequestInfo]) { const requestInfo = this.getRequestInfo(context); if (requestInfo) { if (isMatch(requestInfo.user_agent, context.client.config.userAgentBotPatterns)) { context.log.info("Cancelling event as the request user agent matches a known bot pattern"); context.cancelled = true; } else { context.event.data[KnownEventDataKeys.RequestInfo] = requestInfo; } } } return Promise.resolve(); } getRequestInfo(context) { // TODO: Move this into a known keys. const REQUEST_KEY = "@request"; if (!context.eventContext[REQUEST_KEY]) { return; } const config = context.client.config; const exclusions = config.dataExclusions; const request = context.eventContext[REQUEST_KEY]; const requestInfo = { user_agent: request.headers["user-agent"], http_method: request.method, is_secure: request.secure, host: request.hostname, path: request.path, referrer: request.headers.referer }; const host = request.headers.host; const port = (host && parseInt(host.slice(host.indexOf(":") + 1), 10)) || 0; if (port > 0) { requestInfo.port = port; } if (config.includeIpAddress) { requestInfo.client_ip_address = request.ip; } if (config.includeCookies) { requestInfo.cookies = getCookies(request.headers.cookie, exclusions); } if (config.includeHeaders) { const ignoredHeaders = ["Authorization", "Cookie", "Host", "Method", "Path", "Proxy-Authorization", "Referer", "User-Agent"]; const json = stringify(request.headers, [...ignoredHeaders, ...exclusions]); if (!isEmpty(json)) { const headers = {}; const parsedHeaders = JSON.parse(json); for (const key in parsedHeaders) { headers[key] = parsedHeaders[key].split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/).map((value) => value.trim()); } requestInfo.headers = headers; } } if (config.includeQueryString) { const json = stringify(request.params, exclusions); if (!isEmpty(json)) { requestInfo.query_string = JSON.parse(json); } } if (config.includePostData) { const json = stringify(request.body, exclusions); if (!isEmpty(json)) { requestInfo.post_data = JSON.parse(json); } } return requestInfo; } } //# sourceMappingURL=NodeRequestInfoPlugin.js.map