Skip to content

Commit 748eef9

Browse files
committed
enforce stricter types for H2StreamStateMachine
1 parent 1feb271 commit 748eef9

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

src/h2/stream.py

+17-11
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
from .windows import WindowManager
4747

4848
if TYPE_CHECKING: # pragma: no cover
49-
from collections.abc import Generator, Iterable
49+
from collections.abc import Callable, Generator, Iterable
5050

5151
from hpack.hpack import Encoder
5252
from hpack.struct import Header, HeaderWeaklyTyped
@@ -131,7 +131,7 @@ def __init__(self, stream_id: int) -> None:
131131
# How the stream was closed. One of StreamClosedBy.
132132
self.stream_closed_by: StreamClosedBy | None = None
133133

134-
def process_input(self, input_: StreamInputs) -> Any:
134+
def process_input(self, input_: StreamInputs) -> list[Event]:
135135
"""
136136
Process a specific input in the state machine.
137137
"""
@@ -315,21 +315,23 @@ def recv_push_promise(self, previous_state: StreamState) -> list[Event]:
315315
event.parent_stream_id = self.stream_id
316316
return [event]
317317

318-
def send_end_stream(self, previous_state: StreamState) -> None:
318+
def send_end_stream(self, previous_state: StreamState) -> list[Event]:
319319
"""
320320
Called when an attempt is made to send END_STREAM in the
321321
HALF_CLOSED_REMOTE state.
322322
"""
323323
self.stream_closed_by = StreamClosedBy.SEND_END_STREAM
324+
return []
324325

325-
def send_reset_stream(self, previous_state: StreamState) -> None:
326+
def send_reset_stream(self, previous_state: StreamState) -> list[Event]:
326327
"""
327328
Called when an attempt is made to send RST_STREAM in a non-closed
328329
stream state.
329330
"""
330331
self.stream_closed_by = StreamClosedBy.SEND_RST_STREAM
332+
return []
331333

332-
def reset_stream_on_error(self, previous_state: StreamState) -> None:
334+
def reset_stream_on_error(self, previous_state: StreamState) -> list[Event]:
333335
"""
334336
Called when we need to forcefully emit another RST_STREAM frame on
335337
behalf of the state machine.
@@ -350,7 +352,7 @@ def reset_stream_on_error(self, previous_state: StreamState) -> None:
350352
error._events = [event]
351353
raise error
352354

353-
def recv_on_closed_stream(self, previous_state: StreamState) -> None:
355+
def recv_on_closed_stream(self, previous_state: StreamState) -> list[Event]:
354356
"""
355357
Called when an unexpected frame is received on an already-closed
356358
stream.
@@ -362,7 +364,7 @@ def recv_on_closed_stream(self, previous_state: StreamState) -> None:
362364
"""
363365
raise StreamClosedError(self.stream_id)
364366

365-
def send_on_closed_stream(self, previous_state: StreamState) -> None:
367+
def send_on_closed_stream(self, previous_state: StreamState) -> list[Event]:
366368
"""
367369
Called when an attempt is made to send data on an already-closed
368370
stream.
@@ -374,7 +376,7 @@ def send_on_closed_stream(self, previous_state: StreamState) -> None:
374376
"""
375377
raise StreamClosedError(self.stream_id)
376378

377-
def recv_push_on_closed_stream(self, previous_state: StreamState) -> None:
379+
def recv_push_on_closed_stream(self, previous_state: StreamState) -> list[Event]:
378380
"""
379381
Called when a PUSH_PROMISE frame is received on a full stop
380382
stream.
@@ -393,7 +395,7 @@ def recv_push_on_closed_stream(self, previous_state: StreamState) -> None:
393395
msg = "Attempted to push on closed stream."
394396
raise ProtocolError(msg)
395397

396-
def send_push_on_closed_stream(self, previous_state: StreamState) -> None:
398+
def send_push_on_closed_stream(self, previous_state: StreamState) -> list[Event]:
397399
"""
398400
Called when an attempt is made to push on an already-closed stream.
399401
@@ -473,7 +475,7 @@ def recv_alt_svc(self, previous_state: StreamState) -> list[Event]:
473475
# the event and let it get populated.
474476
return [AlternativeServiceAvailable()]
475477

476-
def send_alt_svc(self, previous_state: StreamState) -> None:
478+
def send_alt_svc(self, previous_state: StreamState) -> list[Event]:
477479
"""
478480
Called when sending an ALTSVC frame on this stream.
479481
@@ -489,6 +491,7 @@ def send_alt_svc(self, previous_state: StreamState) -> None:
489491
if self.headers_sent:
490492
msg = "Cannot send ALTSVC after sending response headers."
491493
raise ProtocolError(msg)
494+
return []
492495

493496

494497

@@ -561,7 +564,10 @@ def send_alt_svc(self, previous_state: StreamState) -> None:
561564
# (state, input) to tuples of (side_effect_function, end_state). This
562565
# map contains all allowed transitions: anything not in this map is
563566
# invalid and immediately causes a transition to ``closed``.
564-
_transitions = {
567+
_transitions: dict[
568+
tuple[StreamState, StreamInputs],
569+
tuple[Callable[[H2StreamStateMachine, StreamState], list[Event]] | None, StreamState],
570+
] = {
565571
# State: idle
566572
(StreamState.IDLE, StreamInputs.SEND_HEADERS):
567573
(H2StreamStateMachine.request_sent, StreamState.OPEN),

0 commit comments

Comments
 (0)