/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 - 2 0 2 1 ĠThe ĠDevelopers . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License ") Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . github . o he ger . location t eller . server Ċ Ċ import Ġokhttp 3 .* Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . IOException Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . coroutines . Continuation Ċ import Ġkotlin . coroutines . suspend Coroutine Ċ Ċ /** Ċ Ġ* ĠA Ġclass Ġrepresenting Ġthe Ġresponse Ġof Ġan ĠHTTP Ġrequest . Ċ Ġ* Ċ Ġ* ĠThis Ġclass Ġis Ġrestricted Ġto Ġthe Ġinformation Ġthat Ġis Ġrelevant Ġfor Ġthe Ġuse Ċ Ġ* Ġcases Ġof Ġthis Ġapplication . ĠIt Ġcontains Ġa Ġflag Ġwhether Ġthe Ġrequest Ġwas Ċ Ġ* Ġsuccessful Ġand Ġan Ġadditional Ġstatus Ġcode . ĠIf Ġthe Ġresponse Ġhas Ġa Ġbody , Ġit Ġis Ċ Ġ* Ġavailable Ġhere Ġas Ġa Ġstring . Ġ( We Ġexpect Ġthat Ġthe Ġsizes Ġof Ġresponses Ġwill Ġnot Ċ Ġ* Ġbecome Ġtoo Ġgit ; Ġtherefore , Ġthey Ġare Ġloaded Ġdirectly Ġinto Ġmemory . ĠIf Ġthere Ġis Ċ Ġ* Ġno Ġresponse Ġentity , Ġor Ġthe Ġrequest Ġwas Ġa Ġfailure , Ġan Ġempty Ġstring Ġis Ġused Ġas Ċ Ġ* Ġcontent . Ċ Ġ* Ċ Ġ* Ġ@ param Ġsuccessful Ġflag Ġwhether Ġthe Ġrequest Ġwas Ġsuccessful Ċ Ġ* Ġ@ param Ġstatus Ġthe ĠHTTP Ġstatus Ġcode Ċ Ġ* Ġ@ param Ġcontent Ġthe Ġcontent Ġof Ġthe Ġresponse Ġentity Ċ Ġ*/ Ċ data Ġclass ĠHttpResponse ( ĊĠĠĠ Ġval Ġsuccessful : ĠBoolean , ĊĠĠĠ Ġval Ġstatus : ĠInt , ĊĠĠĠ Ġval Ġcontent : ĠString Ċ ) Ċ Ċ /** Ċ Ġ* ĠA Ġclass Ġthat Ġwraps Ġan ĠHTTP Ġclient Ġand Ġoffers Ġfunctions Ġfor Ġconvenient ly Ċ Ġ* Ġexecuting Ġdifferent Ġtypes Ġof Ġrequests . Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġnot Ġan Ġall - purpose ĠHTTP Ġclient , Ġbut Ġit Ġis Ġvery Ġfocused Ġon Ġthe Ġuse Ċ Ġ* Ġcases Ġof Ġthe Ġtracking Ġapplication . ĠTherefore , Ġthe ĠAPI Ġis Ġvery Ġlean . ĠThe Ġmain Ċ Ġ* Ġgoal Ġof Ġthis Ġclass Ġis Ġto Ġaccess Ġthe Ġasynchronous ĠHTTP Ġclient Ġused Ġbehind Ġthe Ċ Ġ* Ġscenes Ġvia Ġco - rout ines . Ċ Ġ*/ Ċ class ĠTrack HttpClient Ġprivate Ġconstructor ( private Ġval Ġclient : ĠOk HttpClient ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Track HttpClient :: class . java ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends Ġa Ġrequest Ġto Ġretrieve Ġdata . ĠThe Ġmajor Ġdifference Ġto Ġan Ġupdate ĊĠĠĠĠ Ġ* Ġrequest Ġis Ġthat Ġthis Ġfunction Ġevaluates Ġthe Ġbody Ġof Ġthe Ġresponse Ġand ĊĠĠĠĠ Ġ* Ġtransforms Ġit Ġto Ġa Ġstring Ġthat Ġis Ġdelivered Ġwith Ġthe Ġ[ HttpResponse ] ĊĠĠĠĠ Ġ* Ġobject . ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest Ġthe Ġrequest Ġto Ġbe Ġsent ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġresponse Ġfor Ġthis Ġrequest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġrequest ( request : ĠRequest ): ĠHttpResponse Ġ= ĊĠĠĠĠĠĠĠ Ġsend Request ( request , Ġprocess Body Ġ= Ġtrue ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends Ġan Ġupdate Ġrequest . ĠThis Ġis Ġa Ġrequest Ġfor Ġwhich Ġno Ġdata Ġis Ġloaded ĊĠĠĠĠ Ġ* Ġfrom Ġthe Ġserver ; Ġonly Ġa Ġstatus Ġcode Ġabout Ġthe Ġsuccess Ġof Ġthe Ġoperation ĊĠĠĠĠ Ġ* Ġis Ġexpected . ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest Ġthe Ġrequest Ġto Ġbe Ġsent ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġresponse Ġfor Ġthis Ġrequest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġupdate ( request : ĠRequest ): ĠHttpResponse Ġ= ĊĠĠĠĠĠĠĠ Ġsend Request ( request , Ġprocess Body Ġ= Ġfalse ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHelper Ġfunction Ġto Ġsend Ġa Ġrequest Ġand Ġgenerate Ġthe Ġresponse . ĠThis ĊĠĠĠĠ Ġ* Ġfunction Ġdoes Ġthe Ġcommunication Ġwith Ġthe Ġunderlying ĠHTTP Ġclient Ġand ĊĠĠĠĠ Ġ* Ġconverts Ġthe Ġasynchronous Ġprogramming Ġmodel Ġto Ġthe Ġco - routine Ġpar adig m . ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest Ġthe Ġrequest Ġto Ġbe Ġsent ĊĠĠĠĠ Ġ* Ġ@ param Ġprocess Body Ġflag Ġwhether Ġthe Ġbody Ġshould Ġbe Ġevaluated ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġresponse Ġfor Ġthis Ġrequest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsend Request ( request : ĠRequest , Ġprocess Body : ĠBoolean ): ĠHttpResponse Ġ= Ġsuspend Coroutine Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠ Ġclient . new Call ( request ). enqueue ( create Callback ( cont , Ġprocess Body )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġcallback Ġobject Ġto Ġhandle Ġan ĠHTTP Ġcall . ĠThe Ġgiven Ġcontinuation ĊĠĠĠĠ Ġ* Ġis Ġres umed Ġwhen Ġa Ġresult Ġ( or Ġan Ġerror ) Ġis Ġreceived Ġfrom Ġthe Ġcall . ĠAll ĊĠĠĠĠ Ġ* Ġresponses Ġ- Ġincluding Ġerrors Ġ- Ġare Ġmapped Ġto Ġ[ HttpResponse ] Ġobjects . ĊĠĠĠĠ Ġ* Ġ@ param Ġcont Ġthe Ġobject Ġto Ġresume Ġthe Ġcurrent Ġco - routine ĊĠĠĠĠ Ġ* Ġ@ param Ġprocess Body Ġflag Ġwhether Ġthe Ġbody Ġshould Ġbe Ġevaluated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Callback ( cont : ĠContinu ation < HttpResponse >, Ġprocess Body : ĠBoolean ): ĠCallback Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠCallback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall , Ġe : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Call Ġfailed .", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume With ( Result . success ( error Response )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġif Ġ( process Body ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body . use Ġ{ Ġbody Ġ-> Ġbody ?. string () Ġ?: Ġempty Content Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġempty Content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume With ( Result . success ( HttpResponse ( response . is Successful , Ġresponse . code , Ġcontent ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠConstant Ġfor Ġthe Ġstring Ġindicating Ġthat Ġno Ġcontent Ġis Ġavailable .*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġempty Content Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠConstant Ġfor Ġthe Ġgeneric Ġerror Ġresponse . ĠThis Ġresponse Ġis Ġreturned ĊĠĠĠĠĠĠĠĠ Ġ* Ġif Ġthere Ġwas Ġa Ġfatal Ġerror Ġduring ĠHTTP Ġcommunication . ĠNo Ġresponse ĊĠĠĠĠĠĠĠĠ Ġ* Ġfrom Ġthe Ġserver Ġcould Ġbe Ġretrieved ; Ġhence , Ġthere Ġis Ġno Ġvalid Ġstatus ĊĠĠĠĠĠĠĠĠ Ġ* Ġcode . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġerror Response Ġ= ĠHttpResponse ( false , Ġ- 1 , Ġempty Content ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġinstance Ġof Ġ_ Track HttpClient _. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtimeout Millis Ġthe Ġtimeout Ġfor Ġcalls ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġnew Ġclient Ġinstance ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( timeout Millis : ĠLong ): ĠTrack HttpClient Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠOk HttpClient . Builder (). call Timeout ( timeout Millis , ĠTimeUnit . MILLISECONDS ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrack HttpClient ( client ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ