package Ġcom . hex agon kt . http . server Ċ Ċ import Ġcom . hex agon kt . http . Cookie Ċ import Ġcom . hex agon kt . http . Method Ċ import Ġcom . hex agon kt . http . Part Ċ import Ġcom . hex agon kt . serialization . Serialization Format Ċ import Ġcom . hex agon kt . serialization . Serialization Manager Ċ import Ġcom . hex agon kt . serialization . Serialization Manager . require Default Format Ċ import Ġcom . hex agon kt . serialization . parse Ċ import Ġcom . hex agon kt . serialization . parse Objects Ċ import Ġjava . security . cert . X 5 0 9 Certificate Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠLists Ġwould Ġbe Ġinitialized Ġloading Ġall Ġelements Ġwhen Ġthey Ġare Ġused Ġ( set Ġit Ġas Ġlazy Ġin Ċ Ġ* Ġimplementations ) Ġthis Ġwill Ġhave Ġa Ġperformance Ġpenalty Ġin Ġfavor Ġof Ġease Ġof Ġuse . ĠThe Ġalternative Ċ Ġ* Ġwould Ġbe Ġusing Ġa Ġ' Map / List Ġwrapper Ġthat Ġdeleg ates Ġcalls Ġto Ġabstract Ġmethods Ġin Ġthe Ġinterface Ċ Ġ* Ġ( I Ġwon 't Ġdo Ġthis Ġjust Ġnow ). Ċ Ġ* Ċ Ġ* ĠHTTP Ġrequest Ġcontext . ĠIt Ġholds Ġclient Ġsupplied Ġdata Ġand Ġmethods Ġto Ġchange Ġthe Ġresponse . Ċ Ġ*/ Ċ class ĠRequest ( adapter : ĠRequest Port ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġthe ĠHTTP Ġmethod Ġof Ġthe Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġmethod : ĠMethod Ġby Ġlazy Ġ{ Ġadapter . method () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġthe Ġname Ġof Ġthe Ġscheme Ġused Ġto Ġmake Ġthis Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġscheme : ĠString Ġby Ġlazy Ġ{ Ġadapter . scheme () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġthe Ġfully Ġqualified Ġname Ġof Ġthe Ġclient . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġhost : ĠString Ġby Ġlazy Ġ{ Ġadapter . host () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġthe Ġclient ĠIP Ġaddress . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġip : ĠString Ġby Ġlazy Ġ{ Ġadapter . ip () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġthe Ġport Ġnumber Ġused Ġto Ġmake Ġthe Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġport : ĠInt Ġby Ġlazy Ġ{ Ġadapter . port () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġthe Ġservlet Ġpath Ġof Ġthe Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġpath : ĠString Ġby Ġlazy Ġ{ Ġadapter . path () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġthe Ġquery Ġstring Ġof Ġthe Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval ĠqueryString : ĠString Ġby Ġlazy Ġ{ Ġadapter . queryString () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġthe ĠURL Ġclient Ġused Ġto Ġmake Ġthe Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġurl : ĠString Ġby Ġlazy Ġ{ Ġadapter . url () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġa Ġ[ Map ] Ġof Ġmultipart Ġparts Ġin Ġthe Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġparts : ĠMap < String , ĠPart > Ġby Ġlazy Ġ{ Ġadapter . parts () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġ[ Map ] Ġof Ġparsed Ġkey - value Ġpairs Ġof Ġquery Ġparameters Ġin Ġthe Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġquery Parameters Values : ĠMap < String , ĠList < String >> Ġby Ġlazy Ġ{ Ġadapter . query Parameters () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġ[ Map ] Ġof Ġrequest Ġparameters Ġcontained Ġin Ġform Ġfields . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġform Parameters Values : ĠMap < String , ĠList < String >> Ġby Ġlazy Ġ{ Ġadapter . form Parameters () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġa Ġ[ Map ] Ġof Ġfirst Ġvalues Ġof Ġall Ġquery Ġparameters Ġin Ġthe Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġquery Parameters : ĠMap < String , ĠString > Ġby Ġlazy Ġ{ Ġfirst s ( query Parameters Values ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġa Ġ[ Map ] Ġof Ġfirst Ġvalues Ġof Ġall Ġform Ġfields . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġform Parameters : ĠMap < String , ĠString > Ġby Ġlazy Ġ{ Ġfirst s ( form Parameters Values ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġa Ġ[ Map ] Ġof Ġall Ġpath Ġparameters . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġpath Parameters : ĠMap < String , ĠString > Ġby Ġlazy Ġ{ Ġadapter . path Parameters () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġa Ġ[ List ] Ġof Ġcertificate Ġchain Ġused Ġfor ĠSSL . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcertificate Chain : ĠList < X 5 0 9 Certificate > Ġby Ġlazy Ġ{ Ġadapter . certificate Chain () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġthe Ġrequest Ġis Ġsecure . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsecure : ĠBoolean Ġby Ġlazy Ġ{ Ġscheme Ġ== Ġ" https " Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ List ] Ġof Ġparameters Ġfor Ġ" Accept " Ġheader Ġkey . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġaccept Values : ĠList < String > Ġby Ġlazy Ġ{ Ġheaders Values [" Accept "] Ġ?: Ġempty List () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFirst Ġvalue Ġin Ġ" Accept " Ġheader Ġkey . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġaccept : ĠString ? Ġby Ġlazy Ġ{ Ġaccept Values . first OrNull () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠP referred Ġcontent - type Ġspecified Ġunder Ġ" Accept " Ġheader Ġkey . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġpreferred Type : ĠString ? Ġby Ġlazy Ġ{ Ġaccept Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFirst Ġvalue Ġof Ġ" User - Agent " Ġheader Ġkey . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġuser Agent : ĠString ? Ġby Ġlazy Ġ{ Ġheaders Values [" User - Agent "] ?. first OrNull () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFirst Ġvalue Ġof Ġ" Refer er " Ġheader Ġkey . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġrefer er : ĠString ? Ġby Ġlazy Ġ{ Ġheaders Values [" Refer er "] ?. first OrNull () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFirst Ġvalue Ġof Ġ" Origin " Ġheader Ġkey . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġorigin : ĠString ? Ġby Ġlazy Ġ{ Ġheaders Values [" Origin "] ?. first OrNull () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFirst Ġcertificate Ġin Ġthe Ġ[ certificate Chain ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcertificate : ĠX 5 0 9 Certificate ? Ġby Ġlazy Ġ{ Ġcertificate Chain . first OrNull () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequest Ġbody Ġsent Ġby Ġthe Ġclient . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġbody : ĠString Ġby Ġlazy Ġ{ Ġadapter . load Body () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ Map ] Ġof Ġheader Ġvalues Ġof Ġthe Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġheaders Values : ĠMap < String , ĠList < String >> Ġby Ġlazy Ġ{ Ġadapter . headers () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ Map ] Ġof Ġfirst Ġvalues Ġof Ġthe Ġheaders Ġof Ġthe Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġheaders : ĠMap < String , ĠString > Ġby Ġlazy Ġ{ Ġfirst s ( headers Values ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ Map ] Ġof Ġthe Ġcookies Ġcontained Ġin Ġthe Ġbrowser . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcookies : ĠMap < String , ĠCookie > Ġby Ġlazy Ġ{ Ġadapter . cookies () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠContent Ġtype Ġof Ġthe Ġrequest Ġbody . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval ĠcontentType : ĠString ? Ġby Ġlazy Ġ{ Ġadapter . contentType () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLength Ġof Ġthe Ġrequest Ġbody . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcontent Length : ĠLong Ġby Ġlazy Ġ{ Ġadapter . content Length () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParses Ġrequest Ġbody Ġaccording Ġto Ġgiven Ġ[ type ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtype ĠClass Ġspecifying Ġthe Ġtype Ġto Ġwhich Ġthe Ġbody Ġis Ġto Ġbe Ġparsed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġbody ( type : ĠK Class < T >): ĠT Ġ= Ġbody . parse ( type , Ġrequest Format ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParses Ġrequest Ġbody Ġobjects Ġto Ġgiven Ġ[ type ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtype ĠClass Ġspecifying Ġthe Ġtype Ġto Ġwhich Ġthe Ġobjects Ġare Ġto Ġbe Ġparsed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġbody Objects ( type : ĠK Class < T >): ĠList < T > Ġ= Ġbody . parse Objects ( type , Ġrequest Format ()) ĊĊĠĠĠ Ġ/** ĠParses Ġrequest Ġbody . Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġbody (): ĠT Ġ= Ġbody ( T :: class ) ĊĊĠĠĠ Ġ/** ĠParses Ġrequest Ġbody Ġobjects . Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġbody Objects (): ĠList < T > Ġ= Ġbody Objects ( T :: class ) ĊĊĠĠĠ Ġinternal Ġfun Ġrequest Type (): ĠString Ġ= ĊĠĠĠĠĠĠĠ ĠcontentType Ġ?: Ġrequire Default Format (). contentType ĊĊĠĠĠ Ġinternal Ġfun Ġrequest Format (): ĠSerialization Format Ġ= ĊĠĠĠĠĠĠĠ ĠSerialization Manager . format Of ( request Type ()) ĊĊĠĠĠ Ġprivate Ġfun Ġ< K , ĠV > Ġfirst s ( map : ĠMap < K , ĠList < V >> ): ĠMap < K , ĠV > Ġ= ĊĠĠĠĠĠĠĠ Ġmap . map Values Ġ{ Ġit . value . first () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAg greg ates Ġpath Ġparameters , Ġform Ġparameters Ġand Ġquery Ġparameters Ġinto Ġa Ġmap . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġobject Ġof Ġtype ĠT Ġ Ġ( eg : ĠMy Custom Data Class ()). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġall Parameters (): ĠMap < String , ĠAny > Ġ= ĊĠĠĠĠĠĠĠ Ġtransform Values ( this . form Parameters Values ) Ġ+ ĊĠĠĠĠĠĠĠ Ġtransform Values ( this . query Parameters Values ) Ġ+ ĊĠĠĠĠĠĠĠ Ġthis . path Parameters ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFunction Ġwill Ġcheck Ġthe Ġlist Ġof Ġvalues Ġagainst Ġeach Ġkey . ĠReturns Ġthe Ġvalue Ġalone Ġif Ġthe Ġlist ĊĠĠĠĠ Ġ* Ġsize Ġis Ġ 1 Ġelse Ġreturns Ġthe Ġentire Ġlist Ġas Ġis . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġstring ToList Map Ġ: ĠMap < String , List < String >> Ġtype ĊĠĠĠĠ Ġ* Ġ@ return Ġstring To Any Map Ġ: ĠMap < String , Any > Ġtype ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġtransform Values ( string ToList Map : ĠMap < String , ĠList < String >> ): ĠMap < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstring To Any Map Ġ= Ġmutable Map Of < String , ĠAny >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( query Parameter Ġin Ġstring ToList Map . entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue : ĠAny Ġ= Ġwhen Ġ( query Parameter . value . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġquery Parameter . value . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġquery Parameter . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring To Any Map [ query Parameter . key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġstring To Any Map ĊĠĠĠ Ġ} Ċ } Ċ