package Ġcom . link time . ktor base Ċ Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlin . random . Random Ċ Ċ @ Suppress (" Constant Condition If ") Ċ object ĠDev Options Ġ{ ĊĊĠĠĠ Ġabstract Ġclass ĠDev Option ( protected Ġval Ġenabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (" ======= ĠATT ENT ION : Ġ${ this :: class . simple Name } Ġdeveloper Ġoption Ġis Ġenabled Ġ!!! Ġ===== ==" ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (" ======= ĠIf Ġthis Ġis Ġproduction , Ġre - build Ġthe Ġapplication Ġwithout Ġthe Ġflag Ġ===== ==" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠFail Specific Http Requests Ġ: ĠDev Option ( false ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfail Routes : ĠList < Fail Route > Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġfail If Desired ( method : ĠString , Ġpath : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail Routes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . method Ġ== Ġmethod Ġ&& Ġit . path Regex . contains Match In ( path ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġroute Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log ("${ this :: class . simple Name } Ġ--> Ġ$ route ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFail Specific HttpRequest Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠFail Route ( val Ġmethod : ĠString , Ġval Ġpath Regex : ĠRegex ) ĊĊĠĠĠĠĠĠĠ Ġclass ĠFail Specific HttpRequest Exception Ġ: ĠRuntimeException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠRandom Http Delay Ġ: ĠDev Option ( false ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġmax Delay Millis Ġ= Ġ 1 5 0 0 L ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġrandom Delay () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelay Millis Ġ= ĠRandom . next Long ( max Delay Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log ("${ this :: class . simple Name } Ġ--> Ġ$ delay Millis Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( delay Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }