package Ġcom . fire fly source . net . http . common . v 2 . stream Ċ Ċ import Ġcom . fire fly source . common . sys . System Logger Ċ import Ġcom . fire fly source . net . http . common . Http Config . DEFAULT _ WINDOW _ SIZE Ċ import Ġcom . fire fly source . net . http . common . v 2 . frame . Window Update Frame Ċ Ċ abstract Ġclass ĠAbstract Flow Control Strategy ( ĊĠĠĠ Ġprotected Ġvar Ġinitial Stream Recv Window : ĠInt Ġ= ĠDEFAULT _ WINDOW _ SIZE Ċ ) Ġ: ĠFlow Control Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠSystem Logger . create ( Abstract Flow Control Strategy :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġinitial Stream Send Window : ĠInt Ġ= ĠDEFAULT _ WINDOW _ SIZE ĊĊĠĠĠ Ġoverride Ġfun Ġon Stream Created ( stream : ĠStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhttp 2 Stream Ġ= Ġstream Ġas ĠAsync Http 2 Stream ĊĠĠĠĠĠĠĠ Ġhttp 2 Stream . update Send Window ( initial Stream Send Window ) ĊĠĠĠĠĠĠĠ Ġhttp 2 Stream . update Recv Window ( initial Stream Recv Window ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stream Destroyed ( stream : ĠStream ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Initial Stream Window ( ĊĠĠĠĠĠĠĠ Ġhttp 2 Connection : ĠHttp 2 Connection , ĊĠĠĠĠĠĠĠ Ġinitial Stream Window : ĠInt , ĊĠĠĠĠĠĠĠ Ġlocal : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprevious Initial Stream Window : ĠInt ĊĠĠĠĠĠĠĠ Ġif Ġ( local ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Initial Stream Window Ġ= Ġinitial Stream Recv Window ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Stream Recv Window Ġ= Ġinitial Stream Window ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Initial Stream Window Ġ= Ġinitial Stream Send Window ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Stream Send Window Ġ= Ġinitial Stream Window ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġinitial Stream Window Ġ- Ġprevious Initial Stream Window ĊĠĠĠĠĠĠĠ Ġif Ġ( delta Ġ== Ġ 0 ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġhttp 2 Connection . streams . forEach Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhttp 2 Stream Ġ= Ġstream Ġas ĠAsync Http 2 Stream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhttp 2 Stream . update Recv Window ( delta ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Updated Ġinitial Ġstream Ġrecv Ġwindow Ġ$ previous Initial Stream Window Ġ-> Ġ$ initial Stream Window Ġfor Ġ$ http 2 Stream " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( http 2 Connection Ġas ĠAsync Http 2 Connection ). on Window Update ( stream , ĠWindow Update Frame ( stream . id , Ġdelta )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Window Update ( http 2 Connection : ĠHttp 2 Connection , Ġstream : ĠStream ?, Ġframe : ĠWindow Update Frame ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( frame . is Stream Window Update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġstream Ġmay Ġhave Ġbeen Ġremoved Ġconcurrent ly . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream Ġ!= Ġnull Ġ&& Ġstream Ġis ĠAsync Http 2 Stream ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . update Send Window ( frame . window Delta ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( http 2 Connection Ġas ĠAsync Http 2 Connection ). update Send Window ( frame . window Delta ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Data Received ( http 2 Connection : ĠHttp 2 Connection , Ġstream : ĠStream ?, Ġlength : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġhttp 2 Connection Ġas ĠAsync Http 2 Connection ĊĠĠĠĠĠĠĠ Ġvar Ġold Size : ĠInt Ġ= Ġconnection . update Recv Window (- length ) ĊĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Data Ġreceived , Ġ$ length Ġbytes , Ġupdated Ġsession Ġrecv Ġwindow Ġ$ old Size Ġ-> Ġ${ old Size Ġ- Ġlength } Ġfor Ġ$ connection " Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( stream Ġ!= Ġnull Ġ&& Ġstream Ġis ĠAsync Http 2 Stream ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Size Ġ= Ġstream . update Recv Window (- length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Data Ġreceived , Ġ$ length Ġbytes , Ġupdated Ġstream Ġrecv Ġwindow Ġ$ old Size Ġ-> Ġ${ old Size Ġ- Ġlength } Ġfor Ġ$ stream " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Data Sending ( stream : ĠStream , Ġlength : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( length Ġ== Ġ 0 ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġhttp 2 Stream Ġ= Ġstream Ġas ĠAsync Http 2 Stream ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġhttp 2 Stream . http 2 Connection Ġas ĠAsync Http 2 Connection ĊĠĠĠĠĠĠĠ Ġval Ġold Session Window Ġ= Ġconnection . update Send Window (- length ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Session Window Ġ= Ġold Session Window Ġ- Ġlength ĊĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Sending , Ġsession Ġsend Ġwindow Ġ$ old Session Window Ġ-> Ġ$ new Session Window Ġfor Ġ$ connection " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġold Stream Window Ġ= Ġhttp 2 Stream . update Send Window (- length ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Stream Window Ġ= Ġold Stream Window Ġ- Ġlength ĊĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Sending , Ġstream Ġsend Ġwindow Ġ$ old Stream Window Ġ-> Ġ$ new Stream Window Ġfor Ġ$ stream " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Data Sent ( stream : ĠStream , Ġlength : ĠInt ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwindow Update ( http 2 Connection : ĠHttp 2 Connection , Ġstream : ĠStream ?, Ġframe : ĠWindow Update Frame ) Ġ{ ĊĠĠĠ Ġ} Ċ }