/* Ċ Ġ* ĠCopyright Ġ 2 0 1 4 - 2 0 1 9 ĠJetBrains Ġs . r . o Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġio . ktor . server . engine Ċ Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . request .* Ċ import Ġio . ktor . response .* Ċ import Ġio . ktor . util .* Ċ import Ġjava . util . concurrent .* Ċ import Ġkotlin . concurrent .* Ċ import Ġkotlin . system .* Ċ Ċ /** Ċ Ġ* ĠShutdown ĠURL Ġfeature . ĠIt Ġstops Ġapplication Ġwhen Ġrequested Ġparticular Ġurl Ċ Ġ* Ċ Ġ* Ġ@ property Ġurl Ġto Ġhandle Ċ Ġ* Ġ@ property Ġexit Code Ġis Ġa Ġfunction Ġto Ġcompute Ġprocess Ġexit Ġcode Ċ Ġ*/ Ċ class ĠSh ut Down Url ( val Ġurl : ĠString , Ġval Ġexit Code : ĠApplication Call . () Ġ-> ĠInt ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDoes Ġapplication Ġshutdown Ġusing Ġthe Ġspecified Ġ[ call ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġdo Shutdown ( call : ĠApplication Call ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . application . log . warn (" Shutdown ĠURL Ġwas Ġcalled : Ġserver Ġis Ġgoing Ġdown ") ĊĠĠĠĠĠĠĠ Ġval Ġapplication Ġ= Ġcall . application ĊĠĠĠĠĠĠĠ Ġval Ġenvironment Ġ= Ġapplication . environment ĊĠĠĠĠĠĠĠ Ġval Ġexit Code Ġ= Ġexit Code ( call ) ĊĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . await ( 1 0 L , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . monitor . raise ( Application Stop Pre paring , Ġenvironment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( environment Ġis ĠApplication Engine Environment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( exit Code ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . G one ) ĊĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġfeature Ġto Ġinstall Ġinto Ġengine Ġpipeline ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠEngine Feature Ġ: ĠApplication Feature < Engine Pipeline , ĠConfiguration , ĠSh ut Down Url > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġkey Ġ= ĠAttribute Key < Shut Down Url >(" shutdown . url ") ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinstall ( pipeline : ĠEngine Pipeline , Ġconfigure : ĠConfiguration . () Ġ-> ĠUnit ): ĠSh ut Down Url Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure ( config ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfeature Ġ= ĠSh ut Down Url ( config . sh ut Down Url , Ġconfig . exit Code Supplier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . intercept ( Engine Pipeline . Before ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call . request . uri Ġ== Ġfeature . url ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . do Shutdown ( call ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfeature ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġfeature Ġto Ġinstall Ġinto Ġapplication Ġcall Ġpipeline ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠApplication Call Feature Ġ: ĠApplication Feature < Application Call Pipeline , ĠConfiguration , ĠSh ut Down Url > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġkey Ġ= ĠAttribute Key < Shut Down Url >(" shutdown . url ") ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinstall ( pipeline : ĠApplication Call Pipeline , Ġconfigure : ĠConfiguration . () Ġ-> ĠUnit ): ĠSh ut Down Url Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure ( config ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfeature Ġ= ĠSh ut Down Url ( config . sh ut Down Url , Ġconfig . exit Code Supplier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . intercept ( Application Call Pipeline . Features ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call . request . uri Ġ== Ġfeature . url ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . do Shutdown ( call ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfeature ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShutdown Ġurl Ġconfiguration Ġbuilder ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠConfiguration Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠURI Ġto Ġhandle Ġshutdown Ġrequests ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġshut Down Url Ġ= Ġ"/ ktor / application / shutdown " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠA Ġfunction Ġthat Ġprovides Ġprocess Ġexit Ġcode Ġby Ġan Ġapplication Ġcall ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġexit Code Supplier : ĠApplication Call . () Ġ-> ĠInt Ġ= Ġ{ Ġ 0 Ġ} ĊĠĠĠ Ġ} Ċ } Ċ