package Ġfeature a . ktor Ċ Ċ import Ġfeature a . join Url Path Ċ import Ġfeature a . log Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . http . Cache Control .* Ċ import Ġio . ktor . http . content .* Ċ import Ġio . ktor . request .* Ċ import Ġio . ktor . response .* Ċ import Ġio . ktor . routing .* Ċ import Ġio . ktor . util .* Ċ import Ġjava . io . File Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ // Ġhttps :// stackoverflow . com / a / 2 5 7 6 7 3 5 / 9 0 9 1 6 9 Ċ val Ġdisable Cache Config Ġ= ĠCache Config Ġ{ ĊĠĠĠ ĠC aching Options ( Max Age ( max Age Seconds Ġ= Ġ 0 , Ġmust Re validate Ġ= Ġtrue , Ġvisibility Ġ= ĠVisibility . Private )) Ċ } Ċ Ċ // Ġ>> Ġjust Ġfor Ġtry Ġtodo Ġreplace Ġwith Ġ` disable Cache Config ` Ċ val Ġone Day Cache Config Ġ= ĠCache Config Ġ{ ĊĠĠĠ ĠC aching Options ( ĊĠĠĠĠĠĠĠ ĠMax Age ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Age Seconds Ġ= ĠTimeUnit . DAYS . to Seconds ( 1 L ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmust Re validate Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠVisibility . Public ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ċ } Ċ // Ġ<< Ċ Ċ class ĠS pa Feature Ġ{ ĊĊĠĠĠ Ġclass ĠConfiguration Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstatic Root Docs Ġ= Ġ" static " ĊĠĠĠĠĠĠĠ Ġvar Ġdefault File Ġ= Ġ" index . html " ĊĠĠĠĠĠĠĠ Ġvar Ġapi Url Ġ= Ġ"/ api " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject ĠFeature Ġ: ĠApplication Feature < Application , ĠConfiguration , ĠS pa Feature > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġkey : ĠAttribute Key < Sp a Feature > Ġ= ĠAttribute Key < Sp a Feature >(" feature a . ktor . Sp a Feature ") ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinstall ( pipeline : ĠApplication , Ġconfigure : ĠConfiguration . () Ġ-> ĠUnit ): ĠS pa Feature Ġ= Ġwith ( pipeline ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhost : ĠString Ġ= Ġenvironment . config [" spa : host "] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= ĠConfiguration (). apply ( configure ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatic ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Root Folder Ġ= ĠFile ( configuration . static Root Docs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles ("./ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault ( configuration . default File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget (" /* ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Redirect ("/") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġintercept ( Application Call Pipeline . Features ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatic Root Docs : ĠString Ġ= Ġconfiguration . static Root Docs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Uri : ĠString Ġ= Ġcall . request . uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri : ĠString Ġ= Ġrequest Uri . replace ("${ host }/ ". to Regex (), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtokens : ĠList < String > Ġ= Ġuri . split ("/") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlog ("[ Sp a Feature ] Ġuri : Ġ$ uri ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfilter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Uri Ġ== Ġ"/ ws " Ġ|| Ġrequest Uri Ġ== Ġ"/ wss ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ intercept Ġproceed () Ġ// Ġquick fix Ġtodo Ġimprove ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri . startsWith ( configuration . api Url )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ intercept Ġproceed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdefault ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tokens . last (). matches ( Regex ("[ \\ S ]+ \\ .[ \\ S ]+ "))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( static Root Docs , Ġconfiguration . default File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlog ("[ Sp a Feature ] Ġdefault : Ġ${ file . absolute Path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond File ( file , Ġone Day Cache Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ intercept Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstatic ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Path String Ġ= Ġjoin Url Path ( static Root Docs , Ġtokens . sub List ( 1 , Ġtokens . last Index )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatic File Ġ= ĠFile ( urlPath String , Ġtokens . last ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( static File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond File ( static File , Ġone Day Cache Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ intercept Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog ("[ Sp a Feature ] Ġproceed : Ġ$ static File ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ intercept Ġproceed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠS pa Feature () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠApplication . install Sp a Feature ( configure : ĠS pa Feature . Configuration . () Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠ Ġinstall ( Sp a Feature ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconfigure () ĊĠĠĠ Ġ} Ċ } Ċ