int respwait = 0;
bool is_ipaddr;
size_t hostname_len;
+ bool keep_negative = TRUE; /* cache a negative result */
#ifndef CURL_DISABLE_DOH
data->conn->bits.doh = FALSE; /* default is not */
st = data->set.resolver_start(resolver, NULL,
data->set.resolver_start_client);
Curl_set_in_callback(data, FALSE);
- if(st)
+ if(st) {
+ keep_negative = FALSE;
goto error;
+ }
}
/* shortcut literal IP addresses, if we are not told to resolve them. */
else if(addr) {
/* we got a response, create a dns entry, add to cache, return */
dns = Curl_dnscache_mk_entry(data, addr, hostname, 0, port, FALSE);
- if(!dns)
- goto error;
- if(Curl_dnscache_add(data, dns))
+ if(!dns || Curl_dnscache_add(data, dns)) {
+ /* this is OOM or similar, don't store such negative resolves */
+ keep_negative = FALSE;
goto error;
+ }
show_resolve_info(data, dns);
*entry = dns;
return CURLE_OK;
Curl_resolv_unlink(data, &dns);
*entry = NULL;
Curl_async_shutdown(data);
- store_negative_resolve(data, hostname, port);
+ if(keep_negative)
+ store_negative_resolve(data, hostname, port);
return CURLE_COULDNT_RESOLVE_HOST;
}
result = Curl_async_is_resolved(data, dns);
if(*dns)
show_resolve_info(data, *dns);
- if(result)
+ if((result == CURLE_COULDNT_RESOLVE_HOST) ||
+ (result == CURLE_COULDNT_RESOLVE_PROXY))
store_negative_resolve(data, data->state.async.hostname,
data->state.async.port);
return result;