/* Ċ Ġ* ĠAir Vision Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) ĠAir Vision Ġ< https :// www . github . com / Air Vision > Ċ Ġ* ĠCopyright Ġ( c ) Ġcontributors Ċ Ġ* Ċ Ġ* ĠThis Ġwork Ġis Ġlicensed Ġunder Ġthe Ġterms Ġof Ġthe ĠMIT ĠLicense Ġ( MIT ). ĠFor Ċ Ġ* Ġa Ġcopy , Ġsee Ġ' LICENSE . txt ' Ġor Ġ< https :// opensource . org / licenses / MIT >. Ċ Ġ*/ Ċ package Ġio . github . air vision . util . ktor Ċ Ċ import Ġarrow . core . Either Ċ import Ġio . ktor . client . HttpClient Ċ import Ġio . ktor . client . features . HttpRequest TimeoutException Ċ import Ġio . ktor . client . features . Response Exception Ċ import Ġio . ktor . client . request . HttpRequest Builder Ċ import Ġio . ktor . client . request . get Ċ import Ġio . ktor . client . statement . HttpResponse Ċ import Ġio . ktor . client . utils . Empty Content Ċ import Ġio . ktor . http . DEFAULT _ PORT Ċ import Ġkotlinx . coroutines . Timeout Cancellation Exception Ċ import Ġjava . net . Socket TimeoutException Ċ import Ġjava . net . Unknown Host Exception Ċ Ċ suspend Ġinline Ġfun Ġ< re ified ĠR > ĠHttpClient . try To Get ( ĊĠ Ġurl String : ĠString , ĊĠ Ġcross inline Ġblock : ĠHttpRequest Builder . () Ġ-> ĠUnit Ġ= Ġ{} Ċ ): ĠEither < Failure , ĠR > Ġ= Ġtry To Handle Ġ{ ĊĠ Ġget ( url String , Ġblock ) Ċ } Ċ Ċ suspend Ġinline Ġfun Ġ< re ified ĠR > ĠHttpClient . try To Get ( ĊĠ Ġscheme : ĠString Ġ= Ġ" http ", Ġhost : ĠString Ġ= Ġ" localhost ", Ġport : ĠInt Ġ= ĠDEFAULT _ PORT , ĊĠ Ġpath : ĠString Ġ= Ġ"/", ĊĠ Ġbody : ĠAny Ġ= ĠEmpty Content , ĊĠ Ġcross inline Ġblock : ĠHttpRequest Builder . () Ġ-> ĠUnit Ġ= Ġ{} Ċ ): ĠEither < Failure , ĠR > Ġ= Ġtry To Handle Ġ{ ĊĠ Ġget ( scheme , Ġhost , Ġport , Ġpath , Ġbody , Ġblock ) Ċ } Ċ Ċ suspend Ġfun Ġ< R > Ġtry To Handle ( fn : Ġsuspend Ġ() Ġ-> ĠR ): ĠEither < Failure , ĠR > Ġ{ ĊĠ Ġreturn Ġtry Ġ{ ĊĠĠĠ ĠEither . Right ( fn ()) ĊĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠ Ġval Ġfailure Ġ= Ġwhen Ġ( ex ) Ġ{ ĊĠĠĠĠĠ Ġis ĠTimeout Cancellation Exception , ĊĠĠĠĠĠ Ġis ĠSocket TimeoutException , ĊĠĠĠĠĠĠĠ Ġ// ĠIs Ġthrown Ġby Ġthe ĠHttp Timeout Ġfeature ĊĠĠĠĠĠ Ġis ĠHttpRequest TimeoutException , ĊĠĠĠĠĠĠĠ Ġ// ĠL ets Ġassume Ġthat Ġthis Ġis Ġalso Ġa Ġtimeout Ġexception , Ġsince Ġthe Ġhost Ġcouldn 't Ġbe Ġfound ĊĠĠĠĠĠ Ġis ĠUnknown Host Exception Ġ-> ĠFailure . Timeout ĊĠĠĠĠĠ Ġ// ĠSomething Ġjust Ġwent Ġwrong Ġwith Ġgetting Ġa Ġvalid Ġresponse ĊĠĠĠĠĠ Ġis ĠResponse Exception Ġ-> ĠFailure . ErrorResponse ( ex . response ) ĊĠĠĠĠĠ Ġ// ĠSomething Ġelse Ġwent Ġwrong Ġon Ġour Ġend ĊĠĠĠĠĠ Ġelse Ġ-> ĠFailure . Internal Error ( ex ) ĊĠĠĠ Ġ} ĊĠĠĠ ĠEither . Left ( failure ) ĊĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠFailure Ġ{ ĊĊĠ Ġobject ĠTimeout Ġ: ĠFailure () ĊĊĠ Ġdata Ġclass ĠError Response ( val Ġresponse : ĠHttpResponse ) Ġ: ĠFailure () Ġ{ ĊĊĠĠĠ Ġval Ġmessage : ĠString ĊĠĠĠĠĠ Ġget () Ġ= Ġ"${ response . call . request . url }: Ġ${ response . status }" ĊĠ Ġ} ĊĊĠ Ġdata Ġclass ĠInternal Error ( val Ġexception : ĠException ) Ġ: ĠFailure () Ċ } Ċ