package Ġorg . http 4 k . server Ċ Ċ import Ġio . netty . channel . Channel HandlerContext Ċ import Ġio . netty . channel . Channel Inbound Handler Adapter Ċ import Ġio . netty . handler . codec . http . Default Full HttpResponse Ċ import Ġio . netty . handler . codec . http . Http Header Names Ċ import Ġio . netty . handler . codec . http . Http Header Values Ċ import Ġio . netty . handler . codec . http . HttpRequest Ċ import Ġio . netty . handler . codec . http . HttpResponse Status Ċ import Ġio . netty . handler . codec . http . Http Version Ċ import Ġio . netty . handler . codec . http . websocket x . WebSocket Server Protocol Config Ċ import Ġio . netty . handler . codec . http . websocket x . WebSocket Server Protocol Handler Ċ import Ġorg . http 4 k . core . Method Ċ import Ġorg . http 4 k . core . Request Ċ import Ġorg . http 4 k . core . Request Source Ċ import Ġorg . http 4 k . core . Uri Ċ import Ġorg . http 4 k . websocket . Ws Handler Ċ import Ġjava . net . Inet SocketAddress Ċ Ċ class ĠWebSocket Server Handler ( private Ġval Ġws Handler : ĠW s Handler ) Ġ: ĠChannel Inbound Handler Adapter () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġchannel Read ( ctx : ĠChannel HandlerContext , Ġmsg : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( msg Ġis ĠHttpRequest ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( requires Upgrade ( msg )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= Ġctx . channel (). remote Address () Ġas ĠInet SocketAddress ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupgrade Request Ġ= Ġmsg . as Request ( address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġws Consumer Ġ= Ġws Handler ( upgrade Request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ws Consumer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig = ĠWebSocket Server Protocol Config . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. handle Close Frames ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. websocket Path ("/") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check StartsWith ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . pipeline (). add After ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . name (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" handshake Listener ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject : ĠChannel Inbound Handler Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġuser Event Triggered ( ctx : ĠChannel HandlerContext , Ġevt : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( evt Ġis ĠWebSocket Server Protocol Handler . Handshake Complete ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . pipeline (). add After ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . name (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp 4 k Ws Channel Handler :: class . java . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp 4 k Ws Channel Handler ( ws Consumer , Ġupgrade Request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . pipeline (). add After ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . name (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWebSocket Server Protocol Handler :: class . java . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWebSocket Server Protocol Handler ( config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write ( Default Full HttpResponse ( Http Version . HTTP _ 1 _ 1 , ĠHttpResponse Status . SERVICE _ UN AVAILABLE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . fire Channel Read ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . fire Channel Read ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . fire Channel Read ( msg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequires Upgrade ( httpRequest : ĠHttpRequest ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= ĠhttpRequest . headers () ĊĠĠĠĠĠĠĠ Ġreturn Ġheaders . contains Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Header Names . CONNECTION , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Header Values . UP GR ADE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ) Ġ&& Ġheaders ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Header Names . UP GR ADE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Header Values . WEB SOCKET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠHttpRequest . as Request ( address : ĠInet SocketAddress ) Ġ= ĊĠĠĠĠĠĠĠ ĠRequest ( Method . valueOf ( method (). name ()), ĠUri . of ( uri ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. headers ( headers (). map Ġ{ Ġit . key Ġto Ġit . value Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. source ( Request Source ( address . address . host Address , Ġaddress . port )) Ċ } Ċ