package Ġcom . so y wiz . kor io . net . http Ċ Ċ import Ġcom . so y wiz . k ds .* Ċ import Ġcom . so y wiz . kor io . async .* Ċ import Ġcom . so y wiz . kor io . compression . def late . GZIP Ċ import Ġcom . so y wiz . kor io . compression . un compressed Ċ import Ġcom . so y wiz . kor io . concurrent . atomic .* Ċ import Ġcom . so y wiz . kor io . lang .* Ċ import Ġcom . so y wiz . kor io . net .* Ċ import Ġcom . so y wiz . kor io . serialization . json .* Ċ import Ġcom . so y wiz . kor io . stream .* Ċ import Ġkotlinx . coroutines .* Ċ Ċ abstract Ġclass ĠHttpClient Ġprotected Ġconstructor () Ġ{ Ċ ĉ var Ġignore Ssl Certificates Ġ= Ġfalse ĊĊ ĉ protected Ġabstract Ġsuspend Ġfun Ġrequest Internal ( Ċĉ ĉ method : ĠHttp . Method , Ċĉ ĉ url : ĠString , Ċĉ ĉ headers : ĠHttp . Headers Ġ= ĠHttp . Headers (), Ċĉ ĉ content : ĠAsync Stream ? Ġ= Ġnull Ċ ĉ ): ĠResponse ĊĊ ĉ data Ġclass ĠResponse ( Ċĉ ĉ val Ġstatus : ĠInt , Ċĉ ĉ val Ġstatus Text : ĠString , Ċĉ ĉ val Ġheaders : ĠHttp . Headers , Ċĉ ĉ val Ġraw Content : ĠAsync InputStream , ĊĠĠĠĠĠĠĠ Ġval Ġcontent : ĠAsync InputStream Ċ ĉ ) Ġ{ Ċĉ ĉ val Ġsuccess Ġ= Ġstatus Ġ< Ġ 4 0 0 ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Ġoperator Ġfun Ġinvoke ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Text : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders : ĠHttp . Headers , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Content : ĠAsync InputStream , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Encoding Ġ= Ġ( headers [" Content - Encoding "] Ġ?: Ġ""). lowercase (). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResponse ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Content , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( content Encoding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" Ġ-> Ġraw Content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" gzip " Ġ-> Ġraw Content . un compressed ( GZIP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unsupported ĠContent - Encoding Ġ'$ content Encoding '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĉ ĉ suspend Ġfun Ġread All Bytes (): ĠByteArray Ġ{ Ċĉĉ ĉ // println ( content ) Ċĉĉ ĉ val Ġall Content Ġ= Ġcontent . read All () Ċĉĉ ĉ // println (" Response . read All Bytes :" Ġ+ Ġall Content ) Ċĉĉ ĉ // Debugger . enter Debugger () Ċĉĉ ĉ return Ġall Content Ċĉ ĉ } ĊĊĉ ĉ val Ġresponse Charset Ġby Ġlazy Ġ{ Ċĉĉ ĉ // Ġ@ TODO : ĠDetect Ġcharset Ġfrom Ġheaders Ġwith Ġdefault Ġto ĠUTF - 8 Ċĉĉ ĉ UTF 8 Ċĉ ĉ } ĊĊĉ ĉ suspend Ġfun Ġread All String ( charset : ĠCharset Ġ= Ġresponse Charset ): ĠString Ġ{ Ċĉĉ ĉ val Ġbytes Ġ= Ġread All Bytes () Ċĉĉ ĉ // Debugger . enter Debugger () Ċĉĉ ĉ return Ġbytes . toString ( charset ) Ċĉ ĉ } ĊĊĉ ĉ suspend Ġfun Ġcheck Errors (): ĠResponse Ġ= Ġthis . apply Ġ{ Ċĉĉ ĉ if Ġ(! success ) Ġthrow ĠHttp . HttpException ( status , Ġread All String (), Ġstatus Text ) Ċĉ ĉ } ĊĊĉ ĉ fun Ġwith String Response ( str : ĠString , Ġcharset : ĠCharset Ġ= ĠUTF 8 ) Ġ= Ċĉĉ ĉ this . copy ( content Ġ= Ġstr . toByteArray ( charset ). open Async ()) ĊĊĉ ĉ fun Ġ< T > Ġto Completed Response ( content : ĠT ) Ġ= ĠCompleted Response ( status , Ġstatus Text , Ġheaders , Ġcontent ) Ċ ĉ } ĊĊ ĉ data Ġclass ĠCompleted Response < T >( Ċĉ ĉ val Ġstatus : ĠInt , Ċĉ ĉ val Ġstatus Text : ĠString , Ċĉ ĉ val Ġheaders : ĠHttp . Headers , Ċĉ ĉ val Ġcontent : ĠT Ċ ĉ ) Ġ{ Ċĉ ĉ val Ġsuccess Ġ= Ġstatus Ġ< Ġ 4 0 0 Ċ ĉ } ĊĊ ĉ data Ġclass ĠRequest Config ( Ċĉ ĉ val Ġfollow Redirect s : ĠBoolean Ġ= Ġtrue , Ċĉ ĉ val Ġthrow Errors : ĠBoolean Ġ= Ġfalse , Ċĉ ĉ val Ġmax Redirect s : ĠInt Ġ= Ġ 1 0 , Ċĉ ĉ val Ġrefer er : ĠString ? Ġ= Ġnull , Ċĉ ĉ val Ġsimulate Browser : ĠBoolean Ġ= Ġfalse Ċ ĉ ) ĊĊ ĉ private Ġfun Ġmerge Urls ( base : ĠString , Ġappend : ĠString ): ĠString Ġ= ĠURL . resolve ( base , Ġappend ) ĊĊ ĉ suspend Ġfun Ġrequest ( Ċĉ ĉ method : ĠHttp . Method , Ċĉ ĉ url : ĠString , Ċĉ ĉ headers : ĠHttp . Headers Ġ= ĠHttp . Headers (), Ċĉ ĉ content : ĠAsync Stream ? Ġ= Ġnull , Ċĉ ĉ config : ĠRequest Config Ġ= ĠRequest Config () Ċ ĉ ): ĠResponse Ġ{ Ċĉ ĉ // println (" HttpClient . request : Ġ$ method :$ url ") Ċĉ ĉ val Ġcontent Length Ġ= Ġcontent ?. getLength () Ġ?: Ġ 0 L Ċĉ ĉ var Ġactual Headers Ġ= Ġheaders ĊĊĉ ĉ if Ġ( content Ġ!= Ġnull Ġ&& Ġ! headers . any Ġ{ Ġit . first . equals ( Http . Headers . Content Length , Ġignore Case Ġ= Ġtrue ) Ġ}) Ġ{ Ċĉĉ ĉ actual Headers Ġ= Ġactual Headers . with Replace Headers ( Http . Headers . Content Length Ġto Ġ"$ content Length ") Ċĉ ĉ } ĊĊĉ ĉ if Ġ( config . simulate Browser ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Headers Ġ= Ġcombine Headers For Host ( actual Headers , Ġnull ) Ċĉ ĉ } ĊĊĉ ĉ val Ġresponse Ġ= Ċĉĉ ĉ request Internal ( method , Ġurl , Ġactual Headers , Ġcontent ). apply Ġ{ Ġif Ġ( config . throw Errors ) Ġcheck Errors () Ġ} Ċĉ ĉ if Ġ( config . follow Redirect s Ġ&& Ġconfig . max Redirect s Ġ>= Ġ 0 ) Ġ{ Ċĉĉ ĉ val Ġredirect Location Ġ= Ġresponse . headers [" location "] Ċĉĉ ĉ if Ġ( redirect Location Ġ!= Ġnull ) Ġ{ Ċĉĉĉ ĉ return Ġrequest ( Ċĉĉĉĉ ĉ method , Ġmerge Urls ( url , Ġredirect Location ), Ġheaders . with Replace Headers ( Ċĉĉĉĉĉ ĉ " Refer er " Ġto Ġurl Ċĉĉĉĉ ĉ ), Ġcontent , Ġconfig . copy ( max Redirect s Ġ= Ġconfig . max Redirect s Ġ- Ġ 1 ) Ċĉĉĉ ĉ ) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġresponse Ċ ĉ } ĊĊ ĉ suspend Ġfun Ġrequest AsString ( Ċĉ ĉ method : ĠHttp . Method , Ċĉ ĉ url : ĠString , Ċĉ ĉ headers : ĠHttp . Headers Ġ= ĠHttp . Headers (), Ċĉ ĉ content : ĠAsync Stream ? Ġ= Ġnull , Ċĉ ĉ config : ĠRequest Config Ġ= ĠRequest Config () Ċ ĉ ): ĠCompleted Response < String > Ġ{ Ċĉ ĉ val Ġres Ġ= Ġrequest ( method , Ġurl , Ġheaders , Ġcontent , Ġconfig Ġ= Ġconfig ) Ċĉ ĉ return Ġres . to Completed Response ( res . read All String ()) Ċ ĉ } ĊĊ ĉ suspend Ġfun Ġrequest As Bytes ( Ċĉ ĉ method : ĠHttp . Method , Ċĉ ĉ url : ĠString , Ċĉ ĉ headers : ĠHttp . Headers Ġ= ĠHttp . Headers (), Ċĉ ĉ content : ĠAsync Stream ? Ġ= Ġnull , Ċĉ ĉ config : ĠRequest Config Ġ= ĠRequest Config () Ċ ĉ ): ĠCompleted Response < ByteArray > Ġ{ Ċĉ ĉ val Ġres Ġ= Ġrequest ( method , Ġurl , Ġheaders , Ġcontent , Ġconfig Ġ= Ġconfig ) Ċĉ ĉ return Ġres . to Completed Response ( res . read All Bytes ()) Ċ ĉ } ĊĊ ĉ suspend Ġfun Ġread Bytes ( url : ĠString , Ġconfig : ĠRequest Config Ġ= ĠRequest Config ()): ĠByteArray Ġ= Ċĉ ĉ request As Bytes ( Http . Method . GET , Ġurl , Ġconfig Ġ= Ġconfig . copy ( throw Errors Ġ= Ġtrue )). content ĊĊ ĉ suspend Ġfun Ġread String ( url : ĠString , Ġconfig : ĠRequest Config Ġ= ĠRequest Config ()): ĠString Ġ= Ċĉ ĉ request AsString ( Http . Method . GET , Ġurl , Ġconfig Ġ= Ġconfig . copy ( throw Errors Ġ= Ġtrue )). content ĊĊ ĉ suspend Ġfun Ġread Json ( url : ĠString , Ġconfig : ĠRequest Config Ġ= ĠRequest Config ()): ĠAny ? Ġ= Ċĉ ĉ Json . parse ( request AsString ( Http . Method . GET , Ġurl , Ġconfig Ġ= Ġconfig . copy ( throw Errors Ġ= Ġtrue )). content ) ĊĊ ĉ comp anion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ USER _ AGENT Ġ= Ġ" Mozilla / 5 . 0 Ġ( Windows ĠNT Ġ 1 0 . 0 ; ĠWin 6 4 ; Ġx 6 4 ) ĠAppleWebKit / 5 3 7 . 3 6 Ġ( KHTML , Ġlike ĠGecko ) ĠChrome / 5 8 . 0 . 3 0 2 9 . 8 1 ĠSafari / 5 3 7 . 3 6 " ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ ACCEPT Ġ= Ġ" text / html , application / xhtml + xml , application / xml ; q = 0 . 9 , image / webp ,* /* ; q = 0 . 8 " ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ LANGUAGE Ġ= Ġ" en - us " ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ ENCODING Ġ= Ġ" gzip , Ġdef late " ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ CONNECTION Ġ= Ġ" Close " ĊĊĠĠĠĠĠĠĠ Ġfun Ġcombine Headers For Host ( headers : ĠHttp . Headers , Ġhost : ĠString ?): ĠHttp . Headers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠHttp . Headers ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" User - Agent " Ġto ĠDEFAULT _ USER _ AGENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Accept " Ġto ĠDEFAULT _ ACCEPT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Accept - Language " Ġto ĠDEFAULT _ LANGUAGE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Accept - Encoding " Ġto ĠDEFAULT _ ENCODING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Connection " Ġto ĠDEFAULT _ CONNECTION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). with Replace Headers ( headers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( host Ġ!= Ġnull ) Ġout . with Replace Headers (" Host " Ġto Ġhost ) Ġelse Ġout ĊĠĠĠĠĠĠĠ Ġ} ĊĊĉ ĉ operator Ġfun Ġinvoke () Ġ= Ġdefault Http Factory . create Client () Ċ ĉ } Ċ } Ċ Ċ open Ġclass ĠDelay ed HttpClient ( val Ġdelay Ms : ĠLong , Ġval Ġparent : ĠHttpClient ) Ġ: ĠHttpClient () Ġ{ Ċ ĉ private Ġval Ġqueue Ġ= ĠAsync Thread () ĊĊ ĉ override Ġsuspend Ġfun Ġrequest Internal ( Ċĉ ĉ method : ĠHttp . Method , Ċĉ ĉ url : ĠString , Ċĉ ĉ headers : ĠHttp . Headers , Ċĉ ĉ content : ĠAsync Stream ? Ċ ĉ ): ĠResponse Ġ= Ġqueue Ġ{ Ċĉ ĉ println (" Waiting Ġ$ delay Ms Ġmilliseconds Ġfor Ġ$ url ...") Ċĉ ĉ delay ( delay Ms ) Ċĉ ĉ parent . request ( method , Ġurl , Ġheaders , Ġcontent ) Ċ ĉ } Ċ } Ċ Ċ fun ĠHttpClient . delayed ( ms : ĠLong ) Ġ= ĠDelay ed HttpClient ( ms , Ġthis ) Ċ Ċ class ĠFake HttpClient ( val Ġredirect : ĠHttpClient ? Ġ= Ġnull ) Ġ: ĠHttpClient () Ġ{ Ċ ĉ val Ġlog Ġ= Ġarray ListOf < String >() ĊĠĠĠ Ġprivate Ġval Ġdefault Content Ġ= Ġ" Log HttpClient . response ". toByteArray ( UTF 8 ). open Async () Ċ ĉ var Ġdefault Response Ġ= Ċĉ ĉ HttpClient . Response ( 2 0 0 , Ġ" OK ", ĠHttp . Headers (), Ġdefault Content , Ġdefault Content ) Ċ ĉ private Ġval Ġrules Ġ= ĠLinkedHashMap < Rule , ĠArrayList < Response Builder >>() ĊĊ ĉ override Ġsuspend Ġfun Ġrequest Internal ( Ċĉ ĉ method : ĠHttp . Method , Ċĉ ĉ url : ĠString , Ċĉ ĉ headers : ĠHttp . Headers , Ċĉ ĉ content : ĠAsync Stream ? Ċ ĉ ): ĠResponse Ġ{ Ċĉ ĉ val Ġcontent String Ġ= Ġcontent ?. slice Start ()?. read All ()?. toString ( UTF 8 ) Ċĉ ĉ val Ġrequest Number Ġ= Ġlog . size Ċĉ ĉ log Ġ+= Ġ"$ method , Ġ$ url , Ġ$ headers , Ġ$ content String " Ċĉ ĉ if Ġ( redirect Ġ!= Ġnull ) Ġreturn Ġredirect . request ( method , Ġurl , Ġheaders , Ġcontent ) Ċĉ ĉ val Ġre aded Content Ġ= Ġcontent ?. read All () Ċĉ ĉ val Ġmatched Rules Ġ= Ġrules . entries . reversed (). filter Ġ{ Ġit . key . matches ( method , Ġurl , Ġheaders , Ġre aded Content ) Ġ} Ċĉ ĉ val Ġrule Ġ= Ġmatched Rules . first OrNull () Ċĉ ĉ return Ġrule ?. value ?. getC yc lic ( request Number )?. build Response () Ġ?: Ġdefault Response Ċ ĉ } ĊĊ ĉ class ĠResponse Builder Ġ{ Ċĉ ĉ private Ġvar Ġresponse Code Ġ= Ġ 2 0 0 Ċĉ ĉ private Ġvar Ġresponse Content Ġ= Ġ" Log HttpClient . response ". toByteArray ( UTF 8 ) Ċĉ ĉ private Ġvar Ġresponse Headers Ġ= ĠHttp . Headers () ĊĊĉ ĉ fun Ġresponse ( content : ĠString , Ġcode : ĠInt Ġ= Ġ 2 0 0 , Ġcharset : ĠCharset Ġ= ĠUTF 8 ) Ġ= Ġthis . apply Ġ{ Ċĉĉ ĉ response Code Ġ= Ġcode Ċĉĉ ĉ response Content Ġ= Ġcontent . toByteArray ( charset ) Ċĉ ĉ } ĊĊĉ ĉ fun Ġresponse ( content : ĠByteArray , Ġcode : ĠInt Ġ= Ġ 2 0 0 ) Ġ= Ġthis . apply Ġ{ Ċĉĉ ĉ response Code Ġ= Ġcode Ċĉĉ ĉ response Content Ġ= Ġcontent Ċĉ ĉ } ĊĊĉ ĉ fun Ġredirect ( url : ĠString , Ġcode : ĠInt Ġ= Ġ 3 0 2 ) Ġ= Ġthis . apply Ġ{ Ċĉĉ ĉ response Code Ġ= Ġcode Ċĉĉ ĉ response Headers Ġ+= ĠHttp . Headers (" Location " Ġto Ġurl ) Ċĉ ĉ } ĊĊĠĠĠĠĠĠĠ Ġfun Ġheader ( key : ĠString , Ġvalue : ĠAny ) Ġ= Ġthis . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Headers Ġ+= ĠHttp . Headers ( key Ġto Ġ"$ value ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġheaders ( headers : ĠHttp . Headers ) Ġ= Ġthis . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Headers Ġ+= Ġheaders ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġok ( content : ĠString ) Ġ= Ġresponse ( content , Ġcode Ġ= Ġ 2 0 0 ) ĊĠĠĠĠĠĠĠ Ġfun Ġok ( content : ĠByteArray ) Ġ= Ġresponse ( content , Ġcode Ġ= Ġ 2 0 0 ) Ċĉ ĉ fun Ġnot Found ( content : ĠString Ġ= Ġ" 4 0 4 Ġ- ĠNot ĠFound ") Ġ= Ġresponse ( content , Ġcode Ġ= Ġ 4 0 4 ) Ċĉ ĉ fun Ġinternal ServerError ( content : ĠString Ġ= Ġ" 5 0 0 Ġ- ĠInternal ĠServer ĠError ") Ġ= Ġresponse ( content , Ġcode Ġ= Ġ 5 0 0 ) ĊĊĉ ĉ internal Ġsuspend Ġfun Ġbuild Response () Ġ= ĠHttpClient . Response ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Code , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatus Message ( response Code ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Headers , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Content . open Async () ĊĠĠĠĠĠĠĠ Ġ) Ċ ĉ } ĊĊ ĉ data Ġclass ĠRule ( Ċĉ ĉ val Ġmethod : ĠHttp . Method ?, Ċĉ ĉ val Ġurl : ĠString ? Ġ= Ġnull , Ċĉ ĉ val Ġheaders : ĠHttp . Headers ? Ġ= Ġnull Ċ ĉ ) Ġ{ Ċĉ ĉ fun Ġmatches ( method : ĠHttp . Method , Ġurl : ĠString , Ġheaders : ĠHttp . Headers , Ġcontent : ĠByteArray ?): ĠBoolean Ġ{ Ċĉĉ ĉ if Ġ( this . method Ġ!= Ġnull Ġ&& Ġthis . method Ġ!= Ġmethod ) Ġreturn Ġfalse Ċĉĉ ĉ if Ġ( this . url Ġ!= Ġnull Ġ&& Ġthis . url Ġ!= Ġurl ) Ġreturn Ġfalse Ċĉĉ ĉ if Ġ( this . headers Ġ!= Ġnull Ġ&& Ġ! headers . contains All ( this . headers )) Ġreturn Ġfalse Ċĉĉ ĉ return Ġtrue Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġon Request ( Ċĉ ĉ method : ĠHttp . Method ? Ġ= Ġnull , Ċĉ ĉ url : ĠString ? Ġ= Ġnull , Ċĉ ĉ headers : ĠHttp . Headers ? Ġ= Ġnull Ċ ĉ ): ĠResponse Builder Ġ{ Ċĉ ĉ val Ġresponse Builders Ġ= Ġrules . get Or Put ( Rule ( method , Ġurl , Ġheaders )) Ġ{ Ġarray ListOf () Ġ} Ċĉ ĉ val Ġresponse Builder Ġ= ĠResponse Builder () Ċĉ ĉ response Builders Ġ+= Ġresponse Builder Ċĉ ĉ return Ġresponse Builder Ċ ĉ } ĊĊ ĉ fun Ġget And Clear Log () Ġ= Ġlog . toList (). apply Ġ{ Ġlog . clear () Ġ} Ċ } Ċ Ċ fun ĠLog HttpClient () Ġ= ĠFake HttpClient () Ċ Ċ object ĠHttpStatus Message Ġ{ Ċ ĉ val ĠCODE S Ġ= Ġlinked Map Of ( Ċĉĉ 1 0 0 Ġto Ġ" Continue ", Ċĉĉ 1 0 1 Ġto Ġ" Switch ing ĠProto cols ", Ċĉĉ 2 0 0 Ġto Ġ" OK ", Ċĉĉ 2 0 1 Ġto Ġ" Created ", Ċĉĉ 2 0 2 Ġto Ġ" Accepted ", Ċĉĉ 2 0 3 Ġto Ġ" Non - Author itative ĠInformation ", Ċĉĉ 2 0 4 Ġto Ġ" No ĠContent ", Ċĉĉ 2 0 5 Ġto Ġ" Reset ĠContent ", Ċĉĉ 2 0 6 Ġto Ġ" Partial ĠContent ", Ċĉĉ 3 0 0 Ġto Ġ" Multiple ĠCho ices ", Ċĉĉ 3 0 1 Ġto Ġ" Moved ĠPer manently ", Ċĉĉ 3 0 2 Ġto Ġ" Found ", Ċĉĉ 3 0 3 Ġto Ġ" See ĠOther ", Ċĉĉ 3 0 4 Ġto Ġ" Not ĠModified ", Ċĉĉ 3 0 5 Ġto Ġ" Use ĠProxy ", Ċĉĉ 3 0 7 Ġto Ġ" Temporary ĠRedirect ", Ċĉĉ 4 0 0 Ġto Ġ" Bad ĠRequest ", Ċĉĉ 4 0 1 Ġto Ġ" Unauthorized ", Ċĉĉ 4 0 2 Ġto Ġ" Payment ĠRequired ", Ċĉĉ 4 0 3 Ġto Ġ" Forbidden ", Ċĉĉ 4 0 4 Ġto Ġ" Not ĠFound ", Ċĉĉ 4 0 5 Ġto Ġ" Method ĠNot ĠAllowed ", Ċĉĉ 4 0 6 Ġto Ġ" Not ĠAccept able ", Ċĉĉ 4 0 7 Ġto Ġ" Proxy ĠAuthentication ĠRequired ", Ċĉĉ 4 0 8 Ġto Ġ" Request ĠTimeout ", Ċĉĉ 4 0 9 Ġto Ġ" Conflict ", Ċĉĉ 4 1 0 Ġto Ġ" G one ", Ċĉĉ 4 1 1 Ġto Ġ" Length ĠRequired ", Ċĉĉ 4 1 2 Ġto Ġ" Precondition ĠFailed ", Ċĉĉ 4 1 3 Ġto Ġ" Request ĠEntity ĠToo ĠLarge ", Ċĉĉ 4 1 4 Ġto Ġ" Request - URI ĠToo ĠLong ", Ċĉĉ 4 1 5 Ġto Ġ" Unsupported ĠMedia ĠType ", Ċĉĉ 4 1 6 Ġto Ġ" Requested ĠRange ĠNot ĠS atisf iable ", Ċĉĉ 4 1 7 Ġto Ġ" Expectation ĠFailed ", Ċĉĉ 4 1 8 Ġto Ġ" I 'm Ġa Ġte ap ot ", Ċĉĉ 4 2 2 Ġto Ġ" Un process able ĠEntity Ġ( Web D AV Ġ- ĠRFC Ġ 4 9 1 8 )", Ċĉĉ 4 2 3 Ġto Ġ" Locked Ġ( Web D AV Ġ- ĠRFC Ġ 4 9 1 8 )", Ċĉĉ 4 2 4 Ġto Ġ" Failed ĠDependency Ġ( Web D AV ) Ġ( RFC Ġ 4 9 1 8 )", Ċĉĉ 4 2 5 Ġto Ġ" Un assigned ", Ċĉĉ 4 2 6 Ġto Ġ" Upgrade ĠRequired Ġ( RFC Ġ 7 2 3 1 )", Ċĉĉ 4 2 8 Ġto Ġ" Precondition ĠRequired ", Ċĉĉ 4 2 9 Ġto Ġ" Too ĠMany ĠRequests ", Ċĉĉ 4 3 1 Ġto Ġ" Request ĠHeader ĠF iled s ĠToo ĠLarge )", Ċĉĉ 4 4 9 Ġto Ġ" Error 4 4 9 ", Ċĉĉ 4 5 1 Ġto Ġ" Unavailable Ġfor ĠLeg al ĠRe asons ", Ċĉĉ 5 0 0 Ġto Ġ" Internal ĠServer ĠError ", Ċĉĉ 5 0 1 Ġto Ġ" Not ĠImplemented ", Ċĉĉ 5 0 2 Ġto Ġ" Bad ĠGateway ", Ċĉĉ 5 0 3 Ġto Ġ" Service ĠUn available ", Ċĉĉ 5 0 4 Ġto Ġ" Gateway ĠTimeout ", Ċĉĉ 5 0 5 Ġto Ġ" HTTP ĠVersion ĠNot ĠSupported ", Ċĉĉ 5 0 6 Ġto Ġ" Variant ĠAlso ĠNeg oti ates Ġ( RFC Ġ 2 2 9 5 )", Ċĉĉ 5 0 7 Ġto Ġ" Ins ufficient ĠStorage Ġ( Web D AV Ġ- ĠRFC Ġ 4 9 1 8 )", Ċĉĉ 5 0 8 Ġto Ġ" Loop ĠDet ected Ġ( Web D AV )", Ċĉĉ 5 0 9 Ġto Ġ" Bandwidth ĠLimit ĠEx ceeded ", Ċĉĉ 5 1 0 Ġto Ġ" Not ĠExtended Ġ( RFC Ġ 2 7 7 4 )", Ċĉĉ 5 1 1 Ġto Ġ" Network ĠAuthentication ĠRequired " Ċ ĉ ) ĊĊ ĉ operator Ġfun Ġinvoke ( code : ĠInt ) Ġ= ĠCODE S . getOrElse ( code ) Ġ{ Ġ" Error $ code " Ġ} Ċ } Ċ Ċ object ĠHttp Stats Ġ{ Ċ ĉ val Ġconnections Ġ= Ġkor Atomic ( 0 L ) Ċ ĉ val Ġdis connections Ġ= Ġkor Atomic ( 0 L ) ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ġ" Http Stats ( connections =$ connections , ĠDis connections =$ dis connections )" Ċ } Ċ Ċ interface ĠHttp Factory Ġ{ Ċ ĉ fun Ġcreate Client (): ĠHttpClient Ċ ĉ fun Ġcreate Server (): ĠHttp Server Ċ } Ċ Ċ class ĠPro x ied Http Factory ( var Ġparent : ĠHttp Factory ) Ġ: ĠHttp Factory Ġby Ġparent Ċ Ċ internal Ġval Ġ_ default Http Factory : ĠPro x ied Http Factory Ġby Ġlazy Ġ{ ĠPro x ied Http Factory ( http Factory ) Ġ} Ċ val Ġdefault Http Factory : ĠHttp Factory Ġget () Ġ= Ġ_ default Http Factory Ċ Ċ internal Ġexpect Ġval Ġhttp Factory : ĠHttp Factory Ċ Ċ fun ĠsetDefault Http Factory ( factory : ĠHttp Factory ) Ġ{ Ċ ĉ _ default Http Factory . parent Ġ= Ġfactory Ċ } Ċ Ċ fun ĠHttp Factory . create Client Endpoint ( endpoint : ĠString ) Ġ= Ġcreate Client (). endpoint ( endpoint ) Ċ Ċ fun Ġcreate HttpClient () Ġ= Ġdefault Http Factory . create Client () Ċ fun Ġcreate HttpServer () Ġ= Ġdefault Http Factory . create Server () Ċ fun Ġcreate HttpClient Endpoint ( endpoint : ĠString ) Ġ= Ġcreate HttpClient (). endpoint ( endpoint ) Ċ Ċ fun Ġhttp Error ( code : ĠInt , Ġmsg : ĠString ): ĠNothing Ġ= Ġthrow ĠHttp . HttpException ( code , Ġmsg ) Ċ