summaryrefslogtreecommitdiff
path: root/src/network/core/tcp_http.h
diff options
context:
space:
mode:
authorPatric Stout <truebrain@openttd.org>2021-05-06 23:13:35 +0200
committerGitHub <noreply@github.com>2021-05-06 23:13:35 +0200
commitf7e390bdc084a20462fe833373087fd9106c5972 (patch)
tree26122beb7a783b37132bbe60ba13966ac87843b1 /src/network/core/tcp_http.h
parentf1dfa661a1898cde06a38ab4cb230c95912b245b (diff)
downloadopenttd-f7e390bdc084a20462fe833373087fd9106c5972.tar.xz
Feature: use Happy Eyeballs to make network connections (TCP-only) (#9199)
Hostnames like "content.openttd.org" resolve into multiple IPv4 and IPv6. It is possible that either of the IPs is not working, either due to a poorly configured OS (having IPv6 but no valid route), broken network paths, or a service that is temporary unavailable. Instead of trying the IPs one by one, waiting for a 3s timeout between each, be a bit more like browsers, and stack attempts on top of each other with slight delays. This is called Happy Eyebells. Initially, try the first IPv6 address. If within 250ms there is no connection yet, try the first IPv4 address. 250ms later, try the second IPv6 address, etc, till all addresses are tried. If any connection is created, abort all the other (pending) connections and use the one that is created. If all fail 3s after the last connect(), trigger a timeout for all.
Diffstat (limited to 'src/network/core/tcp_http.h')
-rw-r--r--src/network/core/tcp_http.h10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/network/core/tcp_http.h b/src/network/core/tcp_http.h
index cc9a3adac..d7be0c327 100644
--- a/src/network/core/tcp_http.h
+++ b/src/network/core/tcp_http.h
@@ -73,6 +73,7 @@ public:
/** Connect with a HTTP server and do ONE query. */
class NetworkHTTPContentConnecter : TCPConnecter {
+ std::string hostname; ///< Hostname we are connecting to.
HTTPCallback *callback; ///< Callback to tell that we received some data (or won't).
const char *url; ///< The URL we want to get at the server.
const char *data; ///< The data to send
@@ -81,14 +82,15 @@ class NetworkHTTPContentConnecter : TCPConnecter {
public:
/**
* Start the connecting.
- * @param connection_string The address to connect to.
+ * @param hostname The hostname to connect to.
* @param callback The callback for HTTP retrieval.
* @param url The url at the server.
* @param data The data to send.
* @param depth The depth (redirect recursion) of the queries.
*/
- NetworkHTTPContentConnecter(const std::string &connection_string, HTTPCallback *callback, const char *url, const char *data = nullptr, int depth = 0) :
- TCPConnecter(connection_string, 80),
+ NetworkHTTPContentConnecter(const std::string &hostname, HTTPCallback *callback, const char *url, const char *data = nullptr, int depth = 0) :
+ TCPConnecter(hostname, 80),
+ hostname(hostname),
callback(callback),
url(stredup(url)),
data(data),
@@ -110,7 +112,7 @@ public:
void OnConnect(SOCKET s) override
{
- new NetworkHTTPSocketHandler(s, this->callback, this->address.GetHostname(), this->url, this->data, this->depth);
+ new NetworkHTTPSocketHandler(s, this->callback, this->hostname.c_str(), this->url, this->data, this->depth);
/* We've relinquished control of data now. */
this->data = nullptr;
}