1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-24 00:35:08 +00:00

ProtocolServer: Attach downloads and their lifecycles to clients

Previously a download lived independently of the client connection it came
from. This was the source of several undesirable behaviours, including the
potential for clients to influence downloads they didn't start, and
downloads living longer than their associated client connections. Now we
attach downloads to client connections, which means they're cleaned up
automatically when the client goes away, and there's significantly less
risk of clients interfering with each other.
This commit is contained in:
Conrad Pankoff 2020-05-16 05:36:40 +10:00 committed by Andreas Kling
parent 184ee8ac77
commit f2621f37a4
17 changed files with 48 additions and 57 deletions

View file

@ -31,22 +31,10 @@
// FIXME: What about rollover?
static i32 s_next_id = 1;
static HashMap<i32, RefPtr<Download>>& all_downloads()
{
static HashMap<i32, RefPtr<Download>> map;
return map;
}
Download* Download::find_by_id(i32 id)
{
return const_cast<Download*>(all_downloads().get(id).value_or(nullptr));
}
Download::Download(PSClientConnection& client)
: m_id(s_next_id++)
, m_client(client.make_weak_ptr())
: m_client(client)
, m_id(s_next_id++)
{
all_downloads().set(m_id, this);
}
Download::~Download()
@ -55,7 +43,7 @@ Download::~Download()
void Download::stop()
{
all_downloads().remove(m_id);
m_client.did_finish_download({}, *this, false);
}
void Download::set_payload(const ByteBuffer& payload)
@ -71,22 +59,12 @@ void Download::set_response_headers(const HashMap<String, String, CaseInsensitiv
void Download::did_finish(bool success)
{
if (!m_client) {
dbg() << "Download::did_finish() after the client already disconnected.";
return;
}
m_client->did_finish_download({}, *this, success);
all_downloads().remove(m_id);
m_client.did_finish_download({}, *this, success);
}
void Download::did_progress(Optional<u32> total_size, u32 downloaded_size)
{
if (!m_client) {
// FIXME: We should also abort the download in this situation, I guess!
dbg() << "Download::did_progress() after the client already disconnected.";
return;
}
m_total_size = total_size;
m_downloaded_size = downloaded_size;
m_client->did_progress_download({}, *this);
m_client.did_progress_download({}, *this);
}