// ĠCopyright Ġ 2 0 0 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġorg . jetbrains . io Ċ Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġcom . intellij . openapi . diagnostic . logger Ċ import Ġcom . intellij . util . Array Util Ċ import Ġcom . intellij . util . Exception Util Ċ import Ġcom . intellij . util . Platform Utils Ċ import Ġcom . intellij . util . System Properties Ċ import Ġcom . intellij . util . io . server Bootstrap Ċ import Ġio . netty . bootstrap . Server Bootstrap Ċ import Ġio . netty . channel .* Ċ import Ġio . netty . channel . nio . Nio EventLoop Group Ċ import Ġjava . net . Inet Address Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Thread Factory Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ // ĠSome Ġant iv iral Ġsoftware Ġdetect Ġvir uses Ġby Ġthe Ġfact Ġof Ġaccessing Ġthese Ġports Ġso Ġwe Ġshould Ġnot Ġtouch Ġthem Ġto Ġappear Ġin noc ent . Ċ private Ġval ĠFOR BID DEN _ PORTS Ġ= Ġint ArrayOf ( 6 9 5 3 , Ġ 6 9 6 9 , Ġ 6 9 7 0 ) Ċ Ċ class ĠBuilt In Server Ġprivate Ġconstructor ( val Ġevent Loop Group : ĠEvent Loop Group , Ġval Ġport : ĠInt , Ġprivate Ġval Ġchannel Registrar : ĠChannel Registrar ) Ġ: ĠDis posable Ġ{ ĊĠ Ġval Ġis Running : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġ! channel Registrar . isEmpty ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġ// ĠIDEA - 1 2 0 8 1 1 ĊĠĠĠĠĠ Ġif Ġ( System Properties . getBoolean Property (" io . netty . random . id ", Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem . setProperty (" io . netty . machine Id ", Ġ" 2 8 : f 0 : 7 6 : ff : fe : 1 6 : 6 5 : 0 e ") ĊĠĠĠĠĠĠĠ ĠSystem . setProperty (" io . netty . process Id ", ĠInteger . toString ( Random (). nextInt ( 6 5 5 3 5 ))) ĊĠĠĠĠĠĠĠ ĠSystem . setProperty (" io . netty . service Thread Prefix ", Ġ" Net ty Ġ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// yout rack . jetbrains . com / issue / IDE A - 2 0 8 9 0 8 ĊĠĠĠĠĠĠĠ Ġval Ġnum A ren as Ġ= Ġif Ġ( Platform Utils . is Ide a Community ()) Ġ" 1 " Ġelse Ġ" 2 " ĊĠĠĠĠĠĠĠ ĠSystem . setProperty (" io . netty . allocator . num Direct A ren as ", Ġnum A ren as ) ĊĠĠĠĠĠĠĠ ĠSystem . setProperty (" io . netty . allocator . num Heap A ren as ", Ġnum A ren as ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġval Ġrecommended Worker Count : ĠInt ĊĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( Platform Utils . is Ide a Community ()) Ġ 2 Ġelse Ġ 3 ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġstart ( worker Count : ĠInt , Ġfirst Port : ĠInt , Ġports Count : ĠInt , Ġtry Any Port : ĠBoolean Ġ= Ġfalse , Ġhandler : Ġ(() Ġ-> ĠChannel Handler )? Ġ= Ġnull ): ĠBuilt In Server Ġ{ ĊĠĠĠĠĠ Ġreturn Ġstart ( multi Thread EventLoop Group ( worker Count , ĠBuilt In Server Thread Factory ()), Ġtrue , Ġfirst Port , Ġports Count , Ġtry Any Port , Ġhandler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġstart Nio Or O io ( worker Count : ĠInt , Ġfirst Port : ĠInt , Ġports Count : ĠInt , Ġtry Any Port : ĠBoolean , Ġhandler : Ġ(() Ġ-> ĠChannel Handler )? ): ĠBuilt In Server Ġ{ ĊĠĠĠĠĠ Ġval Ġthread Factory Ġ= ĠBuilt In Server Thread Factory () ĊĠĠĠĠĠ Ġval Ġloop Group : ĠEvent Loop Group Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġmulti Thread EventLoop Group ( worker Count , Ġthread Factory ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger < BuiltIn Server >(). warn ( e ) ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠ Ġio . netty . channel . o io . O io EventLoop Group ( 1 , Ġthread Factory ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġstart ( loop Group , Ġtrue , Ġfirst Port , Ġports Count , Ġtry Any Port , Ġhandler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġstart ( event Loop Group : ĠEvent Loop Group , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis EventLoop Group Owner : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Port : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġports Count : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Any Port : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler : Ġ(() Ġ-> ĠChannel Handler )? ): ĠBuilt In Server Ġ{ ĊĠĠĠĠĠ Ġval Ġchannel Registrar Ġ= ĠChannel Registrar () ĊĠĠĠĠĠ Ġval Ġbootstrap Ġ= Ġserver Bootstrap ( event Loop Group ) ĊĠĠĠĠĠ Ġconfigure Child Handler ( bootstrap , Ġchannel Registrar , Ġhandler ) ĊĠĠĠĠĠ Ġval Ġport Ġ= Ġbind ( first Port , Ġports Count , Ġtry Any Port , Ġbootstrap , Ġchannel Registrar , Ġis EventLoop Group Owner ) ĊĠĠĠĠĠ Ġreturn ĠBuilt In Server ( event Loop Group , Ġport , Ġchannel Registrar ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġconfigure Child Handler ( bootstrap : ĠServer Bootstrap , Ġchannel Registrar : ĠChannel Registrar , Ġchannel Handler : Ġ(() Ġ-> ĠChannel Handler )? ) Ġ{ ĊĠĠĠĠĠ Ġval Ġport Un ification Server Handler Ġ= Ġif Ġ( channel Handler Ġ== Ġnull ) ĠPort Un ification Server Handler () Ġelse Ġnull ĊĠĠĠĠĠ Ġbootstrap . child Handler ( object Ġ: ĠChannel Initializer < Channel >(), ĠChannel Handler Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit Channel ( channel : ĠChannel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġchannel . pipeline (). add Last ( channel Registrar , Ġchannel Handler ?. invoke () Ġ?: Ġport Un ification Server Handler ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġbind ( first Port : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġports Count : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Any Port : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbootstrap : ĠServer Bootstrap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Registrar : ĠChannel Registrar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis EventLoop Group Owner : ĠBoolean ): ĠInt Ġ{ ĊĠĠĠĠĠ Ġval Ġaddress Ġ= ĠInet Address . get Loop back Address () ĊĊĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġports Count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġfirst Port Ġ+ Ġi ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Array Util . indexOf ( FOR BID DEN _ PORTS , Ġi ) Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġbootstrap . bind ( address , Ġport ). await Un interrupt ibly () ĊĠĠĠĠĠĠĠ Ġif Ġ( future . is Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġchannel Registrar . set Server Channel ( future . channel (), Ġis EventLoop Group Owner ) ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġport ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ(! try Any Port Ġ&& Ġi Ġ== Ġports Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠException Util . re throw All ( future . cause ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġlogger < BuiltIn Server >(). info (" We Ġcannot Ġbind Ġto Ġour Ġdefault Ġrange , Ġso , Ġtry Ġto Ġbind Ġto Ġany Ġfree Ġport ") ĊĠĠĠĠĠ Ġval Ġfuture Ġ= Ġbootstrap . bind ( address , Ġ 0 ). await Un interrupt ibly () ĊĠĠĠĠĠ Ġif Ġ( future . is Success ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchannel Registrar . set Server Channel ( future . channel (), Ġis EventLoop Group Owner ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ( future . channel (). local Address () Ġas ĠInet SocketAddress ). port ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠException Util . re throw All ( future . cause ()) ĊĠĠĠĠĠ Ġ// Ġunreachable ĊĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġreplace Default Handler ( context : ĠChannel HandlerContext , Ġchannel Handler : ĠChannel Handler ) Ġ{ ĊĠĠĠĠĠ Ġcontext . pipeline (). replace ( Delegating HttpRequest Handler :: class . java , Ġ" re placed Default Handler ", Ġchannel Handler ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠ Ġchannel Registrar . close () ĊĠĠĠ Ġlogger < BuiltIn Server >(). info (" web Ġserver Ġstopped ") ĊĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠBuilt In Server Thread Factory Ġ: ĠThread Factory Ġ{ ĊĠ Ġprivate Ġval Ġcounter Ġ= ĠAtomicInteger () ĊĊĠ Ġoverride Ġfun Ġnew Thread ( r : ĠRunnable ): ĠThread Ġ{ ĊĠĠĠ Ġreturn ĠThread ( r , Ġ" Net ty ĠBuiltin ĠServer Ġ" Ġ+ Ġcounter . increment AndGet ()) ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġmulti Thread EventLoop Group ( worker Count : ĠInt , Ġthread Factory : ĠThread Factory ): ĠMult ith read EventLoop Group Ġ{ Ċ // Ġ Ġif Ġ( System Info . is Mac OSS i erra Ġ&& ĠSystem Properties . getBoolean Property (" native . net . io ", Ġfalse )) Ġ{ Ċ // ĠĠĠ Ġtry Ġ{ Ċ // ĠĠĠĠĠ Ġreturn ĠK Queue EventLoop Group ( worker Count , Ġthread Factory ) Ċ // ĠĠĠ Ġ} Ċ // ĠĠĠ Ġcatch Ġ( e : ĠThrowable ) Ġ{ Ċ // ĠĠĠĠĠ Ġlogger < BuiltIn Server >(). warn (" Cannot Ġuse Ġnative Ġevent Ġloop Ġgroup ", Ġe ) Ċ // ĠĠĠ Ġ} Ċ // Ġ Ġ} ĊĊĠ Ġreturn ĠN io EventLoop Group ( worker Count , Ġthread Factory ) Ċ }