package Ġio . v proxy . test . cases Ċ Ċ import Ġio . v proxy . lib . common . coroutine Ċ import Ġio . v proxy . lib . common . execute Ċ import Ġio . v proxy . lib . common . launch Ċ import Ġio . v proxy . lib . http . Routing HandlerFunc Ċ import Ġio . v proxy . lib . http 1 . Coroutine Http 1 Client Connection Ċ import Ġio . v proxy . lib . http 1 . Coroutine Http 1 Server Ċ import Ġorg . junit . After Class Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . BeforeClass Ċ import Ġorg . junit . Test Ċ import Ġjava . io . IOException Ċ Ċ class ĠTest HttpServer Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval Ġport Ġ= Ġ 3 0 0 8 0 ĊĠĠĠ Ġprivate Ġvar Ġserver : ĠCor outine Http 1 Server ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġloop : Ġio . v proxy . base . selector . Selector EventLoop ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ BeforeClass ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġbefore Class () Ġ{ ĊĠĠĠĠĠ Ġval Ġserver Sock Ġ= Ġio . v proxy . base . connection . Server Sock . create ( ĊĠĠĠĠĠĠĠ Ġio . v proxy . v fd . IP Port ( ĊĠĠĠĠĠĠĠĠĠ Ġ" 1 2 7 . 0 . 0 . 1 ", ĊĠĠĠĠĠĠĠĠĠ Ġport ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġval Ġloop Ġ= Ġio . v proxy . base . selector . Selector EventLoop . open () ĊĠĠĠĠĠ Ġthis . loop Ġ= Ġloop ĊĠĠĠĠĠ Ġloop . ensure Net EventLoop () ĊĠĠĠĠĠ Ġloop . loop Ġ{ Ġio . v proxy . base . util . thread . V Proxy Thread . create ( it , Ġ" test - http - server ") Ġ} ĊĠĠĠĠĠ Ġval Ġserver Ġ= ĠCor outine Http 1 Server ( server Sock . coroutine ( loop . ensure Net EventLoop ())) ĊĠĠĠĠĠ Ġthis . server Ġ= Ġserver ĊĊĠĠĠĠĠ Ġloop . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsimple Handler : ĠRouting HandlerFunc Ġ= Ġ{ Ġit . conn . response ( 2 0 0 ). send ( it . req . method () Ġ+ Ġ" Ġ" Ġ+ Ġit . req . uri ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġsimple Ġresponse ĊĠĠĠĠĠĠĠ Ġserver . get ("/ simple - response ", Ġsimple Handler ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġpath Ġparam ĊĠĠĠĠĠĠĠ Ġserver . get ("/ path - 1 /: path - param ") Ġ{ Ġit . conn . response ( 2 0 0 ). send ( it . param (" path - param ")) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġsimple Ġfilter Ġand Ġresponse ĊĠĠĠĠĠĠĠ Ġserver . get ("/ simple - filter - response ") Ġ{ Ġit . put Param (" foo ", Ġ" bar - s "). allow Next () Ġ} ĊĠĠĠĠĠĠĠ Ġserver . get ("/ simple - filter - response ") Ġ{ Ġit . conn . response ( 2 0 0 ). send ( it . param (" foo ") Ġ+ Ġ" Ġ- Ġ" Ġ+ Ġit . req . uri ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġpath Ġparam Ġfilter ĊĠĠĠĠĠĠĠ Ġserver . get ("/ path - 2 /: path - param - 1 ") Ġ{ Ġit . put Param (" pass ", Ġit . param (" path - param - 1 ")). allow Next () Ġ} ĊĠĠĠĠĠĠĠ Ġserver . get ("/ path - 2 /: path - param - 2 ") Ġ{ Ġit . conn . response ( 2 0 0 ). send ( it . param (" pass ") Ġ+ Ġ" Ġ- Ġ" Ġ+ Ġit . param (" path - param - 2 ")) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġwildcard ĊĠĠĠĠĠĠĠ Ġserver . get ("/ path - 3 /* ", Ġsimple Handler ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwildcard Ġfilter ĊĠĠĠĠĠĠĠ Ġserver . get ("/ path - 4 /* ") Ġ{ Ġit . put Param (" foo ", Ġ" bar - 4 "). allow Next () Ġ} ĊĠĠĠĠĠĠĠ Ġserver . get ("/ path - 4 /* ") Ġ{ Ġit . conn . response ( 2 0 0 ). send ( it . param (" foo ") Ġ+ Ġ" Ġ- Ġ" Ġ+ Ġit . req . uri ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġparam Ġand Ġwildcard ĊĠĠĠĠĠĠĠ Ġserver . get ("/ path - 5 /: param / middle /* ") Ġ{ Ġit . conn . response ( 2 0 0 ). send ( it . param (" param ") Ġ+ Ġ" Ġ- Ġ" Ġ+ Ġit . req . uri ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġparam Ġand Ġwildcard Ġfilter ĊĠĠĠĠĠĠĠ Ġserver . get ("/ path - 6 /: param / middle /* ") Ġ{ Ġr ctx Ġ-> Ġr ctx . put Param (" pass ", Ġr ctx . param (" param ")). allow Next () Ġ} ĊĠĠĠĠĠĠĠ Ġserver . get ("/ path - 6 /: param 2 / middle /* ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . conn . response ( 2 0 0 ). send ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . param (" param ") Ġ+ Ġ" Ġ- Ġ" Ġ+ Ġit . param (" pass ") Ġ+ Ġ" Ġ- Ġ" Ġ+ Ġit . req . uri () ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġstart ĊĠĠĠĠĠĠĠ Ġserver . start () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ After Class ĊĠĠĠ Ġfun Ġafter Class () Ġ{ ĊĠĠĠĠĠ Ġserver !!. close () ĊĠĠĠĠĠ Ġloop !!. close () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġrequest Raw ( uri : ĠString ): Ġio . v proxy . base . processor . http 1 . entity . Response Ġ{ ĊĠĠĠ Ġval Ġresponse Ġ= Ġloop !!. execute Ġ{ ĊĠĠĠĠĠ Ġval Ġclient Ġ= ĠCor outine Http 1 Client Connection . create ( io . v proxy . v fd . IP Port (" 1 2 7 . 0 . 0 . 1 ", Ġport )) ĊĠĠĠĠĠ Ġclient . get ( uri ). send () ĊĠĠĠĠĠ Ġval Ġresp Ġ= Ġclient . read Response () ĊĠĠĠĠĠ Ġclient . conn . close () ĊĠĠĠĠĠ Ġresp ĊĠĠĠ Ġ}. block () ĊĠĠĠ Ġreturn Ġresponse ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġrequest ( uri : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġval Ġbody Ġ= Ġloop !!. execute Ġ{ ĊĠĠĠĠĠ Ġval Ġclient Ġ= ĠCor outine Http 1 Client Connection . create ( io . v proxy . v fd . IP Port (" 1 2 7 . 0 . 0 . 1 ", Ġport )) ĊĠĠĠĠĠ Ġdefer Ġ{ Ġclient . close () Ġ} ĊĊĠĠĠĠĠ Ġclient . get ( uri ). send () ĊĠĠĠĠĠ Ġval Ġresp Ġ= Ġclient . read Response () ĊĠĠĠĠĠ Ġif Ġ( resp . statusCode Ġ!= Ġ 2 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" response Ġstatus Ġcode Ġnot Ġ 2 0 0 : Ġ" Ġ+ Ġresp . statusCode ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġbody Ġ= Ġresp . body ĊĠĠĠĠĠ Ġif Ġ( body Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠString ( body . to Java Array ()) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. block () ĊĠĠĠ Ġreturn Ġbody ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġ@ Throws ( Exception :: class ) ĊĠ Ġfun Ġsimple () Ġ{ ĊĠĠĠ Ġvar Ġres : ĠString ĊĠĠĠ Ġres Ġ= Ġrequest ("/ simple - response ") ĊĠĠĠ ĠassertEquals (" GET Ġ/ simple - response ", Ġres ) ĊĠĠĠ Ġres Ġ= Ġrequest ("/ path - 1 / hh ") ĊĠĠĠ ĠassertEquals (" hh ", Ġres ) ĊĠĠĠ Ġres Ġ= Ġrequest ("/ path - 1 / gg ") ĊĠĠĠ ĠassertEquals (" gg ", Ġres ) ĊĠĠĠ Ġres Ġ= Ġrequest ("/ simple - filter - response ") ĊĠĠĠ ĠassertEquals (" bar - s Ġ- Ġ/ simple - filter - response ", Ġres ) ĊĠĠĠ Ġres Ġ= Ġrequest ("/ path - 2 / hh ") ĊĠĠĠ ĠassertEquals (" hh Ġ- Ġhh ", Ġres ) ĊĠĠĠ Ġres Ġ= Ġrequest ("/ path - 2 / gg ") ĊĠĠĠ ĠassertEquals (" gg Ġ- Ġgg ", Ġres ) ĊĠĠĠ Ġres Ġ= Ġrequest ("/ path - 3 / hh ") ĊĠĠĠ ĠassertEquals (" GET Ġ/ path - 3 / hh ", Ġres ) ĊĠĠĠ Ġres Ġ= Ġrequest ("/ path - 3 / gg ") ĊĠĠĠ ĠassertEquals (" GET Ġ/ path - 3 / gg ", Ġres ) ĊĠĠĠ Ġres Ġ= Ġrequest ("/ path - 3 / hh / gg ") ĊĠĠĠ ĠassertEquals (" GET Ġ/ path - 3 / hh / gg ", Ġres ) ĊĠĠĠ Ġres Ġ= Ġrequest ("/ path - 4 / hh ") ĊĠĠĠ ĠassertEquals (" bar - 4 Ġ- Ġ/ path - 4 / hh ", Ġres ) ĊĠĠĠ Ġres Ġ= Ġrequest ("/ path - 4 / gg ") ĊĠĠĠ ĠassertEquals (" bar - 4 Ġ- Ġ/ path - 4 / gg ", Ġres ) ĊĠĠĠ Ġres Ġ= Ġrequest ("/ path - 4 / hh / gg ") ĊĠĠĠ ĠassertEquals (" bar - 4 Ġ- Ġ/ path - 4 / hh / gg ", Ġres ) ĊĠĠĠ Ġres Ġ= Ġrequest ("/ path - 5 / hh / middle / gg ") ĊĠĠĠ ĠassertEquals (" hh Ġ- Ġ/ path - 5 / hh / middle / gg ", Ġres ) ĊĠĠĠ Ġres Ġ= Ġrequest ("/ path - 5 / hh gg / middle / g gh h ") ĊĠĠĠ ĠassertEquals (" hh gg Ġ- Ġ/ path - 5 / hh gg / middle / g gh h ", Ġres ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġ@ Throws ( Exception :: class ) ĊĠ Ġfun Ġtest 4 0 4 () Ġ{ ĊĠĠĠ Ġvar Ġresp Ġ= Ġrequest Raw ("/") ĊĠĠĠ ĠassertEquals ( 4 0 4 , Ġresp . statusCode ) ĊĠĠĠ ĠassertEquals (" Cannot ĠGET Ġ/\ r \ n ", Ġresp . body . toString ()) ĊĠĠĠ Ġresp Ġ= Ġrequest Raw ("/ abc ") ĊĠĠĠ ĠassertEquals ( 4 0 4 , Ġresp . statusCode ) ĊĠĠĠ ĠassertEquals (" Cannot ĠGET Ġ/ abc \ r \ n ", Ġresp . body . toString ()) ĊĠ Ġ} Ċ } Ċ