int *waitp)
{
struct async_ares_ctx *ares = &data->state.async.ares;
+#ifdef USE_HTTPSRR
+ char *rrname = NULL;
+#endif
*waitp = 0; /* default to synchronous response */
if(async_ares_init_lazy(data))
data->state.async.hostname = strdup(hostname);
if(!data->state.async.hostname)
return NULL;
+#ifdef USE_HTTPSRR
+ if(port != 443) {
+ rrname = curl_maprintf("_%d_.https.%s", port, hostname);
+ if(!rrname) {
+ free(data->state.async.hostname);
+ return NULL;
+ }
+ }
+#endif
/* initial status - failed */
ares->ares_status = ARES_ENOTFOUND;
#endif
#ifdef USE_HTTPSRR
{
- CURL_TRC_DNS(data, "asyn-ares: fire off query for HTTPSRR");
+ CURL_TRC_DNS(data, "asyn-ares: fire off query for HTTPSRR: %s",
+ rrname ? rrname : data->state.async.hostname);
memset(&ares->hinfo, 0, sizeof(ares->hinfo));
ares->hinfo.port = -1;
+ ares->hinfo.rrname = rrname;
ares->num_pending++; /* one more */
- ares_query_dnsrec(ares->channel, data->state.async.hostname,
+ ares_query_dnsrec(ares->channel,
+ rrname ? rrname : data->state.async.hostname,
ARES_CLASS_IN, ARES_REC_TYPE_HTTPS,
async_ares_rr_done, data, NULL);
}
thrdd->rr.result = Curl_httpsrr_from_ares(data, dnsrec, &thrdd->rr.hinfo);
}
-static CURLcode async_rr_start(struct Curl_easy *data)
+static CURLcode async_rr_start(struct Curl_easy *data, int port)
{
struct async_thrdd_ctx *thrdd = &data->state.async.thrdd;
int status;
+ char *rrname = NULL;
DEBUGASSERT(!thrdd->rr.channel);
+ if(port != 443) {
+ rrname = curl_maprintf("_%d_.https.%s", port, data->conn->host.name);
+ if(!rrname)
+ return CURLE_OUT_OF_MEMORY;
+ }
status = ares_init_options(&thrdd->rr.channel, NULL, 0);
if(status != ARES_SUCCESS) {
thrdd->rr.channel = NULL;
memset(&thrdd->rr.hinfo, 0, sizeof(thrdd->rr.hinfo));
thrdd->rr.hinfo.port = -1;
+ thrdd->rr.hinfo.rrname = rrname;
ares_query_dnsrec(thrdd->rr.channel,
- data->conn->host.name, ARES_CLASS_IN,
+ rrname ? rrname : data->conn->host.name, ARES_CLASS_IN,
ARES_REC_TYPE_HTTPS,
async_thrdd_rr_done, data, NULL);
CURL_TRC_DNS(data, "Issued HTTPS-RR request for %s", data->conn->host.name);
}
#ifdef USE_HTTPSRR_ARES
- if(async_rr_start(data))
+ if(async_rr_start(data, port))
infof(data, "Failed HTTPS RR operation");
#endif
CURL_TRC_DNS(data, "resolve thread started for of %s:%d", hostname, port);
Curl_safefree(rrinfo->echconfiglist);
Curl_safefree(rrinfo->ipv4hints);
Curl_safefree(rrinfo->ipv6hints);
+ Curl_safefree(rrinfo->rrname);
}
}
}
out:
+ Curl_safefree(hinfo->rrname);
return result;
}
struct Curl_easy;
struct Curl_https_rrinfo {
+ char *rrname; /* if NULL, the same as the URL hostname */
/*
* Fields from HTTPS RR. The only mandatory fields are priority and target.
* See https://datatracker.ietf.org/doc/html/rfc9460#section-14.3.2
HTTP
HTTP GET
DOH
+httpsrr
</keywords>
</info>