Browse Source

RequestServer: Replace disconnected sockets in the grace period too

We previously only replaced disconnected sockets on the queued-request
path, leading to attempts to send requests on a disconnected socket if
the disconnection happened in the deletion grace period.
Ali Mohammad Pur 3 years ago
parent
commit
c1184c1fde

+ 1 - 11
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 = RemoveCVReference<decltype(*connection->socket)>;
-            bool is_connected;
-            if constexpr (IsSame<SocketType, TLS::TLSv12>)
-                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();

+ 17 - 0
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<typename T>
+void recreate_socket_if_needed(T& connection, URL const& url)
+{
+    using SocketType = RemoveCVReference<decltype(*connection.socket)>;
+    bool is_connected;
+    if constexpr (IsSame<SocketType, TLS::TLSv12>)
+        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 = RemoveCVReference<decltype(*cache.begin()->value)>;
@@ -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();