package Ġinfo . jd avid . as yn k . server Ċ Ċ import Ġinfo . jd avid . as yn k . core . async Write Ċ import Ġinfo . jd avid . as yn k . http . Headers Ċ import Ġinfo . jd avid . as yn k . server . http . base . Abstract Http Handler Ċ import Ġinfo . jd avid . as yn k . server . http . base . Simple Http Handler Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . Assertions .* Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġjava . net . URL Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . channels . As ynchronous SocketChannel Ċ import Ġjava . util . concurrent . Concurrent Linked Queue Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠDispatcher Tests Ġ{ ĊĊĠ Ġ@ Test Ġfun Ġconnect Many () Ġ{ ĊĠĠĠ Ġclass ĠExtended Context ( others : ĠCollection < *> ?): ĠAbstract Http Handler . Context ( others ) Ġ{ ĊĠĠĠĠĠ Ġval Ġtest : ĠByteBuffer Ġ= ĊĠĠĠĠĠĠĠ Ġ( others ?. find Ġ{ Ġit Ġis ĠExtended Context Ġ} Ġas ? ĠExtended Context )?. test Ġ?: ĊĠĠĠĠĠĠĠĠĠ Ġ" HTTP / 1 . 1 Ġ 2 0 0 ĠOK \ r \ n Content - Type : Ġtext / plain \ r \ n Content - Length : Ġ 4 \ r \ n Connection : Ġclose \ r \ n \ r \ n Test ". ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto ByteArray ( Charsets . US _ ASCII ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteBuffer . allocate Direct ( it . size ); Ġbytes . put ( it ); Ġbytes ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġcount Ġ= Ġ 1 0 0 0 0 ĊĠĠĠ Ġval Ġorder Ġ= ĠConcurrent Linked Queue < Int >() ĊĠĠĠ Ġval Ġtimes Ġ= ĠServer ( object Ġ: ĠSimple Http Handler () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġcontext ( others : ĠCollection < *> ?) Ġ= ĠExtended Context ( others ) ĊĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġconnect ( remote Address : ĠInet SocketAddress ) Ġ= Ġtrue ĊĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġhandle ( accept ance : ĠSimple Http Handler . Accept ance , Ġheaders : ĠHeaders , Ġbody : ĠByteBuffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket : ĠAs ynchronous SocketChannel , Ġcontext : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ(( context Ġas ĠExtended Context ). test . rewind () Ġas ĠByteBuffer ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( remaining () Ġ> Ġ 0 ) Ġsocket . async Write ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}). use Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ( 1 .. count ). map Ġ{ Ġi : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= ĠSystem . nano Time () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconn Ġ= ĠURL (" http :// localhost : 8 0 8 0 "). open Connection () Ġas ĠHttp URLConnection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . use Caches Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġconn . inputStream . read Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( String ( bytes ) Ġ== Ġ" Test ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . add ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconn . disconnect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . nano Time () Ġ- Ġt ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{ Ġjobs Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġjobs . map Ġ{ Ġit . await () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġaverage Ġ= ĠTimeUnit . NAN O SECONDS . to Micro s ( ĊĠĠĠĠĠ Ġtimes . map Ġ{ Ġit Ġ}. reduce Ġ{ Ġacc , Ġl Ġ-> Ġacc Ġ+ Ġl Ġ} Ġ/ Ġtimes . size ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġlargest Ġ= ĠTimeUnit . NAN O SECONDS . to Micro s ( ĊĠĠĠĠĠ Ġtimes . map Ġ{ Ġit Ġ}. max () Ġ?: Ġthrow ĠRuntimeException () ĊĠĠĠ Ġ) ĊĠĠĠ ĠassertEquals ( count , Ġorder . size ) ĊĠĠĠ ĠassertTrue ( average Ġ< Ġ 1 0 0 0 0 L ) Ġ// Ġ 1 0 Ġmillis ĊĠĠĠ ĠassertTrue ( largest Ġ< Ġ 5 0 0 0 0 0 L ) Ġ// Ġ 5 0 0 Ġmillis ĊĠĠĠ Ġassert Not Equals ( order , Ġorder . sorted ()) ĊĠ Ġ} Ċ Ċ } Ċ