/* Ċ Ġ* Ġ( c ) Ġ 2 0 2 0 - 2 0 2 1 ĠS orrow Blue . Ċ Ġ*/ Ċ Ċ package Ġcom . sor row blue . tw it lin . core Ċ Ċ import Ġcom . sor row blue . tw it lin . authentication . AccessToken Ċ import Ġcom . sor row blue . tw it lin . authentication . Bearer Token Ċ import Ġcom . sor row blue . tw it lin . utils . url Encode Ċ import Ġio . ktor . client . request . HttpRequest Builder Ċ import Ġio . ktor . client . request . header Ċ import Ġio . ktor . http . ContentType Ċ import Ġio . ktor . http . HttpHeaders Ċ import Ġio . ktor . http . content . Text Content Ċ import Ġio . ktor . util . Internal API Ċ import Ġio . ktor . util . encode Base 6 4 Ċ import Ġkotlinx . datetime . Clock Ċ import Ġkotlinx . serialization . encode ToString Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġkotlin . random . Random Ċ Ċ internal Ġval ĠArray < out ĠPair < String , ĠAny ? >> . notNull Params : ĠList < Pair < String , ĠString >> ĊĠĠĠ Ġget () Ġ= Ġmap NotNull Ġ{ Ġpair Ġ-> Ġpair . second ?. let Ġ{ Ġpair . first Ġto Ġit . toString () Ġ} Ġ} Ċ Ċ internal Ġfun ĠHttpRequest Builder . create Signature ( ĊĠĠĠ Ġconsumer Key : ĠString , ĊĠĠĠ Ġconsumer Secret : ĠString , ĊĠĠĠ Ġnonce : ĠString , ĊĠĠĠ Ġtimestamp : ĠString , ĊĠĠĠ ĠaccessToken : ĠAccess Token ?, ĊĠĠĠ Ġparams : ĠList < Pair < String , ĠString >> Ċ ): ĠString Ġ{ ĊĠĠĠ Ġval Ġparameter String Ġ= ĊĠĠĠĠĠĠĠ Ġcollecting Parameters ( consumer Key , Ġnonce , Ġtimestamp , ĠaccessToken ?. oauth Token , Ġparams ) ĊĠĠĠ Ġval Ġno Query Url Ġ= Ġ"${ url . protocol . name } ://${ url . host }${ url . encoded Path }" ĊĠĠĠ Ġval Ġbase String Ġ= Ġcreating Signature Base String ( method . value , Ġno Query Url , Ġparameter String ) ĊĠĠĠ Ġval Ġsigning Key Ġ= Ġgetting Signing Key ( consumer Secret , ĠaccessToken ?. oauth Token Secret ) ĊĠĠĠ Ġreturn Ġcalculate Signature Base 6 4 ( base String , Ġsigning Key ) Ċ } Ċ Ċ @ Opt In ( Internal API :: class ) Ċ internal Ġfun ĠHttpRequest Builder . header Authorization ( ĊĠĠĠ Ġconsumer Key : ĠString , ĊĠĠĠ Ġconsumer Secret : ĠString , ĊĠĠĠ Ġparams : ĠList < Pair < String , ĠString >>, ĊĠĠĠ ĠaccessToken : ĠAccess Token ? Ċ ) Ġ{ ĊĠĠĠ Ġval Ġnc Ġ= ĠRandom . next Bytes ( 3 2 ). encode Base 6 4 (). trim (' =') ĊĠĠĠ Ġval Ġts Ġ= ĠClock . System . now (). epoch Seconds . toString () ĊĠĠĠ Ġval Ġsign Ġ= ĊĠĠĠĠĠĠĠ Ġcreate Signature ( consumer Key , Ġconsumer Secret , Ġnc , Ġts , ĠaccessToken , Ġparams ) ĊĠĠĠ Ġval Ġparameters Ġ= ĊĠĠĠĠĠĠĠ Ġcollecting Parameters ( consumer Key , Ġnc , Ġsign , Ġts , ĠaccessToken ?. oauth Token , Ġparams ) ĊĠĠĠ Ġval Ġheader Value Ġ= Ġbuild Header String ( parameters ) ĊĠĠĠ Ġheader ( HttpHeaders . Authorization , Ġheader Value ) Ċ } Ċ Ċ internal Ġfun ĠHttpRequest Builder . header Authorization ( bearer Token : ĠBearer Token ?) Ġ= ĊĠĠĠ Ġheader ( HttpHeaders . Authorization , Ġ" Bearer Ġ${ bearer Token ?. accessToken }") Ċ Ċ internal Ġfun ĠHttpRequest Builder . body Form Url Encoded ( params : ĠList < Pair < String , ĠString >>) Ġ{ ĊĠĠĠ Ġparams . map NotNull Ġ{ Ġif Ġ( it . first . startsWith (" oauth _ ")) Ġnull Ġelse Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ. join ToString ("& ") Ġ{ Ġ"${ it . first . url Encode ()} =${ it . second . url Encode () }" Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= ĠText Content ( it , ĠContentType . Application . Form Url Encoded ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġinline Ġfun Ġ< re ified ĠV Ġ: ĠAny > ĠHttpRequest Builder . body Json ( clazz : ĠV ) Ġ{ ĊĠĠĠ Ġbody Ġ= ĠText Content ( Json . encode ToString ( clazz ), ĠContentType . Application . Json ) Ċ } Ċ