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

@ -64,6 +64,19 @@ static int qname(const unsigned char **pkt, size_t *size)
#define QTYPE_AAAA 28
#define QTYPE_HTTPS 0x41
static const char *type2string(unsigned short qtype)
{
switch(qtype) {
case QTYPE_A:
return "A";
case QTYPE_AAAA:
return "AAAA";
case QTYPE_HTTPS:
return "HTTPS";
}
return "<unknown>";
}
/*
* Handle initial connection protocol.
*
@ -125,8 +138,7 @@ static int store_incoming(const unsigned char *data, size_t size,
fprintf(server, "Z: %x\n", (id & 0x70) >> 4);
fprintf(server, "RCODE: %x\n", (id & 0x0f));
#endif
qd = get16bit(&data, &size);
fprintf(server, "QDCOUNT: %04x\n", qd);
(void) get16bit(&data, &size);
data += 6; /* skip ANCOUNT, NSCOUNT and ARCOUNT */
size -= 6;
@ -136,14 +148,13 @@ static int store_incoming(const unsigned char *data, size_t size,
qptr = data;
if(!qname(&data, &size)) {
fprintf(server, "QNAME: %s\n", name);
qd = get16bit(&data, &size);
fprintf(server, "QTYPE: %04x\n", qd);
fprintf(server, "QNAME %s QTYPE %s\n", name, type2string(qd));
*qtype = qd;
logmsg("Question for '%s' type %x", name, qd);
logmsg("Question for '%s' type %x / %s", name, qd,
type2string(qd));
qd = get16bit(&data, &size);
logmsg("QCLASS: %04x\n", qd);
(void) get16bit(&data, &size);
*qlen = qsize - size; /* total size of the query */
memcpy(qbuf, qptr, *qlen);
@ -618,7 +629,7 @@ static int test_dnsd(int argc, char **argv)
clear_advisor_read_lock(loglockfile);
}
logmsg("end of one transfer");
/* logmsg("end of one transfer"); */
}
dnsd_cleanup: