diff --git a/Userland/Services/RequestServer/ConnectionCache.cpp b/Userland/Services/RequestServer/ConnectionCache.cpp index 85ae1c66a28..896e9d2f0d1 100644 --- a/Userland/Services/RequestServer/ConnectionCache.cpp +++ b/Userland/Services/RequestServer/ConnectionCache.cpp @@ -50,17 +50,7 @@ void request_did_finish(URL const& url, Core::Socket const* socket) }; connection->removal_timer->start(); } else { - using SocketType = RemoveCVReferencesocket)>; - bool is_connected; - if constexpr (IsSame) - is_connected = connection->socket->is_established(); - else - is_connected = connection->socket->is_connected(); - if (!is_connected) { - // Create another socket for the connection. - connection->socket = SocketType::construct(nullptr); - dbgln_if(REQUESTSERVER_DEBUG, "Creating a new socket for {} -> {}", url, connection->socket); - } + recreate_socket_if_needed(*connection, url); dbgln_if(REQUESTSERVER_DEBUG, "Running next job in queue for connection {} @{}", &connection, connection->socket); auto request = connection->request_queue.take_first(); connection->timer.start(); diff --git a/Userland/Services/RequestServer/ConnectionCache.h b/Userland/Services/RequestServer/ConnectionCache.h index 1f9d87c70e2..5a91714ffb7 100644 --- a/Userland/Services/RequestServer/ConnectionCache.h +++ b/Userland/Services/RequestServer/ConnectionCache.h @@ -68,6 +68,22 @@ void dump_jobs(); constexpr static inline size_t MaxConcurrentConnectionsPerURL = 2; constexpr static inline size_t ConnectionKeepAliveTimeMilliseconds = 10'000; +template +void recreate_socket_if_needed(T& connection, URL const& url) +{ + using SocketType = RemoveCVReference; + bool is_connected; + if constexpr (IsSame) + is_connected = connection.socket->is_established(); + else + is_connected = connection.socket->is_connected(); + if (!is_connected) { + // Create another socket for the connection. + connection.socket = SocketType::construct(nullptr); + dbgln_if(REQUESTSERVER_DEBUG, "Creating a new socket for {} -> {}", url, connection.socket); + } +} + decltype(auto) get_or_create_connection(auto& cache, URL const& url, auto& job) { using CacheEntryType = RemoveCVReferencevalue)>; @@ -105,6 +121,7 @@ decltype(auto) get_or_create_connection(auto& cache, URL const& url, auto& job) } auto& connection = sockets_for_url[index]; if (!connection.has_started) { + recreate_socket_if_needed(connection, url); dbgln_if(REQUESTSERVER_DEBUG, "Immediately start request for url {} in {} - {}", url, &connection, connection.socket); connection.has_started = true; connection.removal_timer->stop();