/* Ċ * ĠCopyright Ġ 2 0 1 4 - 2 0 2 1 ĠJetBrains Ġs . r . o Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ */ Ċ Ċ package Ġio . ktor . server . routing Ċ Ċ import Ġio . ktor . events . Event Definition Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . server . application .* Ċ import Ġio . ktor . server . request .* Ċ import Ġio . ktor . server . response .* Ċ import Ġio . ktor . util .* Ċ import Ġio . ktor . util . pipeline .* Ċ Ċ @ Internal API Ċ public Ġval ĠRouting Failure StatusCode : ĠAttribute Key < HttpStatusCode > Ġ= ĠAttribute Key (" Routing Failure StatusCode ") Ċ Ċ /** Ċ Ġ* ĠA Ġroot Ġrouting Ġnode Ġof Ġan Ġ[ Application ]. Ċ Ġ* ĠYou Ġcan Ġlearn Ġmore Ġabout Ġrouting Ġin ĠK tor Ġfrom Ġ[ Routing ]( https :// ktor . io / docs / routing - in - ktor . html ). Ċ Ġ* Ċ Ġ* Ġ@ param Ġapplication Ġis Ġan Ġinstance Ġof Ġ[ Application ] Ġfor Ġthis Ġrouting Ġnode . Ċ Ġ*/ Ċ @ K tor Dsl Ċ public Ġclass ĠRouting ( ĊĠĠĠ Ġpublic Ġval Ġapplication : ĠApplication Ċ ) Ġ: ĠRoute ( ĊĠĠĠ Ġparent Ġ= Ġnull , ĊĠĠĠ Ġselector Ġ= ĠRoot Route Selector ( application . environment . rootPath ), ĊĠĠĠ Ġapplication . environment . development Mode , ĊĠĠĠ Ġapplication . environment Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtr ac ers Ġ= Ġmutable ListOf <( Routing Resolve Trace ) Ġ-> ĠUnit >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegisters Ġa Ġfunction Ġused Ġto Ġtrace Ġroute Ġresolution . ĊĠĠĠĠ Ġ* ĠMight Ġbe Ġuseful Ġif Ġyou Ġneed Ġto Ġunderstand Ġwhy Ġa Ġroute Ġisn 't Ġexecuted . ĊĠĠĠĠ Ġ* ĠTo Ġlearn Ġmore , Ġsee Ġ[ Tracing Ġroutes ]( https :// ktor . io / docs / tracing - routes . html ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġtrace ( block : Ġ( Routing Resolve Trace ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtr ac ers . add ( block ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Internal API :: class ) ĊĠĠĠ Ġpublic Ġsuspend Ġfun Ġinterceptor ( context : ĠPipeline Context < Unit , ĠApplication Call >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresolve Context Ġ= ĠRouting Resolve Context ( this , Ġcontext . call , Ġtr ac ers ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresolve Result Ġ= Ġresolve Context . resolve ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRouting Resolve Result . Success Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Result ( context , Ġresolve Result . route , Ġresolve Result . parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRouting Resolve Result . Failure Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . call . attributes . put ( Routing Failure StatusCode , Ġresolve Result . error StatusCode ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġexecute Result ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠPipeline Context < Unit , ĠApplication Call >, ĊĠĠĠĠĠĠĠ Ġroute : ĠRoute , ĊĠĠĠĠĠĠĠ Ġparameters : ĠParameters ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrouting Call Pipeline Ġ= Ġroute . build Pipeline () ĊĠĠĠĠĠĠĠ Ġval Ġreceive Pipeline Ġ= Ġmerge ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . call . request . pipeline , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouting Call Pipeline . receive Pipeline ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĠApplication Receive Pipeline ( development Mode ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Pipeline Ġ= Ġmerge ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . call . response . pipeline , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouting Call Pipeline . send Pipeline ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĠApplication Send Pipeline ( development Mode ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrouting Call Ġ= ĠRouting Application Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . call , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroute , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . coroutine Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceive Pipeline , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Pipeline , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġapplication . environment . monitor . raise ( Routing Call Started , Ġrouting Call ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouting Call Pipeline . execute ( routing Call ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . environment . monitor . raise ( Routing Call Finished , Ġrouting Call ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< Subject Ġ: ĠAny , ĠContext Ġ: ĠAny , ĠP Ġ: ĠPipeline < Subject , ĠContext >> Ġmerge ( ĊĠĠĠĠĠĠĠ Ġfirst : ĠP , ĊĠĠĠĠĠĠĠ Ġsecond : ĠP , ĊĠĠĠĠĠĠĠ Ġbuild : Ġ() Ġ-> ĠP ĊĠĠĠ Ġ): ĠP Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( first . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsecond ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( second . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfirst ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge ( first ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge ( second ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAn Ġinstallation Ġobject Ġof Ġthe Ġ[ Routing ] Ġplugin . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Public Api Implicit Type ") ĊĠĠĠ Ġpublic Ġcompanion Ġobject ĠPlugin Ġ: ĠBase Application Plugin < Application , ĠRouting , ĠRouting > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠA Ġdefinition Ġfor Ġan Ġevent Ġthat Ġis Ġfired Ġwhen Ġrouting - based Ġcall Ġprocessing Ġstarts . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġpublic Ġval ĠRouting Call Started : ĠEvent Definition < Routing Application Call > Ġ= ĠEvent Definition () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠA Ġdefinition Ġfor Ġan Ġevent Ġthat Ġis Ġfired Ġwhen Ġrouting - based Ġcall Ġprocessing Ġis Ġfinished . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġpublic Ġval ĠRouting Call Finished : ĠEvent Definition < Routing Application Call > Ġ= ĠEvent Definition () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġkey : ĠAttribute Key < Routing > Ġ= ĠAttribute Key (" Routing ") ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinstall ( pipeline : ĠApplication , Ġconfigure : ĠRouting . () Ġ-> ĠUnit ): ĠRouting Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrouting Ġ= ĠRouting ( pipeline ). apply ( configure ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . intercept ( Call ) Ġ{ Ġrouting . interceptor ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrouting ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠGets Ġan Ġ[ Application ] Ġfor Ġthis Ġ[ Route ] Ġby Ġscanning Ġthe Ġhierarchy Ġto Ġthe Ġroot . Ċ Ġ*/ Ċ public Ġval ĠRoute . application : ĠApplication ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠRouting Ġ-> Ġapplication ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġparent ?. application Ġ?: Ġthrow ĠUnsupportedOperationException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġretrieve Ġapplication Ġfrom Ġun attached Ġrouting Ġentry " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠInstall s Ġa Ġ[ Routing ] Ġplugin Ġfor Ġthe Ġthis Ġ[ Application ] Ġand Ġruns Ġa Ġ[ configuration ] Ġscript Ġon Ġit . Ċ Ġ* ĠYou Ġcan Ġlearn Ġmore Ġabout Ġrouting Ġin ĠK tor Ġfrom Ġ[ Routing ]( https :// ktor . io / docs / routing - in - ktor . html ). Ċ Ġ*/ Ċ @ K tor Dsl Ċ public Ġfun ĠApplication . routing ( configuration : ĠRouting . () Ġ-> ĠUnit ): ĠRouting Ġ= ĊĠĠĠ Ġplugin OrNull ( Routing )?. apply ( configuration ) Ġ?: Ġinstall ( Routing , Ġconfiguration ) Ċ