package Ġdev . e volution Ċ Ċ import Ġio . ktor . application . call Ċ import Ġio . ktor . application . install Ċ import Ġio . ktor . features . C ORS Ċ import Ġio . ktor . features . Content Neg otiation Ċ import Ġio . ktor . features . Status Pages Ċ import Ġio . ktor . gson . gson Ċ import Ġio . ktor . http . ContentType Ċ import Ġio . ktor . http . HttpHeaders Ċ import Ġio . ktor . http . HttpMethod Ċ import Ġio . ktor . http . HttpStatusCode Ċ import Ġio . ktor . request . receive Stream Ċ import Ġio . ktor . response . respond Ċ import Ġio . ktor . response . respond Text Ċ import Ġio . ktor . routing . get Ċ import Ġio . ktor . routing . post Ċ import Ġio . ktor . routing . route Ċ import Ġio . ktor . routing . routing Ċ import Ġio . ktor . server . engine . embedded Server Ċ import Ġio . ktor . server . netty . Net ty Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġkotlinx . coroutines . yield Ċ import Ġjava . io . File Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . OutputStream Ċ import Ġjava . text . DateFormat Ċ import Ġjava . util . zip . Zip File ĊĊ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĊĠĠĠ Ġval Ġserver Ġ= Ġembedded Server ( Net ty , Ġ 9 0 9 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinstall ( C ORS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod ( HttpMethod . Options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod ( HttpMethod . Get ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod ( HttpMethod . Post ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod ( HttpMethod . Put ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod ( HttpMethod . Delete ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod ( HttpMethod . Patch ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . Authorization ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġallow Credentials Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany Host () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinstall ( Status Pages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception < Invalid Credentials Exception > Ġ{ Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . Unauthorized , Ġmap Of (" OK " Ġto Ġfalse , Ġ" error " Ġto Ġ( exception . message Ġ?: Ġ" "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinstall ( Content Neg otiation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgson Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset DateFormat ( DateFormat . LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Pretty Print ing () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// declaration Ctx . init () Ġ// XXX Ġfor Ġmock Ġtest ĊĠĠĠĠĠĠĠ Ġ// declaration Ctx . init Table () ĊĊĠĠĠĠĠĠĠ Ġrouting Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġroute ("/ api ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text (" Hello ĠWorld !", ĠContentType . Text . Plain ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġserver . start ( wait Ġ= Ġtrue ) Ċ } ĊĊ Ċ class ĠInvalid Credentials Exception ( message : ĠString ) Ġ: ĠRuntimeException ( message ) Ċ Ċ /** Ċ Ġ* ĠUtility Ġboilerplate Ġmethod Ġthat Ġsus pending , Ċ Ġ* Ġcopies Ġa Ġ[ this ] Ġ[ InputStream ] Ġinto Ġan Ġ[ out ] Ġ[ OutputStream ] Ġin Ġa Ġseparate Ġthread . Ċ Ġ* Ċ Ġ* Ġ[ buffer Size ] Ġand Ġ[ yield Size ] Ġallows Ġto Ġcontrol Ġhow Ġand Ġwhen Ġthe Ġsus pending Ġis Ġperformed . Ċ Ġ* ĠThe Ġ[ dispatcher ] Ġallows Ġto Ġspecify Ġwhere Ġwill Ġbe Ġthis Ġexecuted Ġ( for Ġexample Ġa Ġspecific Ġthread Ġpool ). Ċ Ġ*/ Ċ suspend Ġfun ĠInputStream . copy ToS uspend ( ĊĠĠĠĠĠĠĠ Ġout : ĠOutputStream , ĊĠĠĠĠĠĠĠ ĠbufferSize : ĠInt Ġ= ĠDEFAULT _ BUFFER _ SIZE , ĊĠĠĠĠĠĠĠ Ġyield Size : ĠInt Ġ= Ġ 4 Ġ* Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 , ĊĠĠĠĠĠĠĠ Ġdispatcher : ĠCor outine Dispatcher Ġ= ĠDispatch ers . IO Ċ ): ĠLong Ġ{ ĊĠĠĠ Ġreturn Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( buffer Size ) ĊĠĠĠĠĠĠĠ Ġvar Ġbytes Copied Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġvar Ġbytes After Yield Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġread ( buffer ). take If Ġ{ Ġit Ġ>= Ġ 0 Ġ} Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . write ( buffer , Ġ 0 , Ġbytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bytes After Yield Ġ>= Ġyield Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes After Yield Ġ% = Ġyield Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbytes Copied Ġ+= Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbytes After Yield Ġ+= Ġbytes ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn @ with Context Ġbytes Copied ĊĠĠĠ Ġ} Ċ }