Class WebSocketServerExtensionHandler

  • All Implemented Interfaces:
    ChannelHandler, ChannelInboundHandler, ChannelOutboundHandler
    Direct Known Subclasses:
    WebSocketServerCompressionHandler

    public class WebSocketServerExtensionHandler
    extends ChannelDuplexHandler
    This handler negotiates and initializes the WebSocket Extensions. It negotiates the extensions based on the client desired order, ensures that the successfully negotiated extensions are consistent between them, and initializes the channel pipeline with the extension decoder and encoder. Find a basic implementation for compression extensions at io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketServerCompressionHandler.
    • Constructor Detail

      • WebSocketServerExtensionHandler

        public WebSocketServerExtensionHandler​(WebSocketServerExtensionHandshaker... extensionHandshakers)
        Constructor
        Parameters:
        extensionHandshakers - The extension handshaker in priority order. A handshaker could be repeated many times with fallback configuration.
    • Method Detail

      • onHttpRequestChannelRead

        protected void onHttpRequestChannelRead​(ChannelHandlerContext ctx,
                                                HttpRequest request)
                                         throws java.lang.Exception
        This is a method exposed to perform fail-fast checks of user-defined http types.

        eg:
        If the user has defined a specific HttpRequest type i.e.CustomHttpRequest and channelRead(io.netty.channel.ChannelHandlerContext, java.lang.Object) can receive LastHttpContent.EMPTY_LAST_CONTENT msg types too, can override it like this:

             public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                 if (msg != LastHttpContent.EMPTY_LAST_CONTENT) {
                     if (msg instanceof CustomHttpRequest) {
                         onHttpRequestChannelRead(ctx, (CustomHttpRequest) msg);
                     } else {
                         // if it's handling other HttpRequest types it MUST use onHttpRequestChannelRead again
                         // or have to delegate it to super.channelRead (that can perform redundant checks).
                         // If msg is not implementing HttpRequest, it can call ctx.fireChannelRead(msg) on it
                         // ...
                         super.channelRead(ctx, msg);
                     }
                 } else {
                     // given that msg isn't a HttpRequest type we can just skip calling super.channelRead
                     ctx.fireChannelRead(msg);
                 }
             }
         
        IMPORTANT: It already call super.channelRead(ctx, request) before returning.
        Throws:
        java.lang.Exception
      • onHttpResponseWrite

        protected void onHttpResponseWrite​(ChannelHandlerContext ctx,
                                           HttpResponse response,
                                           ChannelPromise promise)
                                    throws java.lang.Exception
        This is a method exposed to perform fail-fast checks of user-defined http types.

        eg:
        If the user has defined a specific HttpResponse type i.e.CustomHttpResponse and write(io.netty.channel.ChannelHandlerContext, java.lang.Object, io.netty.channel.ChannelPromise) can receive ByteBuf msg types too, it can be overridden like this:

             public void write(final ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
                 if (msg != Unpooled.EMPTY_BUFFER && !(msg instanceof ByteBuf)) {
                     if (msg instanceof CustomHttpResponse) {
                         onHttpResponseWrite(ctx, (CustomHttpResponse) msg, promise);
                     } else {
                         // if it's handling other HttpResponse types it MUST use onHttpResponseWrite again
                         // or have to delegate it to super.write (that can perform redundant checks).
                         // If msg is not implementing HttpResponse, it can call ctx.write(msg, promise) on it
                         // ...
                         super.write(ctx, msg, promise);
                     }
                 } else {
                     // given that msg isn't a HttpResponse type we can just skip calling super.write
                     ctx.write(msg, promise);
                 }
             }
         
        IMPORTANT: It already call super.write(ctx, response, promise) before returning.
        Throws:
        java.lang.Exception