package Ġcom . jacob t read . al to . utils . network Ċ Ċ import Ġcom . jacob t read . al to . logger . Logger Ċ import Ġjava . io . IOException Ċ import Ġjava . io . Unsupported EncodingException Ċ import Ġjava . net .* Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ /** Ċ Ġ* Ġconcat URL ĠConcat en ates Ġthe Ġprovided Ġ[ query ] Ġstring Ġonto Ġthe Ċ Ġ* Ġend Ġof Ġthe Ġprovided Ġurl Ċ Ġ* Ċ Ġ* Ġ@ param Ġurl ĠThe Ġurl Ġto Ġadd Ġonto Ċ Ġ* Ġ@ param Ġquery ĠThe Ġquery Ġto Ġadd Ċ Ġ* Ġ@ return ĠThe Ġresulting ĠURL Ċ Ġ*/ Ċ fun Ġconcat URL ( url : ĠURL , Ġquery : ĠString ): ĠURL Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( url . query Ġ!= Ġnull Ġ&& Ġurl . query . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠURL ( url . protocol , Ġurl . host , Ġurl . port , Ġ"${ url . file }& $ query ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠURL ( url . protocol , Ġurl . host , Ġurl . port , Ġ"${ url . file } ?$ query ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠMal formed URLException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Failed Ġto Ġconcat ĠURL Ġwith Ġgiven ĠGET Ġarguments ", Ġe ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġurl Encode ĠURL Ġen codes Ġthe Ġprovided Ġvalue Ċ Ġ* Ċ Ġ* Ġ@ param Ġvalue ĠThe Ġvalue Ġto Ġurl Ġencode Ċ Ġ* Ġ@ return ĠThe Ġurl Ġencoded Ġvalue Ġor Ġan Ġempty Ġstring Ġon Ġfailure Ċ Ġ*/ Ċ fun Ġurl Encode ( value : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠURL Encoder . encode ( value , ĠChar sets . UTF _ 8 ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠUnsupported EncodingException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠHttp s Ġ{ ĊĠĠĠ Ġprivate Ġval ĠLOGGER : ĠLogger Ġ= ĠLogger . get () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPRO XY ĠThe Ġproxy Ġthat Ġshould Ġbe Ġused Ġwhen Ġmaking ĊĠĠĠĠ Ġ* Ġnetworking Ġrequests . ĠThis Ġis Ġset Ġon Ġstartup ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar ĠPRO XY : ĠProxy Ġ= ĠProxy . NO _ PROXY ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġnetwork Thread Id ĠThe Ġid Ġthat Ġthe Ġnext Ġworker Ġthread Ġfrom ĊĠĠĠĠ Ġ* Ġ[ EXECUT OR ] Ġwill Ġhave ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġnetwork Thread Id Ġ= ĠAtomicInteger ( 1 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEXEC UT OR ĠThe Ġexecutor Ġfor Ġexecuting Ġnetworking Ġjobs Ġin Ġa Ġpool ĊĠĠĠĠ Ġ* Ġof Ġ 1 0 Ġthreads ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠEXEC UT OR : ĠExecutor Service Ġ= ĠExec utors . new Fixed ThreadPool ( 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠThread ( it , Ġ" Net Worker # ${ network Thread Id . get And Increment ()} "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Daemon Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Connection ( url : ĠURL ): ĠHttp URLConnection Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġurl . open Connection ( PROXY ) ĊĠĠĠĠĠĠĠ Ġconnection . connect Timeout Ġ= Ġ 1 5 0 0 0 ĊĠĠĠĠĠĠĠ Ġconnection . read Timeout Ġ= Ġ 1 5 0 0 0 ĊĠĠĠĠĠĠĠ Ġconnection . use Caches Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġconnection Ġas ĠHttp URLConnection ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġpost ĠPerforms Ġan ĠHTTP ĠPOST Ġrequest Ġand Ġsends Ġthe Ġprovided Ġ[ data ] ĊĠĠĠĠ Ġ* Ġto Ġthe Ġprovided Ġ[ url ] Ġwith Ġthe Ġprovided Ġ[ contentType ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġurl ĠThe Ġurl Ġto Ġsend Ġthe ĠPOST Ġrequest ĊĠĠĠĠ Ġ* Ġ@ param Ġdata ĠThe Ġdata Ġof Ġthe Ġpost Ġrequest ĊĠĠĠĠ Ġ* Ġ@ param ĠcontentType ĠThe ĠContent - Type Ġheader Ġof Ġthe Ġrequest Ġe . g . Ġapplication / json ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġraw Ġtext Ġresponse Ġfrom Ġthe Ġserver ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĠIf Ġthe Ġrequest Ġwas Ġa Ġfailure ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpost ( url : ĠURL , Ġdata : ĠString , ĠcontentType : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġcreate Connection ( url ) ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġdata . toByteArray ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġconnection . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Method Ġ= Ġ" POST " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Request Property (" Content - Type ", Ġ"$ contentType ; Ġcharset = utf - 8 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Request Property (" Content - Length ", Ġ"${ bytes . size }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Output Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . use Ġ{ Ġit . write ( bytes ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . use Ġ{ Ġreturn ĠString ( it . read All Bytes (), ĠChar sets . UTF _ 8 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Stream ?. use Ġ{ Ġreturn ĠString ( it . read All Bytes (), ĠChar sets . UTF _ 8 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġget ĠPerforms Ġan ĠHTTP ĠGET Ġrequest Ġto Ġthe Ġprovided Ġ[ url ] ĊĠĠĠĠ Ġ* Ġwith Ġthe Ġoptional Ġvalue Ġ[ authorization ] Ġfor Ġthe ĊĠĠĠĠ Ġ* ĠAuthorization Ġheader Ġreturns Ġthe Ġplain Ġtext Ġresponse ĊĠĠĠĠ Ġ* Ġfrom Ġthe Ġserver ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġurl ĠThe Ġurl Ġto Ġsend Ġthe ĠGET Ġrequest ĊĠĠĠĠ Ġ* Ġ@ param Ġauthorization ĠThe Ġauthorization Ġheader Ġvalue Ġor Ġnull ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġplain Ġtext Ġresponse Ġfrom Ġthe Ġserver ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĠIf Ġthe Ġrequest Ġwas Ġa Ġfailure ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget ( url : ĠURL , Ġauthorization : ĠString ? Ġ= Ġnull ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġcreate Connection ( url ) ĊĠĠĠĠĠĠĠ Ġconnection . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( authorization Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Request Property (" Authorization ", Ġauthorization ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . use Ġ{ Ġreturn ĠString ( it . read All Bytes (), ĠChar sets . UTF _ 8 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Stream ?. use Ġ{ Ġreturn ĠString ( it . read All Bytes (), ĠChar sets . UTF _ 8 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġbuild Query ĠBuilds Ġa Ġquery Ġstring Ġfrom Ġthe Ġprovided ĊĠĠĠĠ Ġ* Ġmap Ġof Ġkey Ġ-> Ġvalue Ġpairs Ġe . g . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġkey = value & key 2 = value 2 ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġquery ĠThe Ġquery Ġkey Ġ-> Ġvalue Ġpairs ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġresulting Ġquery Ġstring ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Query ( query : ĠMap < String , ĠAny ?> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġquery . entries . forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( builder . isNotEmpty ()) Ġbuilder . append ('& ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( URL Encoder . encode ( key , ĠChar sets . UTF _ 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUnsupported EncodingException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error (" Unexpected Ġexception Ġbuilding Ġquery Ġstring ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (' =') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( URL Encoder . encode ( value . toString (), ĠChar sets . UTF _ 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUnsupported EncodingException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error (" Unexpected Ġexception Ġbuilding Ġquery Ġstring ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . toString () ĊĠĠĠ Ġ} Ċ }