/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 Ġy vol k Ġ( Y uri ĠVol kov ), Ġhttp :// y ur iv olk ov . com Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . and status . app . net . http Ċ Ċ import Ġandroid . net . Uri Ċ import Ġcom . github . scribe java . core . model . Verb Ċ import Ġio . v avr . control . Try Ċ import Ġorg . and status . app . account . Account Data Writer Ċ import Ġorg . and status . app . context . My Preferences Ċ import Ġorg . and status . app . net . social . Api Routine Enum Ċ import Ġorg . and status . app . util . Json Utils Ċ import Ġorg . and status . app . util . My Log Ċ import Ġorg . and status . app . util . My StringBuilder Ċ import Ġorg . and status . app . util . Tri State Ċ import Ġorg . and status . app . util . Try Utils Ċ import Ġorg . and status . app . util . Uri Utils Ċ import Ġorg . and status . app . util . Url Utils Ċ import Ġorg . json . JSONObject Ċ import Ġjava . net . URL Ċ Ċ interface ĠHttp Connection Interface Ġ{ ĊĊĠĠĠ Ġval Ġdata : ĠHttp Connection Data ĊĊĠĠĠ Ġfun Ġregister Client (): ĠTry < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnothing Ġin Ġthe Ġdefault Ġimplementation ĊĠĠĠĠĠĠĠ Ġreturn ĠTry Utils . SUCCESS ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Http Connection Data ( data : ĠHttp Connection Data ) ĊĊĠĠĠ Ġfun Ġpath To Url String ( path : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġreturn ĠTry ĊĠĠĠĠĠĠĠ Ġreturn ĠUrl Utils . path To Url String ( data . origin Url , Ġpath , Ġerror On Invalid Urls ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getOrElse ("") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġerror On Invalid Urls (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexecute ( request In : ĠHttpRequest ): ĠTry < Http Read Result > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġrequest In . with Connection Data ( data ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( request . verb Ġ== ĠVerb . POST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠSee Ġhttps :// github . com / and status / and status / issues / 2 4 9 Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . get Use Legacy Http Protocol () Ġ== ĠTri State . UNKNOWN ) Ġexecute One Protocol ( request , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse Ġ{ Ġexecute One Protocol ( request , Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġexecute One Protocol ( request , Ġdata . get Use Legacy Http Protocol (). to Boolean ( true )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Inner ( request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexecute One Protocol ( request : ĠHttpRequest , Ġis Legacy Http Protocol : ĠBoolean ): ĠTry < Http Read Result > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexecute Inner ( request . with Legacy Http Protocol ( is Legacy Http Protocol )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Inner ( request : ĠHttpRequest ): ĠTry < Http Read Result > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request . verb Ġ== ĠVerb . POST Ġ&& ĠMy Preferences . is Log Network Level Messages ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġj so Ġ= ĠJson Utils . put ( request . post Params . orElse Get Ġ{ ĠJSONObject () Ġ}, Ġ" logged URL ", Ġrequest . uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . media Uri . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj so Ġ= ĠJson Utils . put ( js o , Ġ" logged Media Uri ", Ġrequest . media Uri . get (). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMy Log . log Network Level Message (" post ", Ġrequest . getLog Name (), Ġj so , Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġrequest . validate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap ( Th rott ler :: before Execution ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġobj : ĠHttpRequest Ġ-> Ġobj . new Result () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġresult : ĠHttp Read Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . request . verb Ġ== ĠVerb . POST ) Ġpost Request ( result ). to Try Result () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġget Request Inner ( result ). to Try Result () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also ( Th rott ler :: after Execution ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Success Ġ{ Ġresult : ĠHttp Read Result Ġ-> Ġresult . log Response () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpost Request ( result : ĠHttp Read Result ): ĠHttp Read Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Request Inner ( result : ĠHttp Read Result ): ĠHttp Read Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( result . request . api Routine Ġ== ĠApi Routine Enum . DOWNLOAD _ FILE Ġ&& Ġ! Uri Utils . is Download able ( result . request . uri )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Local File ( result ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Request ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdownload Local File ( result : ĠHttp Read Result ): ĠHttp Read Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġresult . read Stream (" media Uri ='" Ġ+ Ġresult . request . uri Ġ+ Ġ"'" ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġresult . request . my Context (). context . content Resolver . open InputStream ( result . request . uri ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. recover ( Exception :: class . java ) Ġ{ Ġe : ĠException ? Ġ-> Ġresult . set Exception ( e ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getOrElse ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Request ( result : ĠHttp Read Result ): ĠHttp Read Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Auth Information () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠEmpty ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Client Keys () Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . oauth Client Keys ?. clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Password Needed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġpassword : ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPers ist Ġthe Ġconnection Ġdata ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġsomething Ġchanged Ġ( so Ġit Ġneeds Ġto Ġbe Ġre written Ġto Ġpersistence ...) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsave To ( dw : ĠAccount Data Writer ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDo Ġwe Ġhave Ġenough Ġcredentials Ġto Ġverify Ġthem ? ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġ== Ġyes ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcredentials Present : ĠBoolean Ġget () Ġ= Ġfalse ĊĊĠĠĠ Ġval Ġssl Mode : ĠS sl Mode Enum Ġget () Ġ= Ġdata . ssl Mode ĊĊĠĠĠ Ġfun ĠsetUser Token With Secret ( token : ĠString ?, Ġsecret : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" setUser Token With Secret Ġis Ġfor ĠOAuth Ġonly !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġuser Token : ĠString Ġget () Ġ= Ġ"" ĊĊĠĠĠ Ġval Ġuser Secret : ĠString Ġget () Ġ= Ġ"" ĊĊĠĠĠ Ġfun Ġget New Instance (): ĠHttp Connection Interface ĊĊĠĠĠ Ġfun Ġon Moved ( result : ĠHttp Read Result ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . appendTo Log (" status Line :' " Ġ+ Ġresult . status Line Ġ+ Ġ"' ") ĊĠĠĠĠĠĠĠ Ġresult . redirect ed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn ĠTry Utils . from Optional ( result . getLocation ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Failure Ġ{ ĠConnection Exception ( StatusCode . MOVED , Ġ" No Ġ' Location ' Ġheader Ġon ĠMO VED Ġresponse ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġlocation : ĠString Ġ-> ĠUrl Utils . redirectTo ( result . url , Ġlocation )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Failure Ġ{ ĠConnection Exception ( StatusCode . MOVED , Ġ" Invalid Ġredirect Ġfrom Ġ'${ result . url } '" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġto Ġ'${ result . getLocation () }' ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġredirected : ĠURL Ġ-> Ġresult . set Url ( redirect ed ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Failure Ġ{ Ġe : ĠThrowable Ġ-> Ġresult . set Exception ( e ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Success Ġ{ Ġresult 1 : ĠHttp Read Result Ġ-> Ġlog Following Redirect s ( result 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. is Failure ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlog Following Redirect s ( result : ĠHttp Read Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( My Log . is Verbose Enabled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder : ĠMy StringBuilder Ġ= ĠMy StringBuilder . of (" Following Ġredirect Ġto Ġ'${ result . url }' ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append Headers ( builder ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMy Log . v ( this , Ġbuilder . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠUSER _ AGENT : ĠString Ġ= Ġ" And Status " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe ĠURI Ġis Ġconsistent Ġwith Ġ" scheme " Ġand Ġ" host " Ġin ĠAndroid Manifest ĊĠĠĠĠĠĠĠĠ Ġ* ĠP ump . io Ġdoesn 't Ġwork Ġwith Ġthis Ġscheme : Ġ" and status - oauth :// and status . org " ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠCALL BACK _ URI Ġ= ĠUri . parse (" http :// oauth - redirect . and status . org ") ĊĠĠĠ Ġ} Ċ } Ċ