Skip to content

Commit 7129362

Browse files
authored
Add X-Accel-Buffering header to SSE responses (#1012)
Closes #1005
1 parent c490a2e commit 7129362

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

mesop/server/server.py

+16-6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import secrets
66
import time
77
import urllib.parse as urlparse
8-
from typing import Any, Generator, Sequence
8+
from typing import Any, Generator, Iterable, Sequence
99
from urllib import request as urllib_request
1010
from urllib.error import URLError
1111

@@ -268,10 +268,7 @@ def ui_stream() -> Response:
268268
ui_request = pb.UiRequest()
269269
ui_request.ParseFromString(base64.urlsafe_b64decode(data))
270270

271-
response = Response(
272-
stream_with_context(generate_data(ui_request)),
273-
content_type="text/event-stream",
274-
)
271+
response = make_sse_response(stream_with_context(generate_data(ui_request)))
275272
return response
276273

277274
@flask_app.before_request
@@ -408,7 +405,7 @@ def generate():
408405
}
409406
yield f"data: {json.dumps(sse_data)}\n\n"
410407

411-
return Response(generate(), content_type="text/event-stream")
408+
return make_sse_response(generate())
412409

413410
@flask_app.route("/__hot-reload__")
414411
def hot_reload() -> Response:
@@ -513,3 +510,16 @@ def sse_request(
513510
if decoded_line.startswith(SSE_DATA_PREFIX):
514511
event_data = json.loads(decoded_line[len(SSE_DATA_PREFIX) :])
515512
yield event_data
513+
514+
515+
def make_sse_response(
516+
response: Iterable[bytes] | bytes | Iterable[str] | str | None = None,
517+
):
518+
return Response(
519+
response,
520+
content_type="text/event-stream",
521+
# "X-Accel-Buffering" impacts SSE responses due to response buffering (i.e.
522+
# individual events may get batched together instead of being sent right away).
523+
# See https://nginx.org/en/docs/http/ngx_http_proxy_module.html
524+
headers={"X-Accel-Buffering": "no"},
525+
)

0 commit comments

Comments
 (0)