package Ġcom . and ref il gs . show me . send ers . http Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . and ref il gs . file man . aux iliar . or Default Ċ import Ġcom . and ref il gs . show me . Log cat Type Ċ import Ġkotlinx . coroutines . Deferred Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . async Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . net . Malformed URLException Ċ import Ġjava . net . URL Ċ import Ġjava . nio . charset . StandardCharsets Ċ Ċ internal Ġclass ĠShow Me Http Ġ{ ĊĊĠ Ġcompanion Ġobject { ĊĊĠĠĠ Ġvar Ġshow Logs : Boolean = false ĊĊĠĠĠ Ġconst Ġval ĠTIME OUT Ġ: Int Ġ= Ġ 5 0 0 0 ĊĠĠĠ Ġconst Ġval ĠCONNECT _ TIMEOUT Ġ: ĠInt Ġ= Ġ 5 0 0 0 ĊĠĠĠ Ġconst Ġval ĠUSE _ CACHE Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Show Me - Http " ĊĊĊĠĠĠ Ġprivate Ġfun Ġlog ( log cat Type : ĠLog cat Type ?= Log cat Type . VERBOSE , Ġlog Content : String , Ġshow Log : Boolean ?= show Logs ){ ĊĠĠĠĠĠ Ġif ( show Log . or Default ()){ ĊĠĠĠĠĠĠĠ Ġwhen ( log cat Type ){ ĊĠĠĠĠĠĠĠĠĠ ĠLog cat Type . VERBOSE Ġ-> ĠLog . v ( TAG , Ġlog Content ) ĊĠĠĠĠĠĠĠĠĠ ĠLog cat Type . DEBUG Ġ-> ĠLog . d ( TAG , Ġlog Content ) ĊĠĠĠĠĠĠĠĠĠ ĠLog cat Type . INFO Ġ-> ĠLog . i ( TAG , Ġlog Content ) ĊĠĠĠĠĠĠĠĠĠ ĠLog cat Type . WARNING Ġ-> ĠLog . w ( TAG , Ġlog Content ) ĊĠĠĠĠĠĠĠĠĠ ĠLog cat Type . ERROR Ġ-> ĠLog . e ( TAG , Ġlog Content ) ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLog . v ( TAG , Ġlog Content ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġnew ĠURL Ġobject Ġfrom Ġthe Ġgiven ĠURL Ġstring ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcreate Url ( string Url : ĠString ?, Ġshow Log : ĠBoolean ?= null ): ĠURL ? Ġ{ ĊĠĠĠĠĠ Ġvar Ġurl : ĠURL ? Ġ= Ġnull ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġurl Ġ= ĠURL ( string Url ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠMal formed URLException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( Log cat Type . ERROR , Ġ" Problem Ġbuilding Ġthe ĠURL : Ġ${ e . message }", Ġshow Log ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġurl ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġnew ĠURL Ġobject Ġfrom Ġthe Ġgiven ĠURL Ġstring ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġprotocol Ġ Ġ-> Ġhttp :// , Ġhttps :// ĊĠĠĠĠ Ġ* Ġ@ param Ġhost ĠĠĠĠĠ Ġ-> Ġsome host . com / ĊĠĠĠĠ Ġ* Ġ@ param Ġpath ĠĠĠĠĠ Ġ-> Ġv 1 / api Name / ĊĠĠĠĠ Ġ* Ġ@ param Ġarguments Ġ-> ĠA ĠHashMap Ġthat Ġwill Ġproduce Ġthe Ġfollowing Ġconcaten ated Ġstring : Ġ"? key = value & key 2 = value 2 ..." ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Url ( protocol : ĠString ?, Ġhost : ĠString ?, Ġpath : ĠString ?, Ġarguments : ĠMap < String , ĠString >? ): ĠString ? Ġ{ ĊĠĠĠĠĠ Ġif ( protocol Ġ== null Ġ&& Ġhost Ġ== Ġnull Ġ&& Ġpath Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠ Ġvar Ġm Args Ġ= Ġ"" ĊĠĠĠĠĠ Ġif Ġ( arguments Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Args Ġ= Ġ" ?" ĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġarguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠ Ġm Args Ġ= Ġ"$ m Args $ key =$ value & " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Args Ġ= Ġm Args . substring ( 0 , Ġm Args . length Ġ- Ġ 1 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġurl Str Ġ= Ġ"$ protocol $ host ${ path Ġ?: Ġ"" }$ m Args " ĊĠĠĠĠĠ Ġval Ġurl : ĠURL Ġ= Ġcreate Url ( url Str ) Ġ?: Ġreturn Ġnull Ċ // ĠĠĠĠĠ Ġreturn Ġ"$ protocol $ host ${ path Ġ?: Ġ"" }$ m Args " ĊĠĠĠĠĠ Ġreturn Ġurl . toString () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvert Ġ[ InputStream ] Ġinto Ġa Ġstring Ġwhich Ġholds Ġall Ġthe Ġserver Ġresponse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġread From Stream ( inputStream : ĠInputStream ?): ĠString ? Ġ{ ĊĠĠĠĠĠ Ġval Ġoutput Ġ= ĠStringBuilder () ĊĠĠĠĠĠ Ġif Ġ( inputStream Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput StreamReader Ġ= ĠInputStreamReader ( inputStream , ĠStandard Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠBufferedReader ( input StreamReader ) ĊĠĠĠĠĠĠĠ Ġvar Ġline Ġ= Ġreader . readLine () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( line Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġoutput . append ( line ) ĊĠĠĠĠĠĠĠĠĠ Ġline Ġ= Ġreader . readLine () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġoutput . toString () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġmake Request Async ( m Url : ĠString ?, Ġm Method : ĠString ?, Ġm Body : ĠString ?, Ġm Headers : ĠMap < String , ĠString ?> ?, Ġread Timeout : Int ?= ĠTIME OUT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnect Timeout : Int ?= ĠCONNECT _ TIMEOUT , Ġuse Cache : Boolean ?= ĠUSE _ CACHE , Ġshow Log : ĠBoolean ?= null ): ĠDeferred < HttpResponse ?> Ġ{ ĊĠĠĠĠĠ Ġreturn ĠGlobal Scope . async Ġ{ ĊĠĠĠĠĠĠĠ Ġmake Request ( m Url , Ġm Method , Ġm Body , Ġm Headers , Ġread Timeout , Ġconnect Timeout , Ġuse Cache , Ġshow Log ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġmake Request ( m Url : ĠString ?, Ġm Method : ĠString ?, Ġm Body : ĠString ?, Ġm Headers : ĠMap < String , ĠString ?> ?, Ġread Timeout : Int ?= ĠTIME OUT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnect Timeout : Int ?= ĠCONNECT _ TIMEOUT , Ġuse Cache : Boolean ?= ĠUSE _ CACHE , Ġshow Log : ĠBoolean ?= null ): ĠHttpResponse ? Ġ{ ĊĠĠĠĠĠ Ġval ĠhttpResponse Ġ= ĠHttpResponse () ĊĠĠĠĠĠ Ġval Ġurl : ĠURL Ġ= Ġcreate Url ( m Url ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠ Ġ// ĠIf Ġthe ĠURL Ġis Ġnull , Ġthen Ġreturn Ġearly . ĊĠĠĠĠĠ Ġrequire NotNull ( m Url ) Ġ{ Ġ" m URL Ġis Ġnull " Ġ} ĊĠĠĠĠĠ Ġvar Ġurl Connection : ĠHttp URLConnection ? Ġ= Ġnull ĊĠĠĠĠĠ Ġvar ĠinputStream : ĠInputStream ? Ġ= Ġnull ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġurl Connection Ġ= Ġurl . open Connection () Ġas ĠHttp URLConnection ĊĠĠĠĠĠĠĠ Ġurl Connection . read Timeout Ġ= Ġread Timeout Ġ?: ĠTIME OUT ĊĠĠĠĠĠĠĠ Ġurl Connection . connect Timeout Ġ= Ġconnect Timeout Ġ?: ĠCONNECT _ TIMEOUT ĊĠĠĠĠĠĠĠ Ġurl Connection . use Caches Ġ= Ġuse Cache Ġ?: ĠUSE _ CACHE Ġ// using ĠCache Ġis Ġbetter Ġfor Ġproduction ĊĠĠĠĠĠĠĠ Ġurl Connection . request Method Ġ= Ġm Method Ġ// ĠGET , ĠPOST , HEAD , OPTIONS , PUT , DELETE , TRACE ĊĠĠĠĠĠĠĠ Ġurl Connection . setRequest Property (" Accept - Encoding ", Ġ" gzip ") Ġ// http :// www . rg ag non . com / java details / java - Http Url Connection - with - GZIP - encoding . html ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġurl Connection . setRequest Property (" api - key ", ĠK . API _ KEY ); ĊĠĠĠĠĠĠĠ Ġ// Headers ĊĠĠĠĠĠĠĠ Ġif Ġ( m Headers Ġ!= Ġnull Ġ&& Ġm Headers . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġm Headers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Connection . setRequest Property ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Body ĊĠĠĠĠĠĠĠ Ġif Ġ( m Body Ġ!= Ġnull Ġ&& Ġm Body Ġ!= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġos Ġ= Ġurl Connection . output Stream ĊĠĠĠĠĠĠĠĠĠ Ġos . write ( m Body . toByteArray ( charset (" UTF - 8 "))) ĊĠĠĠĠĠĠĠĠĠ Ġos . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġurl Connection . connect () ĊĊĠĠĠĠĠĠĠ Ġ// Headers ĠResponse ĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= Ġurl Connection . header Fields ĊĠĠĠĠĠĠĠ Ġfor Ġ(( header Name , Ġheader Values ) Ġin Ġheaders ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( header Values . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Name ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠhttpResponse . headers ?. set ( it , Ġheader Values [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Header Ġmay Ġhave Ġmultiple Ġvalues Ġwhich Ġare Ġconcaten ated Ġby Ġ";" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// stackoverflow . com / questions / 4 3 2 5 7 4 5 9 / why - does - get header field - return - a - string - where - as - get header fields - return - map ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġar Values Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( value Ġin Ġheader Values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġar Values Ġ= Ġ"$ ar Values $ value ;" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġar Values . substring ( 0 , Ġar Values . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠhttpResponse . headers ?. set ( header Name , Ġar Values ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠinputStream Ġ= Ġurl Connection . inputStream ĊĠĠĠĠĠĠĠ ĠhttpResponse . body Sent Ġ= Ġm Body ĊĠĠĠĠĠĠĠ ĠhttpResponse . body Response Ġ= Ġread From Stream ( inputStream ) ĊĠĠĠĠĠĠĠ ĠhttpResponse . response Code Ġ= Ġurl Connection . response Code . toString () ĊĠĠĠĠĠĠĠ ĠhttpResponse . method Ġ= Ġurl Connection . request Method ĊĠĠĠĠĠĠĠ ĠhttpResponse . url Ġ= Ġurl Connection . url . toString () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( url Connection . response Code Ġin Ġ 2 0 0 .. 2 9 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠhttpResponse . success Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠ ĠhttpResponse . success Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠ Ġlog ( Log cat Type . WARNING , Ġ" HTTP Ġresponse Ġcode : Ġ" Ġ+ Ġurl Connection . response Code , Ġshow Log ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( Log cat Type . ERROR , Ġ" Problem Ġretrieving Ġhttp Ġanswer Ġdue Ġto : Ġ${ e . message }", Ġshow Log ) ĊĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġurl Connection ?. disconnect () ĊĠĠĠĠĠĠĠ ĠinputStream ?. close () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġlog ( Log cat Type . DEBUG , Ġ" Url : Ġ${ url Connection ?. url }\ n Method : Ġ${ httpResponse . method }\ n Http ĠCode Ġ= Ġ${ httpResponse . response Code }\ n Body ĠResponse : Ġ${ httpResponse . body Response }\ n Body ĠSent : Ġ${ httpResponse . body Sent }". trim Indent (), Ġshow Log ) ĊĠĠĠĠĠ Ġreturn ĠhttpResponse ĊĠĠĠ Ġ} ĊĊĠ Ġ} Ċ Ċ } ĊĊĊ Ċ enum Ġclass ĠHTTP _ METHO DS ( val Ġtype : String ){ ĊĠ ĠGET (" GET "), ĊĠ ĠPOST (" POST "), ĊĠ ĠPUT (" PUT "), ĊĠ ĠP ATCH (" PATCH "), ĊĠ ĠDELETE (" DELETE "), Ċ }