Skip to content

Conversation

@Lms24
Copy link
Member

@Lms24 Lms24 commented Jul 16, 2024

This PR fixes an oversight in our Node httpIntegration. It looks like we assumed that the request object being passed to ignoreIncomingRequestHook and ignoreOutgoingRequestHook was of the same type. However, it's not:

  • request is of type IncomingMessage in ignoreIncomingRequestHook
  • request is of type RequestOptions in ignoreOutgoingRequestHook

In both cases though, we tried to obtain the url to pass into the ignoreIncoming|outgoingRequests callback via our getUrl helper function. Since IncomingMessage doesn't have any of the properties required by getUrl, we always passed /// to the ignoreIncomingRequests callback.

This PR fixes the bug by simply taking the request.url property instead and adds integration tests to properly test the two options.

We could do more here, for example make ignoreIncomingRequestHook fully/partially overwriteable like we did with requestHook or via _experimentalConfig pass the request object as an additional param to the user-facing function but this should be done in a follow-up PR.

fixes #12913

@Lms24 Lms24 self-assigned this Jul 16, 2024
integrations: [
Sentry.httpIntegration({
ignoreOutgoingRequests: url => {
return url.includes('example.com');

Check failure

Code scanning / CodeQL

Incomplete URL substring sanitization

'[example.com](1)' can be anywhere in the URL, and arbitrary hosts may come before or after it.
*/
export function startExpressServerAndSendPortToRunner(app: Express): void {
const server = app.listen(0, () => {
export function startExpressServerAndSendPortToRunner(app: Express, port: number | undefined = undefined): void {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

small adjustment to our node integration tests framework: In the express apps, we can not optionally pass a fixed port which makes running the app locally a lot less painful 😅


ignoreIncomingRequestHook: request => {
const url = getRequestUrl(request);
const url = request.url;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just checking to be sure, is the url here the full URL, including protocol? so e.g. http://...? As we want these to be full URLs I guess always, if possible.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mydea url is NOT the full url, it is instead just the path (and maybe the query params? EDIT: definitely has query params too.).

the node:IncomingMessage type doesn't have a protocol, hostname, or port attr.

  • For protocol you'd have to do something like access req.socket.encrypted and infer true === https
  • For hostname you'd have to parse the request headers for a Host header, falling back to req.socket.address() if it doesn't exist.
  • For port you'd have to access req.socket.address().port, I think.

So all that to say, sadly it's difficult to reconstruct the full url. Thoughts?

Screenshot:
Screen Shot 2024-07-16 at 5 42 36 AM

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's all the available attrs:
Screen Shot 2024-07-16 at 5 40 06 AM

Copy link

@Bruno-DaSilva Bruno-DaSilva Jul 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mydea sorry i saw you moved your comment, so I just moved mine before I saw you replied 😅
I'll let you move your reply here so the comments aren't fragmented.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I feared that. IMHO this is OK, but we should maybe reflect this in the jsdoc/variables used for ignoreIncomingRequests, e.g. make it ignoreIncomingRequests(urlPath: string) or something like this?

Sounds reasonable to me but sadly this is a breaking change, no?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just changing the name of the variable is fine. Will make the change and update JSDoc and docs to reflect it. "Luckily" this never worked in v8 in the first place (afaict) so we're likely not behaviourally breaking folks.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regarding docs update: I'll do this in combination with the changes from #12930

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sounds good to me 🚀

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done: 9348717

@github-actions
Copy link
Contributor

github-actions bot commented Jul 16, 2024

size-limit report 📦

Path Size
@sentry/browser 22.3 KB (0%)
@sentry/browser (incl. Tracing) 33.69 KB (0%)
@sentry/browser (incl. Tracing, Replay) 69.77 KB (0%)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags 63.08 KB (0%)
@sentry/browser (incl. Tracing, Replay with Canvas) 74.17 KB (0%)
@sentry/browser (incl. Tracing, Replay, Feedback) 86.49 KB (0%)
@sentry/browser (incl. Tracing, Replay, Feedback, metrics) 88.36 KB (0%)
@sentry/browser (incl. metrics) 26.59 KB (0%)
@sentry/browser (incl. Feedback) 38.98 KB (0%)
@sentry/browser (incl. sendFeedback) 26.92 KB (0%)
@sentry/browser (incl. FeedbackAsync) 31.54 KB (0%)
@sentry/react 25.07 KB (0%)
@sentry/react (incl. Tracing) 36.75 KB (0%)
@sentry/vue 26.41 KB (0%)
@sentry/vue (incl. Tracing) 35.57 KB (0%)
@sentry/svelte 22.44 KB (0%)
CDN Bundle 23.52 KB (0%)
CDN Bundle (incl. Tracing) 35.47 KB (0%)
CDN Bundle (incl. Tracing, Replay) 69.87 KB (0%)
CDN Bundle (incl. Tracing, Replay, Feedback) 75.13 KB (0%)
CDN Bundle - uncompressed 69 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed 104.91 KB (0%)
CDN Bundle (incl. Tracing, Replay) - uncompressed 216.69 KB (0%)
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed 229.41 KB (0%)
@sentry/nextjs (client) 36.62 KB (0%)
@sentry/sveltekit (client) 34.34 KB (0%)
@sentry/node 130.82 KB (+0.01% 🔺)
@sentry/node - without tracing 91.91 KB (+0.01% 🔺)
@sentry/aws-serverless 117.08 KB (-0.01% 🔽)

Co-authored-by: Francesco Novy <francesco.novy@sentry.io>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

node http integration: ignoreIncomingRequests() option does not work

4 participants