LibWeb: Support unbuffered fetch requests

Supporting unbuffered fetches is actually part of the fetch spec in its
HTTP-network-fetch algorithm. We had previously implemented this method
in a very ad-hoc manner as a simple wrapper around ResourceLoader. This
is still the case, but we now implement a good amount of these steps
according to spec, using ResourceLoader's unbuffered API. The response
data is forwarded through to the fetch response using streams.

This will eventually let us remove the use of ResourceLoader's buffered
API, as all responses should just be streamed this way. The streams spec
then supplies ways to wait for completion, thus allowing fully buffered
responses. However, we have more work to do to make the other parts of
our fetch implementation (namely, Body::fully_read) use streams before
we can do this.
This commit is contained in:
Timothy Flynn 2024-05-26 08:03:29 -04:00 committed by Andreas Kling
commit 6056428cb5
Notes: sideshowbarker 2024-07-18 05:01:22 +09:00
8 changed files with 266 additions and 8 deletions

View file

@ -159,6 +159,13 @@ public:
Auto
};
// AD-HOC: Some web features need to receive data as it arrives, rather than when the response is fully complete
// or when enough data has been buffered. Use this buffer policy to inform fetch of that requirement.
enum class BufferPolicy {
BufferResponse,
DoNotBufferResponse,
};
// Members are implementation-defined
struct InternalPriority { };
@ -325,6 +332,9 @@ public:
m_pending_responses.remove_first_matching([&](auto gc_ptr) { return gc_ptr == pending_response; });
}
[[nodiscard]] BufferPolicy buffer_policy() const { return m_buffer_policy; }
void set_buffer_policy(BufferPolicy buffer_policy) { m_buffer_policy = buffer_policy; }
private:
explicit Request(JS::NonnullGCPtr<HeaderList>);
@ -515,6 +525,8 @@ private:
// Non-standard
Vector<JS::NonnullGCPtr<Fetching::PendingResponse>> m_pending_responses;
BufferPolicy m_buffer_policy { BufferPolicy::BufferResponse };
};
StringView request_destination_to_string(Request::Destination);