package Ġinfo . jd avid . as yn k . server . http . handler Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġinfo . jd avid . as yn k . http . Headers Ċ import Ġinfo . jd avid . as yn k . http . MediaType Ċ import Ġinfo . jd avid . as yn k . http . Method Ċ import Ġinfo . jd avid . as yn k . http . Uri Ċ import Ġinfo . jd avid . as yn k . server . Server Ċ import Ġinfo . jd avid . as yn k . server . http . base . Abstract Http Handler Ċ import Ġinfo . jd avid . as yn k . server . http . route . Fixed Route Ċ import Ġinfo . jd avid . as yn k . server . http . route . No Params Ċ import Ġorg . apache . http . client . methods . HttpGet Ċ import Ġorg . apache . http . impl . client . HttpClient Builder Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . Assertions .* Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġjava . net . URI Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . util . regex . Pattern Ċ Ċ class ĠSingle Chain Tests Ġ{ ĊĊĠ Ġprivate Ġclass ĠTest Accept ance ( remote Address : ĠInet SocketAddress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod : ĠMethod , Ġuri : ĠString ): ĠHttp Handler . Accept ance < No Params >( ĊĠĠĠ Ġremote Address , Ġfalse , Ġfalse , Ġmethod , Ġuri , ĠNo Params ĊĠ Ġ) ĊĊĠ Ġ@ Test Ġfun Ġtest No Params () Ġ{ ĊĠĠĠ Ġval Ġhandler Ġ= Ġobject : ĠHttp Handler < Test Accept ance , ĠNo Params , ĠAbstract Http Handler . Context , ĠNo Params >( ĊĠĠĠĠĠ ĠNo Params ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġcontext ( others : ĠCollection < *> ?) Ġ= ĠContext ( others ) ĊĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġaccept Uri ( remote Address : ĠInet SocketAddress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod : ĠMethod , Ġuri : ĠString , Ġparams : ĠNo Params ): ĠTest Accept ance ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( method Ġ== ĠMethod . GET Ġ|| Ġmethod Ġ== ĠMethod . HEAD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠTest Accept ance ( remote Address , Ġmethod , Ġuri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġhandle ( accept ance : ĠTest Accept ance , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders : ĠHeaders , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody : ĠByteBuffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext ): ĠResponse < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠ Ġ" method " Ġto Ġacceptance . method . toString (), ĊĠĠĠĠĠĠĠĠĠ Ġ" path " Ġto Ġacceptance . uri , ĊĠĠĠĠĠĠĠĠĠ Ġ" headers " Ġto Ġmap Of (* headers . keys (). map Ġ{ Ġit Ġto Ġheaders . value ( it ) Ġ}. to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠObjectMapper (). writeValue As Bytes ( json ) ĊĠĠĠĠĠĠĠ Ġreturn ĠByte Response ( bytes , ĠMediaType . JSON ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠServer . http ( ĊĠĠĠĠĠ Ġhandler ĊĠĠĠ Ġ). use Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠ Ġval Ġrequest Ġ= ĠHttp Get (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġuri Ġ= ĠURI (" http :// localhost : 8 0 8 0 ") ĊĠĠĠĠĠĠĠ Ġset Header ( Headers . USER _ AGENT , Ġ" Test Ġuser Ġagent ") ĊĠĠĠĠĠĠĠ Ġset Header ( Headers . CACHE _ CONTROL , Ġ" no - cache ") ĊĠĠĠĠĠĠĠ Ġset Header ( Headers . PR AG MA , Ġ" no - cache ") ĊĠĠĠĠĠĠĠ Ġset Header (" Test ", Ġ" 1 2 3 ") ĊĠĠĠĠĠĠĠ Ġset Header ( Headers . CONNECTION , Ġ" close ") ĊĠĠĠĠĠĠĠ Ġset Header ( Headers . ACCEPT _ ENCODING , Ġ" gzip ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠHttpClient Builder . create (). build (). use Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠ Ġclient . execute ( request ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 0 0 , Ġit . status Line . statusCode ) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġit . entity . content . read Bytes () ĊĠĠĠĠĠĠĠĠĠ ĠassertEquals ( it . getLast Header ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHeaders . CONTENT _ LENGTH ). value . toInt (), Ġbytes . size ) ĊĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . getLast Header ( Headers . CONTENT _ TYPE ). value . startsWith ( MediaType . JSON )) ĊĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"{\" method \":\" GET \",\" path \":\" / \",\" headers \":{\" User - Agent \":\" Test Ġuser Ġagent \",\" Cache - Control \":\" no - cache \",\" Pr agma \":\" no - cache \",\" Test \":\" 1 2 3 \",\" Connection \":\" close \",\" Accept - Encoding \":\" gzip \",\" Host \":\" localhost : 8 0 8 0 \" }} ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString ( bytes ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġtest Builder With Route () Ġ{ ĊĠĠĠ ĠServer . http ( Http Handler . Builder (). ĊĠĠĠĠĠ Ġroute ( Fixed Route ("/ test ")). to Ġ{ Ġ_, Ġ_, Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ ĠHttp Handler . String Response (" Test ", ĠMediaType . TEXT ) ĊĠĠĠĠĠ Ġ}. ĊĠĠĠĠĠ Ġbuild () ĊĠĠĠ Ġ). use Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠ Ġval Ġrequest 1 Ġ= ĠHttp Get (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġuri Ġ= ĠURI (" http :// localhost : 8 0 8 0 / test ") ĊĠĠĠĠĠĠĠ Ġset Header ( Headers . USER _ AGENT , Ġ" Test Ġuser Ġagent ") ĊĠĠĠĠĠĠĠ Ġset Header ( Headers . CACHE _ CONTROL , Ġ" no - cache ") ĊĠĠĠĠĠĠĠ Ġset Header ( Headers . PR AG MA , Ġ" no - cache ") ĊĠĠĠĠĠĠĠ Ġset Header ( Headers . CONNECTION , Ġ" close ") ĊĠĠĠĠĠĠĠ Ġset Header ( Headers . ACCEPT _ ENCODING , Ġ" gzip ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠHttpClient Builder . create (). build (). use Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠ Ġclient . execute ( request 1 ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 0 0 , Ġit . status Line . statusCode ) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġit . entity . content . read Bytes () ĊĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . getLast Header ( Headers . CONTENT _ TYPE ). value . startsWith (" text / plain ")) ĊĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġit . getLast Header ( Headers . CONTENT _ LENGTH ). value . toInt ()) ĊĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġbytes . size ) ĊĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Test ", ĠString ( bytes )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠlistOf (" test /", Ġ" test / err ", Ġ" abc "). forEach Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġrequest 2 Ġ= ĠHttp Get (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= ĠURI (" http :// localhost : 8 0 8 0 /${ path }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( Headers . USER _ AGENT , Ġ" Test Ġuser Ġagent ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( Headers . CACHE _ CONTROL , Ġ" no - cache ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( Headers . PR AG MA , Ġ" no - cache ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( Headers . CONNECTION , Ġ" close ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( Headers . ACCEPT _ ENCODING , Ġ" gzip ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġclient . execute ( request 2 ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 4 0 4 , Ġit . status Line . statusCode , Ġpath ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġtest Builder () Ġ{ ĊĠĠĠ Ġval Ġroute Ġ= Ġobject : ĠHttp Handler . Route < Int > Ġ{ ĊĠĠĠĠĠ Ġval Ġpattern Ġ= ĠPattern . compile ("/ ([ 0 - 9 ]) $ ") ĊĠĠĠĠĠ Ġoverride Ġfun Ġmatch ( method : ĠMethod , Ġuri : ĠString ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġpattern . matcher ( Uri . path ( uri )) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( matcher . find ()) Ġmatcher . group ( 1 ). toInt () Ġelse Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġoverride Ġval Ġmax Request Size Ġ= Ġ 4 0 9 6 ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġhandler Ġ= Ġobject : ĠHttp Handler < Http Handler . Accept ance < Int >, ĠInt , ĠAbstract Http Handler . Context , ĠInt >( ĊĠĠĠĠĠ Ġroute ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġaccept Uri ( remote Address : ĠInet SocketAddress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod : ĠMethod , Ġuri : ĠString , Ġparams : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ ĠAccept ance ( remote Address , Ġfalse , Ġfalse , Ġmethod , Ġuri , Ġparams ) ĊĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġcontext ( others : ĠCollection < *> ?) Ġ= ĠContext ( others ) ĊĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġhandle ( accept ance : ĠAccept ance < Int >, Ġheaders : ĠHeaders , Ġbody : ĠByteBuffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext ) Ġ= ĊĠĠĠĠĠĠĠ ĠHttp Handler . String Response ("${ accept ance . route Params }", ĠMediaType . TEXT ) ĊĠĠĠ Ġ} ĊĠĠĠ ĠServer . http ( Http Handler . Builder (). ĊĠĠĠĠĠ Ġhandler ( handler ). ĊĠĠĠĠĠ Ġbuild () ĊĠĠĠ Ġ). use Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠ ĠHttpClient Builder . create (). build (). use Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠ ĠlistOf ( 3 , Ġ 6 , Ġ 1 ). forEach Ġ{ Ġn Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠHttp Get (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= ĠURI (" http :// localhost : 8 0 8 0 /${ n }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( Headers . USER _ AGENT , Ġ" Test Ġuser Ġagent ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( Headers . CACHE _ CONTROL , Ġ" no - cache ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( Headers . PR AG MA , Ġ" no - cache ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( Headers . CONNECTION , Ġ" close ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( Headers . ACCEPT _ ENCODING , Ġ" gzip ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġclient . execute ( request ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 0 0 , Ġit . status Line . statusCode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġit . entity . content . read Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . getLast Header ( Headers . CONTENT _ TYPE ). value . startsWith (" text / plain ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġit . getLast Header ( Headers . CONTENT _ LENGTH ). value . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġbytes . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( n , ĠString ( bytes ). toInt ()) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠlistOf (" 1 0 ", Ġ" a ", Ġ""). forEach Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠHttp Get (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= ĠURI (" http :// localhost : 8 0 8 0 /${ path }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( Headers . USER _ AGENT , Ġ" Test Ġuser Ġagent ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( Headers . CACHE _ CONTROL , Ġ" no - cache ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( Headers . PR AG MA , Ġ" no - cache ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( Headers . CONNECTION , Ġ" close ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( Headers . ACCEPT _ ENCODING , Ġ" gzip ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġclient . execute ( request ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 4 0 4 , Ġit . status Line . statusCode , Ġpath ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ Ċ } Ċ