mirror of
https://github.com/curl/curl.git
synced 2026-07-27 16:28:59 +03:00
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:
parent
06c12cc08b
commit
df2b4ccc22
11 changed files with 155 additions and 19 deletions
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue