package Ġorg . jetbrains . ktor . routing Ċ Ċ import Ġorg . jetbrains . ktor . application .* Ċ import Ġorg . jetbrains . ktor . features .* Ċ import Ġorg . jetbrains . ktor . util .* ĊĊ Ċ class ĠRouting ( val Ġapplication : ĠApplication ) Ġ: ĠRouting Entry ( parent Ġ= Ġnull , Ġselector Ġ= ĠRouting . Root Routing Selector ) Ġ{ ĊĊĠĠĠ Ġobject ĠRoot Routing Selector Ġ: ĠRouting Selector Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġevaluate ( context : ĠRouting Resolve Context , Ġindex : ĠInt ): ĠRoute Selector Evaluation Ġ= Ġthrow ĠUnsupportedOperationException () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġinterceptor ( call : ĠApplication Call , Ġnext : ĠApplication Call . () Ġ-> ĠApplication Call Result ): ĠApplication Call Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresolve Context Ġ= ĠRouting Resolve Context ( this , Ġcall . request . request Line , Ġcall . request . parameters , Ġcall . request . headers ) ĊĠĠĠĠĠĠĠ Ġval Ġresolve Result Ġ= Ġresolve Context . resolve () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Result . succeeded Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrouting Call Ġ= ĠRouting Application Call ( call , Ġresolve Result . entry , Ġresolve Result . values ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrouting Call . execute Entry ( resolve Result . entry ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcall . next () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠRouting Application Call . execute Handlers ( handlers : ĠList < Routing Application Call . () Ġ-> ĠApplication Call Result >): ĠApplication Call Result Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠHand lers Ġare Ġexecuted Ġin Ġthe Ġinstallation Ġorder , Ġfirst Ġone Ġthat Ġhandles Ġa Ġcall Ġwins ĊĠĠĠĠĠĠĠ Ġfor Ġ( handler Ġin Ġhandlers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler Result Ġ= Ġhandler () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handler Result Ġ!= ĠApplication Call Result . Unhandled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandler Result ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠApplication Call Result . Unhandled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠRouting Application Call . execute Entry ( entry : ĠRouting Entry ): ĠApplication Call Result Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInter cept ors Ġare Ġrare ly Ġinstalled Ġinto Ġrouting Ġentries , Ġso Ġdon 't Ġcreate Ġlist Ġunless Ġthere Ġare Ġsome ĊĠĠĠĠĠĠĠ Ġvar Ġintercept ors : ĠMutable List < Routing Interceptor >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent : ĠRouting Entry ? Ġ= Ġentry ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current . intercept ors . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intercept ors Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintercept ors Ġ= Ġarray ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintercept ors . addAll ( 0 , Ġcurrent . intercept ors ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġintercept ors , Ġjust Ġcall Ġhandlers Ġwithout Ġpoll uting Ġcall Ġstacks ĊĠĠĠĠĠĠĠ Ġif Ġ( intercept ors Ġ== Ġnull Ġ|| Ġintercept ors . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexecute Handlers ( entry . handlers ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġhandle ( index : ĠInt , Ġintercept ors : ĠList < Routing Interceptor >): ĠApplication Call Result Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ< Ġintercept ors . size Ġ-> Ġintercept ors [ index ]. function ( this ) Ġ{ Ġrequest Ġ-> Ġhandle ( index Ġ+ Ġ 1 , Ġintercept ors ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexecute Handlers ( entry . handlers ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġhandle ( 0 , Ġintercept ors ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject ĠRouting Feature Ġ: ĠApplication Feature < Routing > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġkey : ĠAttribute Key < Routing > Ġ= ĠAttribute Key (" Routing ") ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġname : ĠString Ġ= Ġ" Routing " ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinstall ( application : ĠApplication , Ġconfigure : ĠRouting . () Ġ-> ĠUnit ) Ġ= ĠRouting ( application ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . intercept Ġ{ Ġnext Ġ-> Ġthis @ apply . interceptor ( this , Ġnext ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ val ĠRouting Entry . application : ĠApplication Ġget () Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġthis Ġis ĠRouting Ġ-> Ġapplication ĊĠĠĠ Ġelse Ġ-> Ġparent ?. application Ġ?: Ġthrow ĠUnsupportedOperationException (" Cannot Ġretrieve Ġapplication Ġfrom Ġun attached Ġrouting Ġentry ") Ċ } Ċ Ċ public Ġfun ĠApplication . routing ( configure : ĠRouting . () Ġ-> ĠUnit ) Ġ= Ġinstall ( Routing , Ġconfigure ) ĊĊ