@@ -276,6 +276,7 @@ class WebTransportSession:
276276 path : str
277277 selected_protocol : str | None = None
278278 flow : WebTransportFlowController = field (default_factory = WebTransportFlowController )
279+ flow_control_enabled : bool = True
279280 state : SessionState = SessionState .OPEN
280281 streams : dict [int , StreamDirection ] = field (default_factory = dict )
281282 datagrams : list [bytes ] = field (default_factory = list )
@@ -341,22 +342,25 @@ def accept(self, request: ConnectRequest) -> ConnectDecision:
341342 path = _required_header (request .headers , ":path" ),
342343 selected_protocol = request .selected_protocol ,
343344 flow = _flow_from_request (request ),
345+ flow_control_enabled = _flow_control_enabled (request ),
344346 )
345347 self .sessions [session .session_id ] = session
346348 return decision
347349
348350 def open_stream (self , session_id : str , stream_id : int , direction : StreamDirection ) -> None :
349351 session = self ._session (session_id )
350352 session .ensure_accepting_traffic ()
351- session .flow .open_stream (direction )
353+ if session .flow_control_enabled :
354+ session .flow .open_stream (direction )
352355 session .streams [stream_id ] = direction
353356
354357 def receive_stream_data (self , session_id : str , stream_id : int , data : bytes , direction : StreamDirection ) -> None :
355358 session = self ._session (session_id )
356359 session .ensure_accepting_traffic ()
357360 if stream_id not in session .streams :
358361 self .open_stream (session_id , stream_id , direction )
359- session .flow .allow_stream_data (stream_id , direction , len (data ))
362+ if session .flow_control_enabled :
363+ session .flow .allow_stream_data (stream_id , direction , len (data ))
360364
361365 def receive_datagram (self , session_id : str , payload : bytes ) -> None :
362366 session = self ._session (session_id )
@@ -402,6 +406,8 @@ def apply_capsule(self, session_id: str, capsule: Capsule) -> dict[str, Any]:
402406 CAPSULE_WT_STREAMS_BLOCKED_BIDI ,
403407 CAPSULE_WT_STREAMS_BLOCKED_UNI ,
404408 }:
409+ if not session .flow_control_enabled :
410+ return {"event" : "webtransport.flow-control-ignored" , "capsule_type" : capsule .capsule_type }
405411 session .flow .apply_flow_control_capsule (capsule )
406412 return {"event" : "webtransport.flow-control" , "capsule_type" : capsule .capsule_type }
407413 if capsule .capsule_type in {CAPSULE_WT_STREAM , CAPSULE_WT_STREAM_FIN }:
@@ -734,6 +740,12 @@ def _flow_from_request(request: ConnectRequest) -> WebTransportFlowController:
734740 )
735741
736742
743+ def _flow_control_enabled (request : ConnectRequest ) -> bool :
744+ if request .carrier is Carrier .H3 :
745+ return int (request .negotiated_settings .get (SETTING_WT_MAX_SESSIONS , 0 )) > 1
746+ return True
747+
748+
737749def _header (headers : Mapping [str , str ], name : str ) -> str | None :
738750 target = name .lower ()
739751 for key , value in headers .items ():
0 commit comments