@@ -622,7 +622,6 @@ def __init__(self, loop: asyncio.AbstractEventLoop) -> None:
622
622
self ._eof = False
623
623
self ._waiter : Optional [asyncio .Future [None ]] = None
624
624
self ._exception : Optional [BaseException ] = None
625
- self ._size = 0
626
625
self ._buffer : Deque [Tuple [_T , int ]] = collections .deque ()
627
626
628
627
def __len__ (self ) -> int :
@@ -644,48 +643,40 @@ def set_exception(
644
643
) -> None :
645
644
self ._eof = True
646
645
self ._exception = exc
647
-
648
- waiter = self ._waiter
649
- if waiter is not None :
646
+ if (waiter := self ._waiter ) is not None :
650
647
self ._waiter = None
651
648
set_exception (waiter , exc , exc_cause )
652
649
653
650
def feed_data (self , data : _T , size : int = 0 ) -> None :
654
- self ._size += size
655
651
self ._buffer .append ((data , size ))
656
-
657
- waiter = self ._waiter
658
- if waiter is not None :
652
+ if (waiter := self ._waiter ) is not None :
659
653
self ._waiter = None
660
654
set_result (waiter , None )
661
655
662
656
def feed_eof (self ) -> None :
663
657
self ._eof = True
664
-
665
- waiter = self ._waiter
666
- if waiter is not None :
658
+ if (waiter := self ._waiter ) is not None :
667
659
self ._waiter = None
668
660
set_result (waiter , None )
669
661
662
+ async def _wait_for_data (self ) -> None :
663
+ assert not self ._waiter
664
+ self ._waiter = self ._loop .create_future ()
665
+ try :
666
+ await self ._waiter
667
+ except (asyncio .CancelledError , asyncio .TimeoutError ):
668
+ self ._waiter = None
669
+ raise
670
+
670
671
async def read (self ) -> _T :
671
672
if not self ._buffer and not self ._eof :
672
- assert not self ._waiter
673
- self ._waiter = self ._loop .create_future ()
674
- try :
675
- await self ._waiter
676
- except (asyncio .CancelledError , asyncio .TimeoutError ):
677
- self ._waiter = None
678
- raise
679
-
673
+ await self ._wait_for_data ()
680
674
if self ._buffer :
681
- data , size = self ._buffer .popleft ()
682
- self ._size -= size
675
+ data , _ = self ._buffer .popleft ()
683
676
return data
684
- else :
685
- if self ._exception is not None :
686
- raise self ._exception
687
- else :
688
- raise EofStream
677
+ if self ._exception is not None :
678
+ raise self ._exception
679
+ raise EofStream
689
680
690
681
def __aiter__ (self ) -> AsyncStreamIterator [_T ]:
691
682
return AsyncStreamIterator (self .read )
@@ -701,19 +692,29 @@ def __init__(
701
692
self , protocol : BaseProtocol , limit : int , * , loop : asyncio .AbstractEventLoop
702
693
) -> None :
703
694
super ().__init__ (loop = loop )
704
-
695
+ self . _size = 0
705
696
self ._protocol = protocol
706
697
self ._limit = limit * 2
698
+ self ._buffer : Deque [Tuple [_T , int ]] = collections .deque ()
707
699
708
700
def feed_data (self , data : _T , size : int = 0 ) -> None :
709
- super ().feed_data (data , size )
710
-
701
+ self ._size += size
702
+ self ._buffer .append ((data , size ))
703
+ if (waiter := self ._waiter ) is not None :
704
+ self ._waiter = None
705
+ set_result (waiter , None )
711
706
if self ._size > self ._limit and not self ._protocol ._reading_paused :
712
707
self ._protocol .pause_reading ()
713
708
714
709
async def read (self ) -> _T :
715
- try :
716
- return await super ().read ()
717
- finally :
710
+ if not self ._buffer and not self ._eof :
711
+ await self ._wait_for_data ()
712
+ if self ._buffer :
713
+ data , size = self ._buffer .popleft ()
714
+ self ._size -= size
718
715
if self ._size < self ._limit and self ._protocol ._reading_paused :
719
716
self ._protocol .resume_reading ()
717
+ return data
718
+ if self ._exception is not None :
719
+ raise self ._exception
720
+ raise EofStream
0 commit comments