RequestServer: Correctly start preconnected TLS sockets

We need to set the root certificates, and tell the connection cache that
the preconnect job finished (otherwise it would spin forever, waiting
for us to tell it that).
This commit is contained in:
Ali Mohammad Pur 2021-09-29 01:55:08 +03:30 committed by Andreas Kling
parent 63d971d33b
commit 2020ced9f1
Notes: sideshowbarker 2024-07-18 03:21:42 +09:00

View file

@ -127,13 +127,47 @@ void ClientConnection::ensure_connection(URL const& url, ::RequestServer::CacheL
struct {
URL const& m_url;
void start(NonnullRefPtr<Core::Socket> socket) { socket->connect(m_url.host(), m_url.port_or_default()); }
void start(NonnullRefPtr<Core::Socket> socket)
{
auto is_tls = is<TLS::TLSv12>(*socket);
auto* tls_instance = is_tls ? static_cast<TLS::TLSv12*>(socket.ptr()) : nullptr;
auto is_connected = false;
if (is_tls && tls_instance->is_established())
is_connected = true;
if (!is_tls && socket->is_connected())
is_connected = true;
if (is_connected)
return ConnectionCache::request_did_finish(m_url, socket);
bool did_connect;
if (is_tls) {
tls_instance->set_root_certificates(DefaultRootCACertificates::the().certificates());
tls_instance->on_tls_connected = [socket, url = m_url, tls_instance] {
tls_instance->set_on_tls_ready_to_write([socket, url](auto&) {
ConnectionCache::request_did_finish(url, socket);
});
};
tls_instance->on_tls_error = [socket, url = m_url](auto) {
ConnectionCache::request_did_finish(url, socket);
};
did_connect = tls_instance->connect(m_url.host(), m_url.port_or_default());
} else {
socket->on_connected = [socket, url = m_url]() mutable {
ConnectionCache::request_did_finish(url, socket);
};
did_connect = socket->connect(m_url.host(), m_url.port_or_default());
}
if (!did_connect)
ConnectionCache::request_did_finish(m_url, socket);
}
} job { url };
dbgln("EnsureConnection: Pre-connect to {}", url);
auto do_preconnect = [&](auto& cache) {
auto& connection = ConnectionCache::get_or_create_connection(cache, url, job);
connection.removal_timer->start();
ConnectionCache::get_or_create_connection(cache, url, job);
};
if (url.scheme() == "http"sv)