|
@@ -161,22 +161,28 @@ Error WSLClient::connect_to_host(String p_host, String p_path, uint16_t p_port,
|
|
ERR_FAIL_COND_V(p_path.is_empty(), ERR_INVALID_PARAMETER);
|
|
ERR_FAIL_COND_V(p_path.is_empty(), ERR_INVALID_PARAMETER);
|
|
|
|
|
|
_peer = Ref<WSLPeer>(memnew(WSLPeer));
|
|
_peer = Ref<WSLPeer>(memnew(WSLPeer));
|
|
- IPAddress addr;
|
|
|
|
|
|
|
|
- if (!p_host.is_valid_ip_address()) {
|
|
|
|
- addr = IP::get_singleton()->resolve_hostname(p_host);
|
|
|
|
|
|
+ if (p_host.is_valid_ip_address()) {
|
|
|
|
+ ip_candidates.clear();
|
|
|
|
+ ip_candidates.push_back(IPAddress(p_host));
|
|
} else {
|
|
} else {
|
|
- addr = p_host;
|
|
|
|
|
|
+ ip_candidates = IP::get_singleton()->resolve_hostname_addresses(p_host);
|
|
}
|
|
}
|
|
|
|
|
|
- ERR_FAIL_COND_V(!addr.is_valid(), ERR_INVALID_PARAMETER);
|
|
|
|
|
|
+ ERR_FAIL_COND_V(ip_candidates.is_empty(), ERR_INVALID_PARAMETER);
|
|
|
|
|
|
String port = "";
|
|
String port = "";
|
|
if ((p_port != 80 && !p_ssl) || (p_port != 443 && p_ssl)) {
|
|
if ((p_port != 80 && !p_ssl) || (p_port != 443 && p_ssl)) {
|
|
port = ":" + itos(p_port);
|
|
port = ":" + itos(p_port);
|
|
}
|
|
}
|
|
|
|
|
|
- Error err = _tcp->connect_to_host(addr, p_port);
|
|
|
|
|
|
+ Error err = ERR_BUG; // Should be at least one entry.
|
|
|
|
+ while (ip_candidates.size() > 0) {
|
|
|
|
+ err = _tcp->connect_to_host(ip_candidates.pop_front(), p_port);
|
|
|
|
+ if (err == OK) {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
if (err != OK) {
|
|
if (err != OK) {
|
|
_tcp->disconnect_from_host();
|
|
_tcp->disconnect_from_host();
|
|
_on_error();
|
|
_on_error();
|
|
@@ -185,6 +191,7 @@ Error WSLClient::connect_to_host(String p_host, String p_path, uint16_t p_port,
|
|
_connection = _tcp;
|
|
_connection = _tcp;
|
|
_use_ssl = p_ssl;
|
|
_use_ssl = p_ssl;
|
|
_host = p_host;
|
|
_host = p_host;
|
|
|
|
+ _port = p_port;
|
|
// Strip edges from protocols.
|
|
// Strip edges from protocols.
|
|
_protocols.resize(p_protocols.size());
|
|
_protocols.resize(p_protocols.size());
|
|
String *pw = _protocols.ptrw();
|
|
String *pw = _protocols.ptrw();
|
|
@@ -244,6 +251,7 @@ void WSLClient::poll() {
|
|
_on_error();
|
|
_on_error();
|
|
break;
|
|
break;
|
|
case StreamPeerTCP::STATUS_CONNECTED: {
|
|
case StreamPeerTCP::STATUS_CONNECTED: {
|
|
|
|
+ ip_candidates.clear();
|
|
Ref<StreamPeerSSL> ssl;
|
|
Ref<StreamPeerSSL> ssl;
|
|
if (_use_ssl) {
|
|
if (_use_ssl) {
|
|
if (_connection == _tcp) {
|
|
if (_connection == _tcp) {
|
|
@@ -274,6 +282,12 @@ void WSLClient::poll() {
|
|
_do_handshake();
|
|
_do_handshake();
|
|
} break;
|
|
} break;
|
|
case StreamPeerTCP::STATUS_ERROR:
|
|
case StreamPeerTCP::STATUS_ERROR:
|
|
|
|
+ while (ip_candidates.size() > 0) {
|
|
|
|
+ _tcp->disconnect_from_host();
|
|
|
|
+ if (_tcp->connect_to_host(ip_candidates.pop_front(), _port) == OK) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
disconnect_from_host();
|
|
disconnect_from_host();
|
|
_on_error();
|
|
_on_error();
|
|
break;
|
|
break;
|
|
@@ -315,6 +329,8 @@ void WSLClient::disconnect_from_host(int p_code, String p_reason) {
|
|
|
|
|
|
memset(_resp_buf, 0, sizeof(_resp_buf));
|
|
memset(_resp_buf, 0, sizeof(_resp_buf));
|
|
_resp_pos = 0;
|
|
_resp_pos = 0;
|
|
|
|
+
|
|
|
|
+ ip_candidates.clear();
|
|
}
|
|
}
|
|
|
|
|
|
IPAddress WSLClient::get_connected_host() const {
|
|
IPAddress WSLClient::get_connected_host() const {
|