package Ġde . rob ol ab . client . net Ċ Ċ import Ġde . rob ol ab . client . app . model . file . handle Auth Prompt Ċ import Ġde . rob ol ab . client . net . requests . auth .* Ċ import Ġde . rob ol ab . common . net . HttpMethod Ċ import Ġde . rob ol ab . common . net . HttpStatusCode Ċ import Ġde . rob ol ab . common . net . headers . Authorization Header Ċ import Ġde . rob ol ab . common . utils . Logger Ċ import Ġde . west erm ann . k observe . base . Observable Value Ċ import Ġde . west erm ann . k observe . property . property Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġkotlin . random . Random Ċ Ċ class ĠRE STR ob ol ab Server ( ĊĠĠĠ Ġoverride Ġval Ġhost URL : ĠString , ĊĠĠĠ Ġoverride Ġval Ġhost Port : ĠInt , ĊĠĠĠ Ġoverride Ġval Ġprotocol : ĠString , ĊĠĠĠ Ġval Ġoid c Server : ĠO IDC Server , ĊĠĠĠ Ġval Ġclient ID : ĠString , ĊĠĠĠ Ġprivate Ġval Ġclient Secret : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġenable Waiting Request List : ĠBoolean Ġ= Ġfalse , Ċ ) Ġ: ĠIR ob ol ab Server Ġ{ ĊĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġhost URL : ĠString , ĊĠĠĠĠĠĠĠ Ġhost Port : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġsecure : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġoid c Server : ĠO IDC Server , ĊĠĠĠĠĠĠĠ Ġclient ID : ĠString , ĊĠĠĠĠĠĠĠ Ġclient Secret : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġhost URL , ĊĠĠĠĠĠĠĠ Ġhost Port Ġ?: Ġif Ġ( secure ) Ġ 4 4 3 Ġelse Ġ 8 0 , ĊĠĠĠĠĠĠĠ Ġif Ġ( secure ) Ġ" https " Ġelse Ġ" http ", ĊĠĠĠĠĠĠĠ Ġoid c Server , ĊĠĠĠĠĠĠĠ Ġclient ID , ĊĠĠĠĠĠĠĠ Ġclient Secret ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġheader Hash code Xor Mask : ĠInt Ġ= ĠRandom . nextInt () ĊĠĠĠ Ġprivate Ġval Ġlogger : ĠLogger Ġ= ĠLogger (" Server Logger ") ĊĊĠĠĠ Ġprivate Ġval Ġrefresh Token Property Ġ= Ġproperty < String >() ĊĠĠĠ Ġprivate Ġvar Ġrefresh Token Ġby Ġrefresh Token Property ĊĊĠĠĠ Ġoverride Ġval Ġauth Header Property Ġ= Ġproperty < Authorization Header >() ĊĠĠĠ Ġoverride Ġvar Ġauth Header Ġby Ġauth Header Property ĊĊĠĠĠ Ġoverride Ġfun Ġreset Auth Session () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= ĠRandom . next Long () ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ request AuthToken Mutex . with Lock ( owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Token () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġimprove Ġqueue - handling , Ġonly Ġrequest Ġnew ĠToken Ġif Ġpreviously Ġrecorded Ġtoken Ġhas Ġchanged Ġ( see Ġ` used Header ` Ġin Ġ` request () `) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ request AuthToken Mutex : ĠMutex Ġ= ĠMutex ( true ) Ġ// locked Ġfor Ġparam - loading Ġfrom Ġstorage ĊĠĠĠ Ġprivate Ġval Ġ_ waiting Requests Mutex : ĠMutex Ġ= ĠMutex () ĊĠĠĠ Ġprivate Ġval Ġ_ waiting Requests : ĠMutable List < Triple < Any , ĠHttpMethod , ĠString >> Ġ= Ġmutable ListOf () ĊĠĠĠ Ġval Ġwaiting Requests : ĠList < Pair < HttpMethod , ĠString >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ waiting Requests . map Ġ{ Ġit . second Ġto Ġit . third Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġauth Header Property . onChange Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( auth Header Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Auth Session () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Authorization Header ( auth Header ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrefresh Token Property . onChange Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore RefreshToken ( refresh Token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Ġ= Ġload Authorization Header () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( header Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth Header Ġ= Ġheader ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrefresh Ġ= Ġload RefreshToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( refresh Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Token Ġ= Ġrefresh ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ request AuthToken Mutex . unlock () Ġ// ĠLocked Ġby Ġinitializer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġrequest Token (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrefresh Token Ġ= Ġrefresh Token ĊĠĠĠĠĠĠĠ Ġif Ġ(! refresh Token . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrefresh Response : ĠAny Ġ= Ġtry Ġ{ Ġ// refresh Response : ĠUnion < Token Response , Exception > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoid c Server . perform Token Refresh ( refresh Token , Ġclient ID , Ġclient Secret ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ex . message ?. startsWith (" Fail Ġto Ġserialize Ġbody .") Ġ!= Ġtrue ) Ġthrow Ġex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( refresh Response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠToken Response . Final Token Response . AccessToken Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse AccessToken ( refresh Response , Ġrefresh Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! is ĠToken Response . Expired Token Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Unexpected Ġrefresh - response :", Ġrefresh Response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġauth Response : ĠToken Response . Final Token Response . AccessToken Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoid c Server . perform Device Auth ( client ID , Ġclient Secret , Ġprompt Handler Ġ= Ġ:: handle Auth Prompt ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ex . message ?. startsWith (" Fail Ġto Ġserialize Ġbody .") Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġ" Unexpected Ġresponse Ġto Ġdevice - auth " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġ"| C - x - A | ĠAUTH ĠException !" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Unexpected Ġresponse Ġto Ġdevice - auth ", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġex ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġuse AccessToken ( auth Response ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġuse AccessToken ( token : ĠToken Response . Final Token Response . AccessToken , Ġrefresh Token : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġauth Header Property . set ( Authorization Header . Bearer ( token . accessToken )) ĊĠĠĠĠĠĠĠ Ġrefresh Token Property . set ( token . refresh Token Ġ?: Ġrefresh Token ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġrequest ( ĊĠĠĠĠĠĠĠ Ġmethod : ĠHttpMethod , ĊĠĠĠĠĠĠĠ Ġpath : ĠString , ĊĠĠĠĠĠĠĠ Ġbody : ĠString ?, ĊĠĠĠĠĠĠĠ Ġquery : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġheaders : ĠMap < String , ĠList < String >> ĊĠĠĠ Ġ): ĠServer Response Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( headers . keys . any Ġ{ Ġit . lowercase () Ġ== ĠAuthorization Header . name Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Auth - Header Ġoverwritten , Ġdo Ġnot Ġattempt Ġmultiple Ġrequests ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"| C ==> S | Ġ$ method :$ path ĠH ED : Ġ{ custom Ġauth }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsend HttpRequest ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost URL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow On Non Ok Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġowner : ĠAny Ġ= ĠRandom . next Long () ĊĠĠĠĠĠĠĠ Ġvar Ġused Header : ĠAuthorization Header ? ĊĠĠĠĠĠĠĠ Ġvar Ġresponse : ĠServer Response ĊĠĠĠĠĠĠĠ Ġvar Ġwaiting Request Max Index : ĠInt Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġvar Ġwaiting Request : ĠTrip le < Any , ĠHttpMethod , ĠString >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġremove Waiting Request () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( waiting Request Max Index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ waiting Requests Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠcurrentIndex Ġ= Ġ_ waiting Requests . sub List ( 0 , Ġwaiting Request Max Index ). indexOf ( waiting Request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= Ġ_ waiting Requests . indexOf ( waiting Request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremoved Request Ġ= Ġ_ waiting Requests . remove At ( currentIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( removed Request Ġ!= Ġwaiting Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ waiting Requests . add ( currentIndex , Ġremoved Request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Tri ed Ġto Ġremove Ġrequest Ġ$ waiting Request Ġat Ġindex Ġ$ currentIndex Ġbut Ġremoved Ġ$ removed Request Ġinstead ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlog AuthToken Provided Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( log AuthToken Provided ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"| C < @- A | Ġ$ method :$ path ĠAUTH ĠProvide d " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enable Waiting Request List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Waiting Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġused Header Ġ= Ġauth Header ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ request AuthToken Mutex . holds Lock ( owner )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ request AuthToken Mutex . unlock ( owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"| C --> S | Ġ$ method :$ path ĠH ED : Ġ${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġused Header ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ it . schema Name } # ${ it . hashCode () Ġxor Ġheader Hash code Xor Mask }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġsend HttpRequest ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost URL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( used Header Ġ== Ġnull ) Ġheaders ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġheaders Ġ+ Ġ( Authorization Header . name Ġto ĠlistOf ( used Header . value )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow On Non Ok Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"| C < -- S | Ġ$ method :$ path Ġ- Ġ${ response . meta Info String ()}; ĠC NT :${ response . body Info String () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . status Ġ!= ĠHttpStatusCode . Unauthorized ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enable Waiting Request List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ waiting Requests Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwaiting Request Max Index Ġ= Ġ_ waiting Requests . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( waiting Request Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwaiting Request Ġ= ĠTrip le ( owner , Ġmethod , Ġpath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ waiting Requests . add ( waiting Request !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ request AuthToken Mutex . lock ( owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( used Header Ġ!= Ġauth Header ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"| C - @ > A | Ġ$ method :$ path ĠAUTH " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog AuthToken Provided Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( request Token ()) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ request AuthToken Mutex . holds Lock ( owner )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ request AuthToken Mutex . unlock ( owner ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enable Waiting Request List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Waiting Request () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"| C - ! - A | Ġ$ method :$ path ĠAUTH ĠCancel led " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresponse Ġ// user Ġcanceled Ġthe Ġrequest AuthToken - Call ĊĠĠĠ Ġ} Ċ } Ċ Ċ expect Ġsuspend Ġfun Ġload Authorization Header (): ĠAuthorization Header ? Ċ expect Ġsuspend Ġfun Ġstore Authorization Header ( header : ĠAuthorization Header ?) Ċ expect Ġsuspend Ġfun Ġload RefreshToken (): ĠString ? Ċ expect Ġsuspend Ġfun Ġstore RefreshToken ( refresh Token : ĠString ?) Ċ