package Ġio . kot less . dsl . ktor Ċ Ċ import Ġcom . microsoft . azure . functions .* Ċ import Ġcom . microsoft . azure . functions . annotation .* Ċ import Ġio . kot less . Internal API Ċ import Ġio . kot less . dsl . Azure RequestHandler Ċ import Ġio . kot less . dsl . ktor . app . K ot less Call Ċ import Ġio . kot less . dsl . ktor . app . K ot less Engine Ċ import Ġio . kot less . dsl . ktor . lang . Lambda W arm ing Ċ import Ġio . kot less . dsl . model . Cloud Watch Ċ import Ġio . kot less . dsl . model . HttpRequest Ċ import Ġio . kot less . dsl . utils . Json Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . server . engine .* Ċ import Ġio . ktor . util . pipeline .* Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . util .* ĊĊ Ċ /** Ċ Ġ* ĠEntry point Ġof ĠK ot less Ġapplication Ġwritten Ġwith ĠK tor ĠDSL . Ċ Ġ* Ċ Ġ* ĠOverride Ġ[ prepare ] Ġmethod Ġand Ġsetup Ġyour Ġapplication Ċ Ġ*/ Ċ @ Suppress (" unused ") Ċ abstract Ġclass ĠK ot less Azure Ġ: ĠAzure RequestHandler Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( K ot less Azure :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġprepared Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ@ Engine API ĊĠĠĠĠĠĠĠ Ġval Ġengine Ġ= ĠK ot less Engine ( application Engine Environment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Ġ= Ġlogger ĊĠĠĠĠĠĠĠ Ġ}). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġprepare ( app : ĠApplication ) ĊĊĠĠĠ Ġ@ Internal API ĊĠĠĠ Ġ@ Engine API ĊĠĠĠ Ġ@ FunctionName (" Http Trigger ") ĊĠĠĠ Ġoverride Ġfun Ġhandle Request ( ĊĠĠĠĠĠĠĠ Ġ@ Http Trigger ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" req ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethods Ġ= Ġ[ HttpMethod . GET , ĠHttpMethod . POST ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth Level Ġ= ĠAuthorization Level . FUNCTION ĊĠĠĠĠĠĠĠ Ġ) Ġrequest : ĠHttpRequest Message < Optional < String >>, Ġcontext : ĠExecutionContext ĊĠĠĠ Ġ): ĠHttpResponse Message Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" new Ġmessage ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! prepared ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepare ( engine . application ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġif Ġ( request . body . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . body . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Started Ġhandling Ġrequest ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Request Ġis Ġ{}", Ġjson ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( json . contains (" Scheduled ĠEvent ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠJson . parse ( Cloud Watch . serializer (), Ġjson ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event .` detail - type ` Ġ== Ġ" Scheduled ĠEvent " Ġ&& Ġevent . source Ġ== Ġ" aws . events ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Request Ġis ĠScheduled ĠEvent ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġengine . environment . monitor . raise ( Lambda W arm ing , Ġengine . application ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" One Ġor Ġmore Ġof Ġthe ĠLambda W arm ing Ġhandlers Ġthrown Ġan Ġexception ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Blocking Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Request Ġis ĠHTTP ĠEvent ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorig Path Ġ= Ġrequest . headers [" x - original - path "] Ġ?: Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Context Ġ= ĠHttpRequest . RequestContext ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorig Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorig Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccountId Ġ= Ġ"- 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource Id Ġ= Ġ"- 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstage Ġ= Ġ"/", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Ġ= ĠHttpRequest . RequestContext . Request Identity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ip Ġ= Ġrequest . headers [" x - for warded - for "] Ġ?: Ġ" 1 9 2 . 1 6 8 . 0 . 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Agent Ġ= Ġrequest . headers [" User - Agent "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Ġ= Ġ" HTTP ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Time Epoch Ġ= ĠSystem . currentTimeMillis (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomain Name Ġ= Ġ" domain _ name _ mock " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Body Ġ= ĠHttpRequest ( orig Path , Ġorig Path , Ġio . kot less . HttpMethod . valueOf ( request . http Method . name ), Ġnull , Ġrequest . query Parameters , Ġnull , Ġrequest Context , Ġjson , Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= ĠK ot less Call ( engine . application , Ġrequest Body ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġengine . pipeline . execute ( call ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . response . to Http () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Error Ġoccurred Ġduring Ġhandle Ġof Ġrequest Ġand Ġwas Ġnot Ġcaught ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Response Builder ( HttpStatus . INTERNAL _ SERVER _ ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġoutput Response Ġ= Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Response Builder ( HttpStatus . valueOf ( response . statusCode )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( response . body ) ĊĠĠĠĠĠĠĠ Ġresponse . headers . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Response . header ( it . key , Ġit . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . info (" Ended Ġhandling Ġrequest ") ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput Response . build () ĊĠĠĠ Ġ} Ċ } Ċ