hostip: cache negative name resolves

Hold them for half the normal lifetime. Helps when told to transfer N
URLs in quick succession that all use the same non-resolving hostname.

Done by storing a DNS entry with a NULL pointer for 'addr'.

Previously an attempt was made in #12406 by Björn Stenberg that was
ultimately never merged.

Closes #18157
This commit is contained in:
Daniel Stenberg 2025-08-04 00:06:03 +02:00
parent 06c12cc08b
commit df2b4ccc22
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
11 changed files with 155 additions and 19 deletions

View file

@ -24,7 +24,6 @@
1.5 get rid of PATH_MAX
1.6 thread-safe sharing
1.8 CURLOPT_RESOLVE for any port number
1.9 Cache negative name resolves
1.10 auto-detect proxy
1.11 minimize dependencies with dynamically loaded modules
1.12 updated DNS server while running
@ -263,11 +262,6 @@
See https://github.com/curl/curl/issues/1264
1.9 Cache negative name resolves
A name resolve that has failed is likely to fail when made again within a
short period of time. Currently we only cache positive responses.
1.10 auto-detect proxy
libcurl could be made to detect the system proxy setup automatically and use

View file

@ -10,6 +10,7 @@ See-also:
- CURLOPT_DNS_USE_GLOBAL_CACHE (3)
- CURLOPT_MAXAGE_CONN (3)
- CURLOPT_RESOLVE (3)
- CURLMOPT_NETWORK_CHANGED (3)
Protocol:
- All
Added-in: 7.9.3
@ -48,8 +49,11 @@ DNS entries have a "TTL" property but libcurl does not use that. This DNS
cache timeout is entirely speculative that a name resolves to the same address
for a small amount of time into the future.
Since version 8.1.0, libcurl prunes entries from the DNS cache if it exceeds
30,000 entries no matter which timeout value is used.
libcurl prunes entries from the DNS cache if it exceeds 30,000 entries no
matter which timeout value is used. (Added in version 8.1.0)
Since curl 8.16.0, failed name resolves are stored in the DNS cache for half
the set timeout period.
# DEFAULT

View file

@ -747,3 +747,13 @@ should be cut off from the upload data before comparing it.
### `<valgrind>`
disable - disables the valgrind log check for this test
### `<dns [host="name"]>`
This specify the input the DNS server is expected to get from curl. Because of
differences in implementations, this section is sorted automatically before
compared.
Because of local configurations in machines running tests, there may be
additional requests sent to `[host].[custom suffix]`. To prevent such requests
to mess up comparisons, we can set the hostname to check in the `<dns>` tag.