package Ġio . ktor . server . c io Ċ Ċ import Ġio . ktor . http . c io .* Ċ import Ġio . ktor . http . c io . internals .* Ċ import Ġio . ktor . network . selector .* Ċ import Ġio . ktor . network . sockets .* Ċ import Ġio . ktor . network . sockets . Server Socket Ċ import Ġio . ktor . network . sockets . Socket Ċ import Ġio . ktor . util .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġorg . slf 4 j .* Ċ import Ġjava . net .* Ċ import Ġjava . nio . channels .* Ċ import Ġjava . time .* Ċ import Ġjava . util . concurrent .* Ċ import Ġjava . util . concurrent . Cancellation Exception Ċ import Ġkotlin . coroutines .* Ċ Ċ class ĠHttp Server ( val Ġroot Server Job : ĠJob , Ġval Ġaccept Job : ĠJob , Ġval Ġserver Socket : ĠDeferred < Server Socket >) Ċ Ċ data Ġclass ĠHttp Server Settings ( ĊĠĠĠ Ġval Ġhost : ĠString Ġ= Ġ" 0 . 0 . 0 . 0 ", ĊĠĠĠ Ġval Ġport : ĠInt Ġ= Ġ 8 0 8 0 , ĊĠĠĠ Ġval Ġconnection Idle Timeout Seconds : ĠLong Ġ= Ġ 4 5 Ċ ) Ċ Ċ @ Deprecated (" Use Ġhttp Server Ġwith ĠCor outine Scope Ġreceiver ") Ċ fun Ġhttp Server ( settings : ĠHttp Server Settings , Ġparent Job : ĠJob ? Ġ= Ġnull , Ġhandler : ĠHttpRequest Handler ): ĠHttp Server Ġ{ ĊĠĠĠ Ġval Ġparent Ġ= Ġparent Job Ġ?: ĠDispatch ers . Default ĊĠĠĠ Ġval Ġscope Ġ= ĠCor outine Scope ( Global Scope . new Coroutine Context ( parent )) ĊĊĠĠĠ Ġreturn Ġscope . http Server ( settings , Ġhandler Ġ= Ġhandler ) Ċ } Ċ Ċ @ Deprecated (" Use Ġhttp Server Ġwith ĠCor outine Scope Ġreceiver ") Ċ fun Ġhttp Server ( ĊĠĠĠ Ġsettings : ĠHttp Server Settings , ĊĠĠĠ Ġparent Job : ĠJob ? Ġ= Ġnull , ĊĠĠĠ Ġcall Dispatcher : ĠCor outine Context ?, ĊĠĠĠ Ġhandler : ĠHttpRequest Handler Ċ ): ĠHttp Server Ġ{ ĊĠĠĠ Ġif Ġ( call Dispatcher Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġreturn Ġhttp Server ( settings , Ġparent Job , Ġhandler ) Ċ } Ċ Ċ /** Ċ Ġ* ĠStart Ġan Ġhttp Ġserver Ġwith Ġ[ settings ] Ġinvoking Ġ[ handler ] Ġfor Ġevery Ġrequest Ċ Ġ*/ Ċ @ Use Experimental ( Internal API :: class ) Ċ fun ĠCor outine Scope . http Server ( ĊĠĠĠ Ġsettings : ĠHttp Server Settings , ĊĠĠĠ Ġhandler : ĠHttpRequest Handler Ċ ): ĠHttp Server Ġ{ ĊĠĠĠ Ġval Ġsocket Ġ= ĠComp letable Deferred < Server Socket >() ĊĊĠĠĠ Ġval Ġserver Latch Ġ= ĠComp letable Deferred < Unit >() ĊĠĠĠ Ġval Ġserver Job Ġ= Ġlaunch ( ĊĠĠĠĠĠĠĠ Ġcontext Ġ= ĠCor outine Name (" server - root -${ settings . port } "), ĊĠĠĠĠĠĠĠ Ġstart Ġ= ĠCor outine Start . UN DISPATCH ED ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġserver Latch . await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġselector Ġ= ĠActor Selector Manager ( coroutine Context ) ĊĠĠĠ Ġval Ġtimeout Ġ= ĠWeak Timeout Queue ( TimeUnit . SECONDS . to Millis ( settings . connection Idle Timeout Seconds ), ĊĠĠĠĠĠĠĠ ĠClock . system UTC () ĊĠĠĠĠĠĠ Ġ) Ġ{ ĠTimeout Cancellation Exception (" Connection ĠID LE ") Ġ} ĊĊĠĠĠ Ġval Ġaccept Job Ġ= Ġlaunch ( server Job Ġ+ ĠCor outine Name (" accept -${ settings . port } ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġa Socket ( selector ). tcp (). bind ( Inet SocketAddress ( settings . host , Ġsettings . port )). use Ġ{ Ġserver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . complete ( server ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Scope Ġ= ĠCor outine Scope ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Context Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSuper visor Job ( server Job ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK tor Un caught ExceptionHandler () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Name (" request ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient : ĠSocket Ġ= Ġserver . accept () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Job Ġ= Ġconnection Scope . start Connection Pipeline ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ= Ġclient . open Read Channel (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġ= Ġclient . open Write Channel (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeout Ġ= Ġtimeout , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler Ġ= Ġhandler ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Job . invoke On Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( closed : ĠClosed Channel Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Context . cancel ( closed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . await Closed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Scope . coroutine Context . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġaccept Job . invoke On Completion Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠ Ġt ?. let Ġ{ Ġsocket . cancel ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġserver Latch . complete ( Unit ) ĊĠĠĠĠĠĠĠ Ġtimeout . process () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġserver Job . invoke On Completion ( on C ancell ing Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtimeout . cancel () ĊĠĠĠ Ġ} ĊĠĠĠ Ġserver Job . invoke On Completion Ġ{ ĊĠĠĠĠĠĠĠ Ġselector . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠHttp Server ( server Job , Ġaccept Job , Ġsocket ) Ċ } Ċ Ċ private Ġclass ĠK tor Un caught ExceptionHandler Ġ: ĠCor outine ExceptionHandler Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( K tor Un caught ExceptionHandler :: class . java ) ĊĊĠĠĠ Ġoverride Ġval Ġkey : ĠCor outine Context . Key < *> ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠCor outine ExceptionHandler . Key ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Exception ( context : ĠCor outine Context , Ġexception : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( exception Ġis ĠC ancellation Exception ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġlogger . error ( exception ) ĊĠĠĠĠĠĠĠ Ġ// Ġun like Ġthe Ġdefault Ġcoroutine Ġexception Ġhandler Ġwe Ġshouldn 't Ġcancel Ġparent Ġjob Ġhere ĊĠĠĠĠĠĠĠ Ġ// Ġotherwise Ġsingle Ġcall Ġfailure Ġwill Ġcancel Ġthe Ġwhole Ġserver ĊĠĠĠ Ġ} Ċ }