Skip to content

Commit ab91f88

Browse files
authored
Merge pull request #240 from python-hyper/related-events-2
[RFC] Alternative approach to "related events".
2 parents 67c07f4 + 7fe127f commit ab91f88

File tree

4 files changed

+441
-2
lines changed

4 files changed

+441
-2
lines changed

h2/connection.py

+1
Original file line numberDiff line numberDiff line change
@@ -1402,6 +1402,7 @@ def _receive_headers_frame(self, frame):
14021402

14031403
if 'PRIORITY' in frame.flags:
14041404
p_frames, p_events = self._receive_priority_frame(frame)
1405+
stream_events[0].priority_updated = p_events[0]
14051406
stream_events.extend(p_events)
14061407
assert not p_frames
14071408

h2/events.py

+67
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ class RequestReceived(object):
2323
.. versionchanged:: 2.3.0
2424
Changed the type of ``headers`` to :class:`HeaderTuple
2525
<hpack:hpack.HeaderTuple>`. This has no effect on current users.
26+
27+
.. versionchanged:: 2.4.0
28+
Added ``stream_ended`` and ``priority_updated`` properties.
2629
"""
2730
def __init__(self):
2831
#: The Stream ID for the stream this request was made on.
@@ -31,6 +34,20 @@ def __init__(self):
3134
#: The request headers.
3235
self.headers = None
3336

37+
#: If this request also ended the stream, the associated
38+
#: :class:`StreamEnded <h2.events.StreamEnded>` event will be available
39+
#: here.
40+
#:
41+
#: .. versionadded:: 2.4.0
42+
self.stream_ended = None
43+
44+
#: If this request also had associated priority information, the
45+
#: associated :class:`PriorityUpdated <h2.events.PriorityUpdated>`
46+
#: event will be available here.
47+
#:
48+
#: .. versionadded:: 2.4.0
49+
self.priority_updated = None
50+
3451
def __repr__(self):
3552
return "<RequestReceived stream_id:%s, headers:%s>" % (
3653
self.stream_id, self.headers
@@ -46,6 +63,9 @@ class ResponseReceived(object):
4663
.. versionchanged:: 2.3.0
4764
Changed the type of ``headers`` to :class:`HeaderTuple
4865
<hpack:hpack.HeaderTuple>`. This has no effect on current users.
66+
67+
.. versionchanged:: 2.4.0
68+
Added ``stream_ended`` and ``priority_updated`` properties.
4969
"""
5070
def __init__(self):
5171
#: The Stream ID for the stream this response was made on.
@@ -54,6 +74,20 @@ def __init__(self):
5474
#: The response headers.
5575
self.headers = None
5676

77+
#: If this response also ended the stream, the associated
78+
#: :class:`StreamEnded <h2.events.StreamEnded>` event will be available
79+
#: here.
80+
#:
81+
#: .. versionadded:: 2.4.0
82+
self.stream_ended = None
83+
84+
#: If this response also had associated priority information, the
85+
#: associated :class:`PriorityUpdated <h2.events.PriorityUpdated>`
86+
#: event will be available here.
87+
#:
88+
#: .. versionadded:: 2.4.0
89+
self.priority_updated = None
90+
5791
def __repr__(self):
5892
return "<ResponseReceived stream_id:%s, headers:%s>" % (
5993
self.stream_id, self.headers
@@ -72,6 +106,9 @@ class TrailersReceived(object):
72106
.. versionchanged:: 2.3.0
73107
Changed the type of ``headers`` to :class:`HeaderTuple
74108
<hpack:hpack.HeaderTuple>`. This has no effect on current users.
109+
110+
.. versionchanged:: 2.4.0
111+
Added ``stream_ended`` and ``priority_updated`` properties.
75112
"""
76113
def __init__(self):
77114
#: The Stream ID for the stream on which these trailers were received.
@@ -80,6 +117,19 @@ def __init__(self):
80117
#: The trailers themselves.
81118
self.headers = None
82119

120+
#: Trailers always end streams. This property has the associated
121+
#: :class:`StreamEnded <h2.events.StreamEnded>` in it.
122+
#:
123+
#: .. versionadded:: 2.4.0
124+
self.stream_ended = None
125+
126+
#: If the trailers also set associated priority information, the
127+
#: associated :class:`PriorityUpdated <h2.events.PriorityUpdated>`
128+
#: event will be available here.
129+
#:
130+
#: .. versionadded:: 2.4.0
131+
self.priority_updated = None
132+
83133
def __repr__(self):
84134
return "<TrailersReceived stream_id:%s, headers:%s>" % (
85135
self.stream_id, self.headers
@@ -104,6 +154,9 @@ class InformationalResponseReceived(object):
104154
.. versionchanged:: 2.3.0
105155
Changed the type of ``headers`` to :class:`HeaderTuple
106156
<hpack:hpack.HeaderTuple>`. This has no effect on current users.
157+
158+
.. versionchanged:: 2.4.0
159+
Added ``priority_updated`` property.
107160
"""
108161
def __init__(self):
109162
#: The Stream ID for the stream this informational response was made
@@ -113,6 +166,13 @@ def __init__(self):
113166
#: The headers for this informational response.
114167
self.headers = None
115168

169+
#: If this response also had associated priority information, the
170+
#: associated :class:`PriorityUpdated <h2.events.PriorityUpdated>`
171+
#: event will be available here.
172+
#:
173+
#: .. versionadded:: 2.4.0
174+
self.priority_updated = None
175+
116176
def __repr__(self):
117177
return "<InformationalResponseReceived stream_id:%s, headers:%s>" % (
118178
self.stream_id, self.headers
@@ -138,6 +198,13 @@ def __init__(self):
138198
#: than ``len(data)``.
139199
self.flow_controlled_length = None
140200

201+
#: If this data chunk also completed the stream, the associated
202+
#: :class:`StreamEnded <h2.events.StreamEnded>` event will be available
203+
#: here.
204+
#:
205+
#: .. versionadded:: 2.4.0
206+
self.stream_ended = None
207+
141208
def __repr__(self):
142209
return (
143210
"<DataReceived stream_id:%s, "

h2/stream.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -901,9 +901,11 @@ def receive_headers(self, headers, end_stream, header_encoding):
901901
events = self.state_machine.process_input(input_)
902902

903903
if end_stream:
904-
events += self.state_machine.process_input(
904+
es_events = self.state_machine.process_input(
905905
StreamInputs.RECV_END_STREAM
906906
)
907+
events[0].stream_ended = es_events[0]
908+
events += es_events
907909

908910
self._initialize_content_length(headers)
909911

@@ -926,9 +928,11 @@ def receive_data(self, data, end_stream, flow_control_len):
926928
self._track_content_length(len(data), end_stream)
927929

928930
if end_stream:
929-
events += self.state_machine.process_input(
931+
es_events = self.state_machine.process_input(
930932
StreamInputs.RECV_END_STREAM
931933
)
934+
events[0].stream_ended = es_events[0]
935+
events.extend(es_events)
932936

933937
events[0].data = data
934938
events[0].flow_controlled_length = flow_control_len

0 commit comments

Comments
 (0)