/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 - 2 0 2 1 ĠNet Found ry , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . open z iti . sample . netty Ċ Ċ import Ġcom . github . aj alt . cli kt . core . Cli kt Command Ċ import Ġcom . github . aj alt . cli kt . core . sub commands Ċ import Ġcom . github . aj alt . cli kt . parameters . arguments . argument Ċ import Ġcom . github . aj alt . cli kt . parameters . options . option Ċ import Ġcom . github . aj alt . cli kt . parameters . options . required Ċ import Ġcom . github . aj alt . cli kt . parameters . types . file Ċ import Ġio . netty . bootstrap . Bootstrap Ċ import Ġio . netty . bootstrap . Server Bootstrap Ċ import Ġio . netty . channel .* Ċ import Ġio . netty . handler . codec . http .* Ċ import Ġio . netty . handler . ssl . Ssl Handler Ċ import Ġorg . open z iti . Z iti Ċ import Ġorg . open z iti . Z iti Address Ċ import Ġorg . open z iti . Z iti Context Ċ import Ġorg . open z iti . netty . Z iti Channel Factory Ċ import Ġorg . open z iti . netty . Z iti Resolver Group Ċ import Ġorg . open z iti . netty . Z iti Server Channel Factory Ċ import Ġjava . net . URL Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjavax . net . ssl . SSL Context Ċ Ċ object ĠHttp Sample Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġz iti : ĠZ iti Context ĊĊĠĠĠ Ġclass Ġclient Init ( val Ġhost : ĠString , Ġval Ġport : ĠInt , Ġval Ġtls : ĠBoolean ): ĠChannel Initializer < Channel > (){ ĊĠĠĠĠĠĠĠ Ġval Ġssl Ctx Ġ= ĠSSL Context . getDefault () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit Channel ( ch : ĠChannel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġch . pipeline (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tls ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġengine Ġ= Ġssl Ctx . create SSL Engine ( host , Ġport ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġengine . use Client Mode Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Last ( Ssl Handler ( engine )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Last ( HttpClient Codec ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Last ( Http Content De compressor ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Last ( object Ġ: ĠSimple Channel Inbound Handler < Http Object > (){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchannel Read 0 ( ctx : ĠChannel HandlerContext , Ġmsg : ĠHttp Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( msg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHttpResponse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ================ \ n $ msg \ n ================ \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHttp Content Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint ( msg . content (). toString ( StandardCharsets . UTF _ 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġprintln ("$ msg ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass Ġclient : ĠCli kt Command (" client ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice Ġby Ġoption ("- s "," -- service ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" z iti Ġservice Ġto Ġdial Ġ( not Ġneeded Ġif Ġhostname : port Ġin Ġgiven ĠURL Ġis Ġintercept ed )") ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġby Ġargument ( name Ġ= Ġ" URL ") ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠURL ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtls Ġ= Ġuri . protocol Ġ== Ġ" https " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġif Ġ( uri . port Ġ== Ġ- 1 ) Ġuri . default Port Ġelse Ġuri . port ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloop Group Ġ= ĠDefault EventLoop Group () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbootstrap Ġ= ĠBootstrap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. group ( loop Group ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. resolver ( Z iti Resolver Group ( z iti )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. channel Factory ( Z iti Channel Factory ( z iti )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. handler ( client Init ( uri . host , Ġport , Ġtls )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcl t Future Ġ= Ġservice ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbootstrap . connect ( Z iti Address . Dial ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġbootstrap . connect ( uri . host , Ġport ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcl t Ġ= Ġcl t Future . sync (). channel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcl t . write And Flush ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDefault HttpRequest ( Http Version . HTTP _ 1 _ 1 , ĠHttpMethod . GET , Ġuri . path ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders (). add (" host ", Ġuri . host ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). sync (). await () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcl t . close Future (). sync () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" exception Ġ$ ex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop Group . shutdown Grace fully (). addListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz iti . destroy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass Ġserver : ĠCli kt Command (" server ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice Ġby Ġargument (" service ", Ġ" z iti Ġservice Ġto Ġbind Ġto ") ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Ġ= ĠServer Bootstrap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. group ( Default EventLoop Group ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// . group ( Nio EventLoop Group ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. channel Factory ( Z iti Server Channel Factory ( z iti )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// . channel ( Nio Server SocketChannel :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child Handler ( object Ġ: ĠChannel Initializer < Channel > (){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit Channel ( ch : ĠChannel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" new Ġchild Ġ$ ch ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch . pipeline (). add Last ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpResponse Encoder (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpRequest Decoder (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSample Server Handler () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ. bind ( 1 3 3 3 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind ( Z iti Address . Bind ( service )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sync (). addListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" server Ġfailed Ġto Ġbind Ġ${ it . cause () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . exit ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. channel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" list ening Ġon Ġ${ server . local Address () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver . close Future (). sync () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject Ġcli : ĠCli kt Command (" http - sample ", Ġname Ġ= Ġ" http - sample ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid File Ġby Ġoption ("- i ", Ġ"-- id "). file ( must Be Readable Ġ= Ġtrue ). required () ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub commands ( server (), Ġclient ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġz iti Ġ= ĠZ iti . new Context ( id File , Ġchar ArrayOf ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ= Ġcli . main ( args ) Ċ }