Try other resolved IPs if one fails to connect

(cherry picked from commit fd52e18d19)
This commit is contained in:
Haoyu Qiu
2021-07-11 17:43:52 +08:00
committed by Rémi Verschelde
parent 018f28bead
commit 25bd0c3f72
4 changed files with 48 additions and 9 deletions

View File

@@ -52,6 +52,8 @@ Error HTTPClient::connect_to_host(const String &p_host, int p_port, bool p_ssl,
conn_port = p_port;
conn_host = p_host;
ip_candidates.clear();
ssl = p_ssl;
ssl_verify_host = p_verify_host;
@@ -306,6 +308,7 @@ void HTTPClient::close() {
resolving = IP::RESOLVER_INVALID_ID;
}
ip_candidates.clear();
response_headers.clear();
response_str.clear();
body_size = -1;
@@ -328,10 +331,17 @@ Error HTTPClient::poll() {
return OK; // Still resolving
case IP::RESOLVER_STATUS_DONE: {
IP_Address host = IP::get_singleton()->get_resolve_item_address(resolving);
Error err = tcp_connection->connect_to_host(host, conn_port);
ip_candidates = IP::get_singleton()->get_resolve_item_addresses(resolving);
IP::get_singleton()->erase_resolve_item(resolving);
resolving = IP::RESOLVER_INVALID_ID;
Error err = ERR_BUG; // Should be at least one entry.
while (ip_candidates.size() > 0) {
err = tcp_connection->connect_to_host(ip_candidates.front(), conn_port);
if (err == OK) {
break;
}
}
if (err) {
status = STATUS_CANT_CONNECT;
return err;
@@ -385,6 +395,7 @@ Error HTTPClient::poll() {
if (ssl->get_status() == StreamPeerSSL::STATUS_CONNECTED) {
// Handshake has been successful
handshaking = false;
ip_candidates.clear();
status = STATUS_CONNECTED;
return OK;
} else if (ssl->get_status() != StreamPeerSSL::STATUS_HANDSHAKING) {
@@ -395,15 +406,24 @@ Error HTTPClient::poll() {
}
// ... we will need to poll more for handshake to finish
} else {
ip_candidates.clear();
status = STATUS_CONNECTED;
}
return OK;
} break;
case StreamPeerTCP::STATUS_ERROR:
case StreamPeerTCP::STATUS_NONE: {
Error err = ERR_CANT_CONNECT;
while (ip_candidates.size() > 0) {
tcp_connection->disconnect_from_host();
err = tcp_connection->connect_to_host(ip_candidates.pop_front(), conn_port);
if (err == OK) {
return OK;
}
}
close();
status = STATUS_CANT_CONNECT;
return ERR_CANT_CONNECT;
return err;
} break;
}
} break;