mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-05-02 04:27:12 +02:00
When a streaming HTTP response completes before set_body() is called
on the FetchedDataReceiver, the sniff bytes would never be marked as
complete, causing navigation to hang intermittently.
The sequence that triggers this:
1. handle_network_bytes(data, Ongoing) runs, but m_body is null,
so bytes only go into the FetchedDataReceiver's own m_buffer.
2. handle_network_bytes({}, Complete) runs, but m_body is still
null, so the m_body->set_sniff_bytes_complete() call is skipped.
3. set_body(body) is called, which flushes m_buffer into the body
via append_sniff_bytes(), but never marks them as complete.
4. populate_session_history_entry_document() calls
sniff_bytes_if_available() on the body. Since the source is
Empty (streaming) and m_sniff_bytes_complete is false, it
returns no value.
5. The async path registers a callback via wait_for_sniff_bytes(),
but since the stream already completed, no more data arrives,
and the callback never fires. Navigation hangs.
Fix this by checking the lifecycle state in set_body(). If we have
already moved past the Receiving state, the Complete was already
processed and we need to mark sniff bytes as complete now.