RequestServer: Do not randomly assign preconnect request IDs

Let's avoid the possibility that we randomly generate a request ID that
already exists and is in use.
This commit is contained in:
Timothy Flynn 2025-12-11 14:31:12 -05:00 committed by Tim Flynn
parent 624611aa3f
commit a5bc2e96c3
5 changed files with 9 additions and 11 deletions

View file

@ -34,7 +34,8 @@ void RequestClient::die()
void RequestClient::ensure_connection(URL::URL const& url, ::RequestServer::CacheLevel cache_level)
{
async_ensure_connection(url, cache_level);
auto request_id = m_next_request_id++;
async_ensure_connection(request_id, url, cache_level);
}
RefPtr<Request> RequestClient::start_request(ByteString const& method, URL::URL const& url, Optional<HTTP::HeaderList const&> request_headers, ReadonlyBytes request_body, Core::ProxyData const& proxy_data)
@ -43,9 +44,7 @@ RefPtr<Request> RequestClient::start_request(ByteString const& method, URL::URL
if (body_result_or_error.is_error())
return nullptr;
static u64 s_next_request_id = 0;
auto request_id = s_next_request_id++;
auto request_id = m_next_request_id++;
auto headers = request_headers.map([](auto const& headers) { return headers.headers().span(); }).value_or({});
auto body_result = body_result_or_error.release_value();

View file

@ -63,6 +63,7 @@ private:
virtual void estimated_cache_size(u64 cache_size_estimation_id, CacheSizes sizes) override;
HashMap<u64, RefPtr<Request>> m_requests;
u64 m_next_request_id { 0 };
HashMap<u64, NonnullRefPtr<WebSocket>> m_websockets;
u64 m_next_websocket_id { 0 };

View file

@ -295,12 +295,10 @@ Messages::RequestServer::SetCertificateResponse ConnectionFromClient::set_certif
TODO();
}
void ConnectionFromClient::ensure_connection(URL::URL url, ::RequestServer::CacheLevel cache_level)
void ConnectionFromClient::ensure_connection(u64 request_id, URL::URL url, ::RequestServer::CacheLevel cache_level)
{
auto connect_only_request_id = get_random<u64>();
auto request = Request::connect(connect_only_request_id, *this, m_curl_multi, m_resolver, move(url), cache_level);
m_active_requests.set(connect_only_request_id, move(request));
auto request = Request::connect(request_id, *this, m_curl_multi, m_resolver, move(url), cache_level);
m_active_requests.set(request_id, move(request));
}
void ConnectionFromClient::estimate_cache_size_accessed_since(u64 cache_size_estimation_id, UnixDateTime since)

View file

@ -40,7 +40,7 @@ private:
virtual void start_request(u64 request_id, ByteString, URL::URL, Vector<HTTP::Header>, ByteBuffer, Core::ProxyData) override;
virtual Messages::RequestServer::StopRequestResponse stop_request(u64 request_id) override;
virtual Messages::RequestServer::SetCertificateResponse set_certificate(u64 request_id, ByteString, ByteString) override;
virtual void ensure_connection(URL::URL url, ::RequestServer::CacheLevel cache_level) override;
virtual void ensure_connection(u64 request_id, URL::URL url, ::RequestServer::CacheLevel cache_level) override;
virtual void estimate_cache_size_accessed_since(u64 cache_size_estimation_id, UnixDateTime since) override;
virtual void remove_cache_entries_accessed_since(UnixDateTime since) override;

View file

@ -20,7 +20,7 @@ endpoint RequestServer
stop_request(u64 request_id) => (bool success)
set_certificate(u64 request_id, ByteString certificate, ByteString key) => (bool success)
ensure_connection(URL::URL url, ::RequestServer::CacheLevel cache_level) =|
ensure_connection(u64 request_id, URL::URL url, ::RequestServer::CacheLevel cache_level) =|
estimate_cache_size_accessed_since(u64 cache_size_estimation_id, UnixDateTime since) =|
remove_cache_entries_accessed_since(UnixDateTime since) =|