// Ġk tl int - disable Ġfilename Ċ /* Ċ Ġ* ĠCopyright Ġ 2 0 1 4 - 2 0 2 2 ĠJetBrains Ġs . r . o Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġio . ktor . server . plugins . doub l ere ceive Ċ Ċ import Ġio . ktor . utils . io .* Ċ import Ġio . ktor . utils . io . core .* Ċ import Ġio . ktor . utils . io . pool .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlin . coroutines .* Ċ Ċ internal Ġclass ĠMemory Cache ( ĊĠĠĠ Ġval Ġbody : ĠByte Read Channel , ĊĠĠĠ Ġcoroutine Context : ĠCor outine Context Ġ= ĠEmpty Coroutine Context Ċ ) Ġ: ĠDouble Receive Cache Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġfull Body : ĠByteArray ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcause : ĠThrowable ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Opt In ( Del icate Cor outines Api :: class ) ĊĠĠĠ Ġprivate Ġval Ġreader : ĠByte Read Channel Ġ= ĠGlobal Scope . writer ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray Pool . borrow () ĊĠĠĠĠĠĠĠ Ġval Ġpacket Ġ= ĠByte Packet Builder () ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! body . is Closed For Read ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġbody . read Available ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ- 1 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpacket . write Fully ( buffer , Ġ 0 , Ġsize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . write Fully ( buffer , Ġ 0 , Ġsize ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( body . closed Cause Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcause Ġ= Ġbody . closed Cause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . close ( body . closed Cause ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfull Body Ġ= Ġpacket . build (). read Bytes () ĊĠĠĠ Ġ}. channel ĊĊĠĠĠ Ġoverride Ġfun Ġread (): ĠByte Read Channel Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Cause Ġ= Ġcause ĊĠĠĠĠĠĠĠ Ġif Ġ( current Cause Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠByte Channel (). apply Ġ{ Ġclose ( current Cause ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfull Body ?. let Ġ{ ĠByte Read Channel ( it ) Ġ} Ġ?: Ġreader ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠ Ġ} Ċ } Ċ