package Ġcom . fire fly source . net . http . server . impl Ċ Ċ import Ġcom . fire fly source . common . concurrent . exception ally Accept Ċ import Ġcom . fire fly source . common . io . Buffer Utils Ċ import Ġcom . fire fly source . common . sys . Result Ċ import Ġcom . fire fly source . net . http . client . HttpClient Factory Ċ import Ġcom . fire fly source . net . http . common . Http Config Ċ import Ġcom . fire fly source . net . http . common . Proxy Config Ċ import Ġcom . fire fly source . net . http . common . model . HttpMethod Ċ import Ġcom . fire fly source . net . http . common . model . HttpStatus Ċ import Ġcom . fire fly source . net . http . server . HttpServer Content Provider Factory Ċ import Ġcom . fire fly source . net . http . server . HttpServer Factory Ċ import Ġcom . fire fly source . net . http . server . impl . router . async Blocking Handler Ċ import Ġcom . fire fly source . net . http . server . impl . router . async Handler Ċ import Ġcom . fire fly source . net . http . server . impl . router . getCurrent Routing Context Ċ import Ġcom . fire fly source . net . tcp . Tcp Client Factory Ċ import Ġkotlinx . coroutines . future . await Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . jupiter . api . Assertions .* Ċ import Ġorg . junit . jupiter . api . DisplayName Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . params . Parameterized Test Ċ import Ġorg . junit . jupiter . params . provider . Method Source Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . channels . Closed Channel Exception Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . system . measure Time Millis Ċ Ċ @ Suppress (" Http Urls Usage ") Ċ class ĠTest HttpServer Ġ: ĠAbstract HttpServer TestBase () Ġ{ ĊĊĠĠĠ Ġ@ Parameterized Test ĊĠĠĠ Ġ@ Method Source (" test Parameters Provider ") ĊĠĠĠ Ġ@ DisplayName (" should Ġvisit Ġrouter Ġchain Ġsuccessfully .") ĊĠĠĠ Ġfun Ġtest Router Chain ( protocol : ĠString , Ġschema : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġhttp Server Ġ= Ġcreate HttpServer ( protocol , Ġschema ) ĊĠĠĠĠĠĠĠ Ġhttp Server ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). path ("* "). async Handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( getCurrent Routing Context () Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write (" into Ġrouter Ġ-> Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . next (). await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . end (" end Ġrouter .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). get ("/ hello /: foo "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġctx . getPath Parameter (" foo ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write (" visit Ġfoo : Ġ$ p Ġ| "). next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). get ("/ hello /* "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġctx . getPath Parameter ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write (" visit Ġpattern : Ġ$ p Ġ| "). next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). method ( HttpMethod . GET ). path Regex ("/ hello / ([ a - z ]+) "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġctx . getPath Parameter By Regex Group ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write (" regex Ġgroup : Ġ$ p Ġ| "). next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). get ("/ hello / test "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write (" visit Ġtest Ġ"). next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. listen ( address ) ĊĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= ĠHttpClient Factory . create () ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfutures Ġ= Ġ( 1 .. count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠhttpClient . get ("$ schema ://${ address . host Name }:${ address . port }/ hello / bar "). submit () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfutures . forEach Ġ{ Ġf Ġ-> Ġf . exception ally Accept Ġ{ Ġprintln ( it . message ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . all Of (* futures . to Typed Array ()). await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Done Ġ= Ġfutures . all Ġ{ Ġit . is Done Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( all Done ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġfutures [ 0 ]. await () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatus . OK _ 2 0 0 , Ġresponse . status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" into Ġrouter Ġ-> Ġvisit Ġfoo : Ġbar Ġ| visit Ġpattern : Ġbar Ġ| regex Ġgroup : Ġbar Ġ| end Ġrouter .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . string Body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfinish ( count , Ġtime , ĠhttpClient , Ġhttp Server ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Parameterized Test ĊĠĠĠ Ġ@ Method Source (" test Parameters Provider ") ĊĠĠĠ Ġ@ DisplayName (" should Ġenable Ġand Ġdisable Ġrouter Ġsuccessfully .") ĊĠĠĠ Ġfun Ġtest Enable And Disable Router ( protocol : ĠString , Ġschema : ĠString ): ĠUnit Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġhttp Server Ġ= Ġcreate HttpServer ( protocol , Ġschema ) ĊĠĠĠĠĠĠĠ Ġhttp Server ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). enable (). get ("/ hello /: foo "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġctx . getPath Parameter (" foo ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write (" visit Ġfoo : Ġ$ p Ġ"). next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). disable (). get ("/ hello /* "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġctx . getPath Parameter ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write (" visit Ġpattern : Ġ$ p Ġ"). next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). get ("/ hello / test "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write (" visit Ġtest Ġ"). next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). path ("* "). handler Ġ{ Ġctx Ġ-> Ġctx . end () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. listen ( address ) ĊĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= ĠHttpClient Factory . create () ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfutures Ġ= Ġ( 1 .. count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠhttpClient . get ("$ schema ://${ address . host Name }:${ address . port }/ hello / test "). submit () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfutures . forEach Ġ{ Ġf Ġ-> Ġf . exception ally Accept Ġ{ Ġprintln ( it . message ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . all Of (* futures . to Typed Array ()). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Done Ġ= Ġfutures . all Ġ{ Ġit . is Done Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( all Done ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġfutures [ 0 ]. await () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatus . OK _ 2 0 0 , Ġresponse . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" visit Ġfoo : Ġtest Ġvisit Ġtest Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . string Body ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( response ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfinish ( count , Ġtime , ĠhttpClient , Ġhttp Server ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Parameterized Test ĊĠĠĠ Ġ@ Method Source (" test Parameters Provider ") ĊĠĠĠ Ġ@ DisplayName (" should Ġget Ġand Ġset Ġattributes Ġsuccessfully .") ĊĠĠĠ Ġfun Ġtest Context Attributes ( protocol : ĠString , Ġschema : ĠString ): ĠUnit Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġhttp Server Ġ= Ġcreate HttpServer ( protocol , Ġschema ) ĊĠĠĠĠĠĠĠ Ġhttp Server ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). get ("/ hello /: foo "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . attributes [" A "] Ġ= Ġ" Test A " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). get ("/ hello /: bar "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . attributes [" B "] Ġ= Ġ" Test B " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . setAttribute (" C ", Ġ" Test C ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . setAttribute (" D ", Ġ" Test D ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . removeAttribute (" D ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . removeAttribute (" E ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). method (" GET "). path ("/ hello /* "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write ("${ ctx . attributes [" A "]} Ġ${ ctx . attributes [" B "]} Ġ${ ctx . getAttribute (" C ")} "). next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). method ( HttpMethod . GET ). handler Ġ{ Ġctx Ġ-> Ġctx . end () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. listen ( address ) ĊĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= ĠHttpClient Factory . create () ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfutures Ġ= Ġ( 1 .. count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠhttpClient . get ("$ schema ://${ address . host Name }:${ address . port }/ hello / test "). submit () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfutures . forEach Ġ{ Ġf Ġ-> Ġf . exception ally Accept Ġ{ Ġprintln ( it . message ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . all Of (* futures . to Typed Array ()). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Done Ġ= Ġfutures . all Ġ{ Ġit . is Done Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( all Done ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġfutures [ 0 ]. await () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatus . OK _ 2 0 0 , Ġresponse . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Test A ĠTest B ĠTest C ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . string Body ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( response ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfinish ( count , Ġtime , ĠhttpClient , Ġhttp Server ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Parameterized Test ĊĠĠĠ Ġ@ Method Source (" test Parameters Provider ") ĊĠĠĠ Ġ@ DisplayName (" should Ġresponse Ġ 5 0 0 Ġwhen Ġthe Ġrouter Ġdoes Ġnot Ġcommit .") ĊĠĠĠ Ġfun Ġtest Router Not Commit ( protocol : ĠString , Ġschema : ĠString ): ĠUnit Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġhttp Server Ġ= Ġcreate HttpServer ( protocol , Ġschema ) ĊĠĠĠĠĠĠĠ Ġhttp Server . router (). get ("/ hello "). handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . DONE ĊĠĠĠĠĠĠĠ Ġ}. listen ( address ) ĊĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= ĠHttpClient Factory . create () ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfutures Ġ= Ġ( 1 .. count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠhttpClient . get ("$ schema ://${ address . host Name }:${ address . port }/ hello "). submit () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfutures . forEach Ġ{ Ġf Ġ-> Ġf . exception ally Accept Ġ{ Ġprintln ( it . message ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . all Of (* futures . to Typed Array ()). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Done Ġ= Ġfutures . all Ġ{ Ġit . is Done Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( all Done ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġfutures [ 0 ]. await () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatus . INTERNAL _ SERVER _ ERROR _ 5 0 0 , Ġresponse . status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfinish ( count , Ġtime , ĠhttpClient , Ġhttp Server ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Parameterized Test ĊĠĠĠ Ġ@ Method Source (" test Parameters Provider ") ĊĠĠĠ Ġ@ DisplayName (" should Ġresponse Ġ 4 0 0 Ġwhen Ġthe Ġresource Ġnot Ġfound .") ĊĠĠĠ Ġfun Ġtest Resource NotFound ( protocol : ĠString , Ġschema : ĠString ): ĠUnit Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġhttp Server Ġ= Ġcreate HttpServer ( protocol , Ġschema ) ĊĠĠĠĠĠĠĠ Ġhttp Server . router (). get ("/ hello "). handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . DONE ĊĠĠĠĠĠĠĠ Ġ}. listen ( address ) ĊĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= ĠHttpClient Factory . create () ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfutures Ġ= Ġ( 1 .. count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠhttpClient . get ("$ schema ://${ address . host Name }:${ address . port }/ hello x "). submit () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfutures . forEach Ġ{ Ġf Ġ-> Ġf . exception ally Accept Ġ{ Ġprintln ( it . message ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . all Of (* futures . to Typed Array ()). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Done Ġ= Ġfutures . all Ġ{ Ġit . is Done Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( all Done ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġfutures [ 0 ]. await () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatus . NOT _ FOUND _ 4 0 4 , Ġresponse . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( response ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfinish ( count , Ġtime , ĠhttpClient , Ġhttp Server ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Parameterized Test ĊĠĠĠ Ġ@ Method Source (" test Parameters Provider ") ĊĠĠĠ Ġ@ DisplayName (" should Ġresponse Ġ 5 0 0 Ġwhen Ġthe Ġrouter Ġhappens Ġexception .") ĊĠĠĠ Ġfun Ġtest Router Exception ( protocol : ĠString , Ġschema : ĠString ): ĠUnit Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġhttp Server Ġ= Ġcreate HttpServer ( protocol , Ġschema ) ĊĠĠĠĠĠĠĠ Ġhttp Server ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). get ("/ exception "). handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" test Ġexception ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). get ("/ exception "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" bad Ġend ?") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . end (" bad Ġend ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. listen ( address ) ĊĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= ĠHttpClient Factory . create () ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfutures Ġ= Ġ( 1 .. count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠhttpClient . get ("$ schema ://${ address . host Name }:${ address . port }/ exception "). submit () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfutures . forEach Ġ{ Ġf Ġ-> Ġf . exception ally Accept Ġ{ Ġprintln ( it . message ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . all Of (* futures . to Typed Array ()). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Done Ġ= Ġfutures . all Ġ{ Ġit . is Done Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( all Done ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġfutures [ 0 ]. await () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatus . INTERNAL _ SERVER _ ERROR _ 5 0 0 , Ġresponse . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( response ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfinish ( count , Ġtime , ĠhttpClient , Ġhttp Server ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ DisplayName (" should Ġresponse Ġ 4 0 0 Ġwhen Ġthe Ġhost Ġheader Ġis Ġmissing .") ĊĠĠĠ Ġfun Ġtest No Host Header (): ĠUnit Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhttp Server Ġ= Ġcreate HttpServer (" http 1 ", Ġ" http ") ĊĠĠĠĠĠĠĠ Ġhttp Server ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). get ("/ test No Host "). handler Ġ{ Ġit . end (" ok ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. listen ( address ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠHttp Config () ĊĠĠĠĠĠĠĠ Ġconfig . is Auto Generated Client Http 1 Headers Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= ĠHttpClient Factory . create ( config ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠhttpClient . get (" http ://${ address . host Name }:${ address . port }/ test No Host "). submit (). await () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatus . BAD _ REQUEST _ 4 0 0 , Ġresponse . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( response ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfinish ( 1 , Ġtime , ĠhttpClient , Ġhttp Server ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ DisplayName (" should Ġestablish ĠHTTP Ġtunnel Ġsuccessfully .") ĊĠĠĠ Ġfun Ġtest Http Tunnel (): ĠUnit Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhttp Server Ġ= Ġcreate HttpServer (" http 1 ", Ġ" http ") ĊĠĠĠĠĠĠĠ Ġhttp Server ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Accept Http Tunnel Ġ{ Ġrequest Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Accept Ġhttp Ġtunnel Ġrequest . Ġ$ request ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . completed Future ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Http Tunnel Handshake Complete Ġ{ Ġconnection , Ġaddress Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" target Ġaddress : Ġ$ address ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . write ( Buffer Utils . to Buffer (" 1 2 3 4 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Compose Ġ{ Ġconnection . close Async () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. listen ( address ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ" CONNECT Ġp 5 4 - cal dav . ic loud . com : 4 4 3 ĠHTTP / 1 . 1 \ r \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Host : Ġp 5 4 - cal dav . ic loud . com \ r \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" User - Agent : ĠMac + OS + X / 1 0 . 1 5 . 7 Ġ( 1 9 H 1 1 4 ) ĠCalendar Agent / 9 3 0 . 5 . 1 \ r \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Connection : Ġkeep - alive \ r \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Proxy - Connection : Ġkeep - alive \ r \ n \ r \ n " ĊĠĠĠĠĠĠĠ Ġval Ġtcp Client Ġ= ĠTcp Client Factory . create () ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġtcp Client . connect ( address ). await () ĊĠĠĠĠĠĠĠ Ġconnection . write ( Buffer Utils . to Buffer ( message )). await () ĊĠĠĠĠĠĠĠ Ġval Ġreceived Data Ġ= Ġmutable ListOf < ByteBuffer >() ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġconnection . read (). await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceived Data . add ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClosed Channel Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġreceived Messages Ġ= ĠBuffer Utils . toString ( received Data , ĠStandard Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġprintln ( received Messages ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( received Messages . isNotBlank ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( received Messages . contains (" HTTP / 1 . 1 Ġ 2 0 0 ĠConnection ĠEst ab lished \ r \ n \ r \ n ")) ĊĠĠĠĠĠĠĠ ĠassertTrue ( received Messages . contains (" 1 2 3 4 ")) ĊĊĠĠĠĠĠĠĠ Ġtcp Client . stop () ĊĠĠĠĠĠĠĠ Ġhttp Server . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ DisplayName (" should Ġestablish ĠHTTP Ġtunnel Ġfailure .") ĊĠĠĠ Ġfun Ġtest Http Tunnel Failure (): ĠUnit Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhttp Server Ġ= Ġcreate HttpServer (" http 1 ", Ġ" http ") ĊĠĠĠĠĠĠĠ Ġhttp Server ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Accept Http Tunnel Ġ{ Ġrequest Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Accept Ġhttp Ġtunnel Ġrequest . Ġ$ request ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . completed Future ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Http Tunnel Handshake Complete Ġ{ Ġconnection , Ġaddress Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" target Ġaddress : Ġ$ address ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . write ( Buffer Utils . to Buffer (" 1 2 3 4 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Compose Ġ{ Ġconnection . close Async () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. listen ( address ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ" CONNECT Ġp 5 4 - cal dav . ic loud . com : 4 4 3 ĠHTTP / 1 . 1 \ r \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Host : Ġp 5 4 - cal dav . ic loud . com \ r \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" User - Agent : ĠMac + OS + X / 1 0 . 1 5 . 7 Ġ( 1 9 H 1 1 4 ) ĠCalendar Agent / 9 3 0 . 5 . 1 \ r \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Connection : Ġkeep - alive \ r \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Proxy - Connection : Ġkeep - alive \ r \ n \ r \ n " ĊĠĠĠĠĠĠĠ Ġval Ġtcp Client Ġ= ĠTcp Client Factory . create () ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġtcp Client . connect ( address ). await () ĊĠĠĠĠĠĠĠ Ġconnection . write ( Buffer Utils . to Buffer ( message )). await () ĊĠĠĠĠĠĠĠ Ġval Ġreceived Data Ġ= Ġmutable ListOf < ByteBuffer >() ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġconnection . read (). await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceived Data . add ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClosed Channel Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġreceived Messages Ġ= ĠBuffer Utils . toString ( received Data , ĠStandard Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġprintln ( received Messages ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( received Messages . isNotBlank ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( received Messages . contains (" Proxy ĠAuthentication ĠRequired ")) ĊĠĠĠĠĠĠĠ ĠassertTrue ( received Messages . contains (" The Ġproxy Ġauthentication Ġmust Ġbe Ġrequired ")) ĊĠĠĠĠĠĠĠ ĠassertFalse ( received Messages . contains (" 1 2 3 4 ")) ĊĊĠĠĠĠĠĠĠ Ġtcp Client . stop () ĊĠĠĠĠĠĠĠ Ġhttp Server . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Parameterized Test ĊĠĠĠ Ġ@ Method Source (" test Parameters Provider ") ĊĠĠĠ Ġ@ DisplayName (" should Ġsend Ġrequest Ġvia Ġthe Ġhttp Ġproxy Ġsuccessfully .") ĊĠĠĠ Ġfun Ġtest Http Proxy ( protocol : ĠString , Ġschema : ĠString ): ĠUnit Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġhttp Server Ġ= Ġcreate HttpServer ( protocol , Ġschema ) ĊĠĠĠĠĠĠĠ Ġhttp Server ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). path ("/ hello /* "). async Handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( getCurrent Routing Context () Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write (" into Ġrouter Ġ-> Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . next (). await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . end (" end Ġrouter .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). get ("/ hello /: foo "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġctx . getPath Parameter (" foo ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write (" visit Ġfoo : Ġ$ p Ġ| "). next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). get ("/ hello /* "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġctx . getPath Parameter ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write (" visit Ġpattern : Ġ$ p Ġ| "). next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). method ( HttpMethod . GET ). path Regex ("/ hello / ([ a - z ]+) "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġctx . getPath Parameter By Regex Group ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write (" regex Ġgroup : Ġ$ p Ġ| "). next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). get ("/ hello / test "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write (" visit Ġtest Ġ"). next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). get ("/ length / test "). handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . content Provider ( HttpServer Content Provider Factory . string Body (" 1 2 3 4 5 6 7 ", ĠStandard Charsets . UTF _ 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. end () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. listen ( address ) ĊĊĠĠĠĠĠĠĠ Ġval Ġproxy Address Ġ= ĠInet SocketAddress (" localhost ", ĠRandom . nextInt ( 1 0 0 0 0 , Ġ 2 0 0 0 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġproxy Ġ= ĠHttp Server Factory . create Http Proxy () ĊĠĠĠĠĠĠĠ Ġproxy . listen ( proxy Address ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Http Config Ġ= ĠHttp Config () ĊĠĠĠĠĠĠĠ Ġval Ġproxy Config Ġ= ĠProxy Config () ĊĠĠĠĠĠĠĠ Ġproxy Config . host Ġ= Ġproxy Address . host Name ĊĠĠĠĠĠĠĠ Ġproxy Config . port Ġ= Ġproxy Address . port ĊĠĠĠĠĠĠĠ Ġclient Http Config . proxy Config Ġ= Ġproxy Config ĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= ĠHttpClient Factory . create ( client Http Config ) ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfutures Ġ= Ġ( 1 .. count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠhttpClient . get ("$ schema ://${ address . host Name }:${ address . port }/ hello / bar "). submit () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfutures . forEach Ġ{ Ġf Ġ-> Ġf . exception ally Accept Ġ{ Ġprintln ( it . message ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . all Of (* futures . to Typed Array ()). await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Done Ġ= Ġfutures . all Ġ{ Ġit . is Done Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( all Done ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġfutures [ 0 ]. await () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatus . OK _ 2 0 0 , Ġresponse . status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" into Ġrouter Ġ-> Ġvisit Ġfoo : Ġbar Ġ| visit Ġpattern : Ġbar Ġ| regex Ġgroup : Ġbar Ġ| end Ġrouter .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . string Body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( response ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Response Ġ= ĠhttpClient . get ("$ schema ://${ address . host Name }:${ address . port }/ length / test "). submit (). await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatus . OK _ 2 0 0 , Ġlength Response . status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 1 2 3 4 5 6 7 ", Ġlength Response . string Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( length Response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfinish ( count , Ġtime , ĠhttpClient , Ġhttp Server ) ĊĠĠĠĠĠĠĠ Ġproxy . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Copy () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhttp Server Ġ= Ġcreate HttpServer (" http 1 ", Ġ" http ") ĊĠĠĠĠĠĠĠ Ġhttp Server . router (). get ("/ test Copy ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. async Blocking Handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( Thread . currentThread (). name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . end (" Origin Ġserver ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. router (). get ("/ blocking Task ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. blocking Handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( Thread . currentThread (). name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . end (" Blocking Ġtask "). get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. listen ( address ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġnew Address Ġ= ĠInet SocketAddress (" localhost ", ĠRandom . nextInt ( 2 0 0 0 0 , Ġ 4 0 0 0 0 )) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( new Address Ġ== Ġaddress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Address Ġ= ĠInet SocketAddress (" localhost ", ĠRandom . nextInt ( 2 0 0 0 0 , Ġ 4 0 0 0 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew HttpServer Ġ= Ġhttp Server . copy () ĊĠĠĠĠĠĠĠ Ġnew HttpServer . enable Secure Connection (). listen ( new Address ) ĊĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= ĠHttpClient Factory . create () ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresponse Ġ= ĠhttpClient . get (" http ://${ address . host Name }:${ address . port }/ test Copy "). submit (). await () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Origin Ġserver ", Ġresponse . string Body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( response ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= ĠhttpClient . get (" http ://${ address . host Name }:${ address . port }/ blocking Task "). submit (). await () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Blocking Ġtask ", Ġresponse . string Body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( response ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= ĠhttpClient . get (" https ://${ new Address . host Name }:${ new Address . port }/ test Copy "). submit (). await () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Origin Ġserver ", Ġresponse . string Body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( response ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= ĠhttpClient . get (" https ://${ new Address . host Name }:${ new Address . port }/ blocking Task "). submit (). await () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Blocking Ġtask ", Ġresponse . string Body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( response ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠhttpClient . stop () ĊĠĠĠĠĠĠĠ Ġhttp Server . stop () ĊĠĠĠĠĠĠĠ Ġnew HttpServer . stop () ĊĠĠĠ Ġ} Ċ }