Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions docs/_newsfragments/2580.newandimproved.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
A new request property, :attr:`req.last_event_id <falcon.Request.last_event_id>`,
was added to provide convenient access to the ``Last-Event-ID`` header.
This header is commonly sent by clients when reconnecting to a
:attr:`Server-Sent Events <falcon.asgi.Response.sse>` stream.
1 change: 1 addition & 0 deletions falcon/asgi/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ def __init__(
if_range: str | None = asgi_helpers._header_property('If-Range')
referer: str | None = asgi_helpers._header_property('Referer')
user_agent: str | None = asgi_helpers._header_property('User-Agent')
last_event_id: str | None = asgi_helpers._header_property('Last-Event-ID')

@property
def accept(self) -> str:
Expand Down
2 changes: 2 additions & 0 deletions falcon/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,8 @@ def __repr__(self) -> str:
"""Value of the If-Range header, or ``None`` if the header is missing."""
referer: str | None = helpers._header_property('HTTP_REFERER')
"""Value of the Referer header, or ``None`` if the header is missing."""
last_event_id: str | None = helpers._header_property('HTTP_LAST_EVENT_ID')
"""Value of the Last-Event-ID header, or ``None`` if the header is missing."""

@property
def forwarded(self) -> list[Forwarded] | None:
Expand Down
11 changes: 11 additions & 0 deletions tests/test_request_attrs.py
Original file line number Diff line number Diff line change
Expand Up @@ -1058,6 +1058,17 @@ def test_get_param_as_list_multiple_values_vs_delimiter(self, asgi, delimiter):
result = req.get_param_as_list('phrase', delimiter=delimiter)
assert result == ['quick brown fox', 'lazy dog']

@pytest.mark.parametrize('value', ['12345', '1768042793-1337'])
def test_last_event_id(self, asgi, value):
req = create_req(asgi, headers={'Last-Event-ID': value})
assert req.last_event_id == value

@pytest.mark.parametrize('value', [None, '', ' '])
def test_last_event_id_missing(self, asgi, value):
headers = {'Last-Event-ID': value} if value is not None else {}
req = create_req(asgi, headers=headers)
assert req.last_event_id is None

# -------------------------------------------------------------------------
# Helpers
# -------------------------------------------------------------------------
Expand Down