feross / simple-get

Simplest way to make http get requests. Supports HTTPS, redirects, gzip/deflate, streams in < 100 lines
MIT License
401 stars 50 forks source link

Abort DNS lookup on request abort #84

Open miraclx opened 5 months ago

miraclx commented 5 months ago

https://github.com/feross/simple-get/blob/e7a74115ca9dd28720f186275c5a67df81985426/index.js#L74-L77

This calls abort on the request, and fires the callback. So you'd expect simpleGet to have relinquished all execution back to the caller.

But in a super simple example of simply making a request to some URL, and exiting (nothing more), there is an observed 30s delay between when the callback is called with the error and before the process exits.

I looked into it, and it appears this is caused by the fact that the http module from node defaults to dns.lookup which is not cancellable.

I experimented with swapping this out with Tangerine which maintains an internal AbortController and adding a tangerine.cancel() on any error and it worked flawlessly.

Slight hiccup though - tangerine's peer dependency is undici so it might be unfortunate to pull that in if you're not using it. Ref: https://github.com/feross/simple-get/issues/64

But there's other DNS alternatives that don't require undici. Up to you, just figured I'd mention this here.