/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠV imeo Ġ( https :// v imeo . com ) Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġcom . v imeo . networking 2 . internal Ċ Ċ import Ġcom . v imeo . networking 2 . ApiError Ċ import Ġcom . v imeo . networking 2 . Response Origin Ċ import Ġcom . v imeo . networking 2 . V imeo Response Ċ import Ġcom . v imeo . networking 2 . logging . V imeo Logger Ċ import Ġokhttp 3 . ResponseBody Ċ import Ġretrofit 2 . Converter Ċ import Ġretrofit 2 . Response Ċ import Ġjava . io . IOException Ċ Ċ /** Ċ Ġ* ĠParse Ġthe Ġerror Ġbody Ġinto Ġan Ġappropriate Ġ[ V imeo Response . Error ] Ġinstance . Ċ Ġ* Ċ Ġ* Ġ@ param Ġresponse Body Converter ĠThe Ġconverter Ġused Ġto Ġparse Ġthe Ġerror Ġbody . Ċ Ġ*/ Ċ fun Ġ< T > ĠResponse < T >. parse ErrorResponse ( ĊĠĠĠ Ġresponse Body Converter : ĠConverter < ResponseBody , ĠApi Error > Ċ ): ĠV imeo Response . Error Ġ= Ġparse ErrorResponse ( response Body Converter , Ġnull ) Ċ Ċ /** Ċ Ġ* ĠParse Ġthe Ġerror Ġbody Ġinto Ġan Ġappropriate Ġ[ V imeo Response . Error ] Ġinstance . Ċ Ġ* Ċ Ġ* Ġ@ param Ġresponse Body Converter ĠThe Ġconverter Ġused Ġto Ġparse Ġthe Ġerror Ġbody . Ċ Ġ* Ġ@ param Ġv imeo Logger ĠThe Ġlogger Ġused Ġto Ġreport Ġinformation Ġabout Ġthe Ġerror Ġhandling . Ċ Ġ*/ Ċ @ Suppress (" Complex Method ") Ċ internal Ġfun Ġ< T > ĠResponse < T >. parse ErrorResponse ( ĊĠĠĠ Ġresponse Body Converter : ĠConverter < ResponseBody , ĠApi Error >, ĊĠĠĠ Ġv imeo Logger : ĠV imeo Logger ? Ċ ): ĠV imeo Response . Error Ġ{ ĊĠĠĠ Ġrequire (! is Successful ) Ġ{ Ġ" Cannot Ġget Ġerror Ġfrom Ġa Ġsuccessful Ġresponse " Ġ} ĊĠĠĠ Ġval Ġerror Body Ġ= Ġerror Body () ĊĠĠĠ Ġval Ġis Unauthorized Error Ġ= ĠINVALID _ TOKEN _ VALUE Ġ== Ġheaders (). get ( AUTHENT ICATE _ HEADER ) ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġerror Body Ġ!= Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Error : ĠApi Error ? Ġ= Ġresponse Body Converter . convert ( error Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Unauthorized Error Ġ-> ĠV imeo Response . Error . Invalid Token ( api Error , Ġcode ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi Error Ġ!= Ġnull Ġ-> ĠV imeo Response . Error . Api ( api Error , Ġcode ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠV imeo Response . Error . Unknown ( error Body . string (), Ġcode ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv imeo Logger ?. e (" Error Ġwhile Ġattempting Ġto Ġconvert Ġresponse Ġbody Ġto ĠV imeo Error ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Body String Ġ= Ġerror Body . safe String ( v imeo Logger ) Ġ?: Ġ" Unable Ġto Ġread Ġerror Ġbody " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Unauthorized Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV imeo Response . Error . Invalid Token ( null , Ġcode ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV imeo Response . Error . Unknown ( error Body String , Ġcode ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis Unauthorized Error Ġ-> ĠV imeo Response . Error . Invalid Token ( null , Ġcode ()) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠV imeo Response . Error . Unknown (" Null Ġerror Ġbody ", Ġcode ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠS af ely Ġreads Ġfrom Ġ[ ResponseBody . string ] Ġwithout Ġthe Ġrisk Ġof Ġthrowing Ġan Ġexception . Ċ Ġ* Ċ Ġ* Ġ@ param Ġv imeo Logger ĠThe Ġlogger Ġused Ġto Ġlog Ġinformation Ġabout Ġreading Ġfrom Ġthe Ġerror Ġbody . Ċ Ġ*/ Ċ private Ġfun ĠResponse Body . safe String ( v imeo Logger : ĠV imeo Logger ?): ĠString ? Ġ= Ġtry Ġ{ ĊĠĠĠ Ġstring () Ċ } Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠ Ġv imeo Logger ?. e (" Unable Ġto Ġread Ġerror Ġbody ", Ġe ) ĊĠĠĠ Ġnull Ċ } Ċ Ċ /** Ċ Ġ* ĠDetermines Ġthe Ġ[ Response Origin ] Ġof Ġthe Ġresponse . Ċ Ġ*/ Ċ fun ĠResponse <* >. determine Origin (): ĠResponse Origin Ġ= Ġif Ġ( raw (). cache Response () Ġ!= Ġnull ) Ġ{ ĊĠĠĠ ĠResponse Origin . CACHE Ċ } Ġelse Ġ{ ĊĠĠĠ ĠResponse Origin . NETWORK Ċ } Ċ Ċ private Ġconst Ġval ĠINVALID _ TOKEN _ VALUE Ġ= Ġ" Bearer Ġerror =\" invalid _ token \"" Ċ private Ġconst Ġval ĠAUTH ENT ICATE _ HEADER Ġ= Ġ" WW W - Authenticate " Ċ