mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-20 19:45:12 +00:00
LibCore: Make it possible to cancel pending CNetworkJobs
Subclasses of CNetworkJob handle this by overriding shutdown(). This patch implements it for CHttpJob by simply tearing down the underlying socket. We also automatically call shutdown() after the job finishes, regardless of success or failure. :^)
This commit is contained in:
parent
ff6ce422dd
commit
bdf23a3d23
Notes:
sideshowbarker
2024-07-19 12:01:41 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/bdf23a3d230
7 changed files with 31 additions and 2 deletions
|
@ -21,6 +21,8 @@ void BoardListModel::update()
|
|||
CHttpRequest request;
|
||||
request.set_url("http://a.4cdn.org/boards.json");
|
||||
|
||||
if (m_pending_job)
|
||||
m_pending_job->cancel();
|
||||
m_pending_job = request.schedule();
|
||||
|
||||
m_pending_job->on_finish = [this](bool success) {
|
||||
|
|
|
@ -29,6 +29,8 @@ void ThreadCatalogModel::update()
|
|||
CHttpRequest request;
|
||||
request.set_url(String::format("http://a.4cdn.org/%s/catalog.json", m_board.characters()));
|
||||
|
||||
if (m_pending_job)
|
||||
m_pending_job->cancel();
|
||||
m_pending_job = request.schedule();
|
||||
|
||||
if (on_load_started)
|
||||
|
|
|
@ -26,6 +26,8 @@ void CHttpJob::on_socket_connected()
|
|||
return deferred_invoke([this](auto&) { did_fail(CNetworkJob::Error::TransmissionFailed); });
|
||||
|
||||
m_socket->on_ready_to_read = [&] {
|
||||
if (is_cancelled())
|
||||
return;
|
||||
if (m_state == State::InStatus) {
|
||||
if (!m_socket->can_read_line())
|
||||
return;
|
||||
|
@ -125,3 +127,12 @@ void CHttpJob::start()
|
|||
if (!success)
|
||||
return did_fail(CNetworkJob::Error::ConnectionFailed);
|
||||
}
|
||||
|
||||
void CHttpJob::shutdown()
|
||||
{
|
||||
if (!m_socket)
|
||||
return;
|
||||
m_socket->on_ready_to_read = nullptr;
|
||||
m_socket->on_connected = nullptr;
|
||||
m_socket = nullptr;
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ public:
|
|||
virtual ~CHttpJob() override;
|
||||
|
||||
virtual void start() override;
|
||||
virtual void shutdown() override;
|
||||
|
||||
private:
|
||||
void on_socket_connected();
|
||||
|
|
|
@ -16,7 +16,7 @@ void CNetworkJob::did_finish(NonnullRefPtr<CNetworkResponse>&& response)
|
|||
dbg() << *this << " job did_finish!";
|
||||
ASSERT(on_finish);
|
||||
on_finish(true);
|
||||
delete_later();
|
||||
shutdown();
|
||||
}
|
||||
|
||||
void CNetworkJob::did_fail(Error error)
|
||||
|
@ -25,7 +25,7 @@ void CNetworkJob::did_fail(Error error)
|
|||
dbgprintf("%s{%p} job did_fail! error: %u (%s)\n", class_name(), this, (unsigned)error, to_string(error));
|
||||
ASSERT(on_finish);
|
||||
on_finish(false);
|
||||
delete_later();
|
||||
shutdown();
|
||||
}
|
||||
|
||||
const char* to_string(CNetworkJob::Error error)
|
||||
|
@ -37,6 +37,8 @@ const char* to_string(CNetworkJob::Error error)
|
|||
return "ConnectionFailed";
|
||||
case CNetworkJob::Error::TransmissionFailed:
|
||||
return "TransmissionFailed";
|
||||
case CNetworkJob::Error::Cancelled:
|
||||
return "Cancelled";
|
||||
default:
|
||||
return "(Unknown error)";
|
||||
}
|
||||
|
|
|
@ -13,17 +13,26 @@ public:
|
|||
ConnectionFailed,
|
||||
TransmissionFailed,
|
||||
ProtocolFailed,
|
||||
Cancelled,
|
||||
};
|
||||
virtual ~CNetworkJob() override;
|
||||
|
||||
Function<void(bool success)> on_finish;
|
||||
|
||||
bool is_cancelled() const { return m_error == Error::Cancelled; }
|
||||
bool has_error() const { return m_error != Error::None; }
|
||||
Error error() const { return m_error; }
|
||||
CNetworkResponse* response() { return m_response.ptr(); }
|
||||
const CNetworkResponse* response() const { return m_response.ptr(); }
|
||||
|
||||
virtual void start() = 0;
|
||||
virtual void shutdown() = 0;
|
||||
|
||||
void cancel()
|
||||
{
|
||||
shutdown();
|
||||
m_error = Error::Cancelled;
|
||||
}
|
||||
|
||||
protected:
|
||||
CNetworkJob();
|
||||
|
|
|
@ -76,6 +76,8 @@ public:
|
|||
T* ptr() const { return m_ptr; }
|
||||
T* leak_ptr() { return exchange(m_ptr, nullptr); }
|
||||
|
||||
operator bool() const { return !!m_ptr; }
|
||||
|
||||
private:
|
||||
T* m_ptr { nullptr };
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue