Add EventStreamHttpResponse for Server-Sent Events.
Review Request #13280 — Created Sept. 20, 2023 and submitted — Latest diff uploaded
This introduces
djblets.http.responses.EventStreamHttpResponse
, which
can stream events and data to a client by way of the Server-Sent Events
(SSE) standard.This works by taking a generator or callable that yields dictionaries of
message data following the spec, allowing for app-specified IDs,
text-based payload data, event names, and retry intervals (for
disconnects) to be streamed to the client.The response class takes charge of serializing this information for the
client, and can also support resuming of streamed events by intercepting
the SSELast-Event-ID
header and passing it to an event stream
callable.It's important for consumers of this class to be mindful of how it's
used. Browsers have a limit of 6 concurrent HTTP/1.1 requests to the
same domain across all tabs, and a long-running SSE stream will take one
of those slots, potentially starving out other requests. This is far
less of a problem with HTTP/2.
Unit tests pass.
Tested with a makeshift
EventSource
implementation in JavaScript,
testing that events and all fields were successfully coming in and
processing as per spec.Tested with
curl
and with GZip middleware turned on and off.