package Ġdev . al pas . http . jetty Ċ Ċ import Ġdev . al pas .* Ċ import Ġdev . al pas . exceptions . Method Not Allowed Exception Ċ import Ġdev . al pas . exceptions . NotFound HttpException Ċ import Ġdev . al pas . http . Http Call Ċ import Ġdev . al pas . http . Method Ċ import Ġdev . al pas . http . Static Asset Handler Ċ import Ġdev . al pas . routing . Route Ċ import Ġdev . al pas . routing . Route Match Status Ċ import Ġdev . al pas . routing . Router Ċ import Ġjavax . servlet . http . HttpServlet Ċ import Ġjavax . servlet . http . HttpServletRequest Ċ import Ġjavax . servlet . http . HttpServletResponse Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . full . create Instance Ċ Ċ class ĠA lp as Servlet ( ĊĠĠĠ Ġprivate Ġval Ġapp : ĠApplication , ĊĠĠĠ Ġprivate Ġval Ġroute Entry Middleware Groups : ĠMap < String , ĠIterable < K Class < out ĠMiddleware < Http Call >> >>, ĊĠĠĠ Ġprivate Ġval Ġserver Entry Middleware : ĠIterable < K Class < out ĠMiddleware < Http Call >>> Ċ ) Ġ: ĠHttpServlet () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġstatic Handler Ġby Ġlazy Ġ{ ĠStatic Asset Handler ( app ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġservice ( req : ĠHttpServletRequest , Ġresp : ĠHttpServletResponse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġapp . make < Router >() ĊĠĠĠĠĠĠĠ Ġval Ġroute Ġ= Ġrouter . route For ( methodName Ġ= Ġreq . method (), Ġuri Ġ= Ġreq . request URI ) ĊĠĠĠĠĠĠĠ ĠChild Container ( app ). use Ġ{ Ġcontainer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= ĠHttp Call ( container , Ġreq , Ġresp , Ġroute ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp . record Last Call ( call ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! static Handler . handle ( call )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . send Call Through Server Entry Middleware (). then (:: match Route ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . drop ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmatch Route ( call : ĠHttp Call ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( call . route . status ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRoute Match Status . SUCCESS Ġ-> Ġcall . dispatch To Route Handler ( call . route . target ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRoute Match Status . METHOD _ NOT _ ALLOWED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMethod Not Allowed Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Method Ġ${ call . method } Ġis Ġnot Ġallowed Ġfor Ġthis Ġoperation . ĠOnly Ġ${ call . route . allowed Methods (). join ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ", Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). toUpperCase ()} Ġmethods Ġare Ġallowed ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠNotFound HttpException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠHttp Call . dispatch To Route Handler ( route : ĠRoute ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgroup Middleware Ġ= Ġmutable ListOf < Middleware < Http Call >>() ĊĠĠĠĠĠĠĠ Ġroute . middleware Groups . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Middleware . addAll ( make Middleware ( route Entry Middleware Groups [ it ])) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmiddleware Ġ= Ġgroup Middleware . plus ( make Middleware ( route . middleware )) ĊĠĠĠĠĠĠĠ ĠPipeline < Http Call >(). send ( this ). through ( middleware ). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroute . handle ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Remove Explicit Type Arguments ") ĊĠĠĠ Ġprivate Ġfun Ġmake Middleware ( middleware : ĠIterable < K Class < out ĠMiddleware < Http Call >>> ?): ĠIterable < Middleware < Http Call >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmiddleware ?. filter Ġ{ Ġapp . should Load Middleware ( it ) Ġ} ?. map Ġ{ Ġit . create Instance () Ġ} Ġ?: Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠHttp Call . send Call Through Server Entry Middleware (): ĠPipeline < Http Call > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPipeline < Http Call >(). send ( this ). through ( make Middleware ( server Entry Middleware )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠHttpServletRequest . method (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġmethod Ġis Ġnot Ġa ĠPOST Ġmethod , Ġno Ġneed Ġto Ġcheck Ġit Ġfurther . ĠWe Ġjust Ġreturn Ġthe Ġmethod Ġas Ġit Ġis . ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġmethod Ġsp oof ing Ġis Ġnot Ġallowed Ġwe Ġreturn Ġthe Ġmethod Ġname Ġas Ġit Ġis . ĊĠĠĠĠĠĠĠ Ġif Ġ( method Ġ!= ĠMethod . POST . name Ġ|| Ġ! app . config < AppConfig >(). allow Method Sp oof ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmethod ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġparameter Map [" _ method "] ?. first OrNull ()?. toUpperCase () Ġ?: Ġmethod ĊĠĠĠ Ġ} Ċ } Ċ