public class io.netty.example.http.file.HttpStaticFileServerHandler extends io.netty.channel.SimpleChannelInboundHandler<io.netty.handler.codec.http.FullHttpRequest>
  minor version: 0
  major version: 59
  flags: flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: io.netty.example.http.file.HttpStaticFileServerHandler
  super_class: io.netty.channel.SimpleChannelInboundHandler
{
  public static final java.lang.String HTTP_DATE_FORMAT;
    descriptor: Ljava/lang/String;
    flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
    ConstantValue: "EEE, dd MMM yyyy HH:mm:ss zzz"

  public static final java.lang.String HTTP_DATE_GMT_TIMEZONE;
    descriptor: Ljava/lang/String;
    flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
    ConstantValue: "GMT"

  public static final int HTTP_CACHE_SECONDS;
    descriptor: I
    flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
    ConstantValue: 60

  private static final java.util.regex.Pattern INSECURE_URI;
    descriptor: Ljava/util/regex/Pattern;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL

  private static final java.util.regex.Pattern ALLOWED_FILE_NAME;
    descriptor: Ljava/util/regex/Pattern;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL

  static void <clinit>();
    descriptor: ()V
    flags: (0x0008) ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: .line 235
            ldc ".*[<>&\"].*"
            invokestatic java.util.regex.Pattern.compile:(Ljava/lang/String;)Ljava/util/regex/Pattern;
            putstatic io.netty.example.http.file.HttpStaticFileServerHandler.INSECURE_URI:Ljava/util/regex/Pattern;
         1: .line 265
            ldc "[^-\\._]?[^<>&\\\"]*"
            invokestatic java.util.regex.Pattern.compile:(Ljava/lang/String;)Ljava/util/regex/Pattern;
            putstatic io.netty.example.http.file.HttpStaticFileServerHandler.ALLOWED_FILE_NAME:Ljava/util/regex/Pattern;
            return
      LocalVariableTable:
        Start  End  Slot  Name  Signature

  public void <init>();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.netty.example.http.file.HttpStaticFileServerHandler this
         0: .line 107
            aload 0 /* this */
            invokespecial io.netty.channel.SimpleChannelInboundHandler.<init>:()V
            return
        end local 0 // io.netty.example.http.file.HttpStaticFileServerHandler this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/netty/example/http/file/HttpStaticFileServerHandler;

  public void channelRead0(io.netty.channel.ChannelHandlerContext, io.netty.handler.codec.http.FullHttpRequest);
    descriptor: (Lio/netty/channel/ChannelHandlerContext;Lio/netty/handler/codec/http/FullHttpRequest;)V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=11, locals=13, args_size=3
        start local 0 // io.netty.example.http.file.HttpStaticFileServerHandler this
        start local 1 // io.netty.channel.ChannelHandlerContext ctx
        start local 2 // io.netty.handler.codec.http.FullHttpRequest request
         0: .line 115
            aload 2 /* request */
            invokeinterface io.netty.handler.codec.http.FullHttpRequest.decoderResult:()Lio/netty/handler/codec/DecoderResult;
            invokevirtual io.netty.handler.codec.DecoderResult.isSuccess:()Z
            ifne 3
         1: .line 116
            aload 1 /* ctx */
            getstatic io.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST:Lio/netty/handler/codec/http/HttpResponseStatus;
            invokestatic io.netty.example.http.file.HttpStaticFileServerHandler.sendError:(Lio/netty/channel/ChannelHandlerContext;Lio/netty/handler/codec/http/HttpResponseStatus;)V
         2: .line 117
            return
         3: .line 120
      StackMap locals:
      StackMap stack:
            aload 2 /* request */
            invokeinterface io.netty.handler.codec.http.FullHttpRequest.method:()Lio/netty/handler/codec/http/HttpMethod;
            getstatic io.netty.handler.codec.http.HttpMethod.GET:Lio/netty/handler/codec/http/HttpMethod;
            if_acmpeq 6
         4: .line 121
            aload 1 /* ctx */
            getstatic io.netty.handler.codec.http.HttpResponseStatus.METHOD_NOT_ALLOWED:Lio/netty/handler/codec/http/HttpResponseStatus;
            invokestatic io.netty.example.http.file.HttpStaticFileServerHandler.sendError:(Lio/netty/channel/ChannelHandlerContext;Lio/netty/handler/codec/http/HttpResponseStatus;)V
         5: .line 122
            return
         6: .line 125
      StackMap locals:
      StackMap stack:
            aload 2 /* request */
            invokeinterface io.netty.handler.codec.http.FullHttpRequest.uri:()Ljava/lang/String;
            astore 3 /* uri */
        start local 3 // java.lang.String uri
         7: .line 126
            aload 3 /* uri */
            invokestatic io.netty.example.http.file.HttpStaticFileServerHandler.sanitizeUri:(Ljava/lang/String;)Ljava/lang/String;
            astore 4 /* path */
        start local 4 // java.lang.String path
         8: .line 127
            aload 4 /* path */
            ifnonnull 11
         9: .line 128
            aload 1 /* ctx */
            getstatic io.netty.handler.codec.http.HttpResponseStatus.FORBIDDEN:Lio/netty/handler/codec/http/HttpResponseStatus;
            invokestatic io.netty.example.http.file.HttpStaticFileServerHandler.sendError:(Lio/netty/channel/ChannelHandlerContext;Lio/netty/handler/codec/http/HttpResponseStatus;)V
        10: .line 129
            return
        11: .line 132
      StackMap locals: java.lang.String java.lang.String
      StackMap stack:
            new java.io.File
            dup
            aload 4 /* path */
            invokespecial java.io.File.<init>:(Ljava/lang/String;)V
            astore 5 /* file */
        start local 5 // java.io.File file
        12: .line 133
            aload 5 /* file */
            invokevirtual java.io.File.isHidden:()Z
            ifne 13
            aload 5 /* file */
            invokevirtual java.io.File.exists:()Z
            ifne 15
        13: .line 134
      StackMap locals: java.io.File
      StackMap stack:
            aload 1 /* ctx */
            getstatic io.netty.handler.codec.http.HttpResponseStatus.NOT_FOUND:Lio/netty/handler/codec/http/HttpResponseStatus;
            invokestatic io.netty.example.http.file.HttpStaticFileServerHandler.sendError:(Lio/netty/channel/ChannelHandlerContext;Lio/netty/handler/codec/http/HttpResponseStatus;)V
        14: .line 135
            return
        15: .line 138
      StackMap locals:
      StackMap stack:
            aload 5 /* file */
            invokevirtual java.io.File.isDirectory:()Z
            ifeq 21
        16: .line 139
            aload 3 /* uri */
            ldc "/"
            invokevirtual java.lang.String.endsWith:(Ljava/lang/String;)Z
            ifeq 19
        17: .line 140
            aload 1 /* ctx */
            aload 5 /* file */
            aload 3 /* uri */
            invokestatic io.netty.example.http.file.HttpStaticFileServerHandler.sendListing:(Lio/netty/channel/ChannelHandlerContext;Ljava/io/File;Ljava/lang/String;)V
        18: .line 141
            goto 20
        19: .line 142
      StackMap locals:
      StackMap stack:
            aload 1 /* ctx */
            new java.lang.StringBuilder
            dup
            aload 3 /* uri */
            invokestatic java.lang.String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
            invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
            bipush 47
            invokevirtual java.lang.StringBuilder.append:(C)Ljava/lang/StringBuilder;
            invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
            invokestatic io.netty.example.http.file.HttpStaticFileServerHandler.sendRedirect:(Lio/netty/channel/ChannelHandlerContext;Ljava/lang/String;)V
        20: .line 144
      StackMap locals:
      StackMap stack:
            return
        21: .line 147
      StackMap locals:
      StackMap stack:
            aload 5 /* file */
            invokevirtual java.io.File.isFile:()Z
            ifne 24
        22: .line 148
            aload 1 /* ctx */
            getstatic io.netty.handler.codec.http.HttpResponseStatus.FORBIDDEN:Lio/netty/handler/codec/http/HttpResponseStatus;
            invokestatic io.netty.example.http.file.HttpStaticFileServerHandler.sendError:(Lio/netty/channel/ChannelHandlerContext;Lio/netty/handler/codec/http/HttpResponseStatus;)V
        23: .line 149
            return
        24: .line 153
      StackMap locals:
      StackMap stack:
            aload 2 /* request */
            invokeinterface io.netty.handler.codec.http.FullHttpRequest.headers:()Lio/netty/handler/codec/http/HttpHeaders;
            getstatic io.netty.handler.codec.http.HttpHeaderNames.IF_MODIFIED_SINCE:Lio/netty/util/AsciiString;
            invokevirtual io.netty.handler.codec.http.HttpHeaders.get:(Ljava/lang/CharSequence;)Ljava/lang/String;
            astore 6 /* ifModifiedSince */
        start local 6 // java.lang.String ifModifiedSince
        25: .line 154
            aload 6 /* ifModifiedSince */
            ifnull 33
            aload 6 /* ifModifiedSince */
            invokevirtual java.lang.String.isEmpty:()Z
            ifne 33
        26: .line 155
            new java.text.SimpleDateFormat
            dup
            ldc "EEE, dd MMM yyyy HH:mm:ss zzz"
            getstatic java.util.Locale.US:Ljava/util/Locale;
            invokespecial java.text.SimpleDateFormat.<init>:(Ljava/lang/String;Ljava/util/Locale;)V
            astore 7 /* dateFormatter */
        start local 7 // java.text.SimpleDateFormat dateFormatter
        27: .line 156
            aload 7 /* dateFormatter */
            aload 6 /* ifModifiedSince */
            invokevirtual java.text.SimpleDateFormat.parse:(Ljava/lang/String;)Ljava/util/Date;
            astore 8 /* ifModifiedSinceDate */
        start local 8 // java.util.Date ifModifiedSinceDate
        28: .line 160
            aload 8 /* ifModifiedSinceDate */
            invokevirtual java.util.Date.getTime:()J
            ldc 1000
            ldiv
            lstore 9 /* ifModifiedSinceDateSeconds */
        start local 9 // long ifModifiedSinceDateSeconds
        29: .line 161
            aload 5 /* file */
            invokevirtual java.io.File.lastModified:()J
            ldc 1000
            ldiv
            lstore 11 /* fileLastModifiedSeconds */
        start local 11 // long fileLastModifiedSeconds
        30: .line 162
            lload 9 /* ifModifiedSinceDateSeconds */
            lload 11 /* fileLastModifiedSeconds */
            lcmp
            ifne 33
        31: .line 163
            aload 1 /* ctx */
            invokestatic io.netty.example.http.file.HttpStaticFileServerHandler.sendNotModified:(Lio/netty/channel/ChannelHandlerContext;)V
        32: .line 164
            return
        end local 11 // long fileLastModifiedSeconds
        end local 9 // long ifModifiedSinceDateSeconds
        end local 8 // java.util.Date ifModifiedSinceDate
        end local 7 // java.text.SimpleDateFormat dateFormatter
        33: .line 170
      StackMap locals: java.lang.String
      StackMap stack:
            new java.io.RandomAccessFile
            dup
            aload 5 /* file */
            ldc "r"
            invokespecial java.io.RandomAccessFile.<init>:(Ljava/io/File;Ljava/lang/String;)V
            astore 7 /* raf */
        start local 7 // java.io.RandomAccessFile raf
        34: .line 171
            goto 38
        end local 7 // java.io.RandomAccessFile raf
      StackMap locals:
      StackMap stack: java.io.FileNotFoundException
        35: pop
        36: .line 172
            aload 1 /* ctx */
            getstatic io.netty.handler.codec.http.HttpResponseStatus.NOT_FOUND:Lio/netty/handler/codec/http/HttpResponseStatus;
            invokestatic io.netty.example.http.file.HttpStaticFileServerHandler.sendError:(Lio/netty/channel/ChannelHandlerContext;Lio/netty/handler/codec/http/HttpResponseStatus;)V
        37: .line 173
            return
        start local 7 // java.io.RandomAccessFile raf
        38: .line 175
      StackMap locals: java.io.RandomAccessFile
      StackMap stack:
            aload 7 /* raf */
            invokevirtual java.io.RandomAccessFile.length:()J
            lstore 8 /* fileLength */
        start local 8 // long fileLength
        39: .line 177
            new io.netty.handler.codec.http.DefaultHttpResponse
            dup
            getstatic io.netty.handler.codec.http.HttpVersion.HTTP_1_1:Lio/netty/handler/codec/http/HttpVersion;
            getstatic io.netty.handler.codec.http.HttpResponseStatus.OK:Lio/netty/handler/codec/http/HttpResponseStatus;
            invokespecial io.netty.handler.codec.http.DefaultHttpResponse.<init>:(Lio/netty/handler/codec/http/HttpVersion;Lio/netty/handler/codec/http/HttpResponseStatus;)V
            astore 10 /* response */
        start local 10 // io.netty.handler.codec.http.HttpResponse response
        40: .line 178
            aload 10 /* response */
            lload 8 /* fileLength */
            invokestatic io.netty.handler.codec.http.HttpUtil.setContentLength:(Lio/netty/handler/codec/http/HttpMessage;J)V
        41: .line 179
            aload 10 /* response */
            aload 5 /* file */
            invokestatic io.netty.example.http.file.HttpStaticFileServerHandler.setContentTypeHeader:(Lio/netty/handler/codec/http/HttpResponse;Ljava/io/File;)V
        42: .line 180
            aload 10 /* response */
            aload 5 /* file */
            invokestatic io.netty.example.http.file.HttpStaticFileServerHandler.setDateAndCacheHeaders:(Lio/netty/handler/codec/http/HttpResponse;Ljava/io/File;)V
        43: .line 181
            aload 2 /* request */
            invokestatic io.netty.handler.codec.http.HttpUtil.isKeepAlive:(Lio/netty/handler/codec/http/HttpMessage;)Z
            ifeq 45
        44: .line 182
            aload 10 /* response */
            invokeinterface io.netty.handler.codec.http.HttpResponse.headers:()Lio/netty/handler/codec/http/HttpHeaders;
            getstatic io.netty.handler.codec.http.HttpHeaderNames.CONNECTION:Lio/netty/util/AsciiString;
            getstatic io.netty.handler.codec.http.HttpHeaderValues.KEEP_ALIVE:Lio/netty/util/AsciiString;
            invokevirtual io.netty.handler.codec.http.HttpHeaders.set:(Ljava/lang/CharSequence;Ljava/lang/Object;)Lio/netty/handler/codec/http/HttpHeaders;
            pop
        45: .line 186
      StackMap locals: long io.netty.handler.codec.http.HttpResponse
      StackMap stack:
            aload 1 /* ctx */
            aload 10 /* response */
            invokeinterface io.netty.channel.ChannelHandlerContext.write:(Ljava/lang/Object;)Lio/netty/channel/ChannelFuture;
            pop
        46: .line 191
            aload 1 /* ctx */
            invokeinterface io.netty.channel.ChannelHandlerContext.pipeline:()Lio/netty/channel/ChannelPipeline;
            ldc Lio/netty/handler/ssl/SslHandler;
            invokeinterface io.netty.channel.ChannelPipeline.get:(Ljava/lang/Class;)Lio/netty/channel/ChannelHandler;
            ifnonnull 51
        47: .line 193
            aload 1 /* ctx */
            new io.netty.channel.DefaultFileRegion
            dup
            aload 7 /* raf */
            invokevirtual java.io.RandomAccessFile.getChannel:()Ljava/nio/channels/FileChannel;
            lconst_0
            lload 8 /* fileLength */
            invokespecial io.netty.channel.DefaultFileRegion.<init>:(Ljava/nio/channels/FileChannel;JJ)V
            aload 1 /* ctx */
            invokeinterface io.netty.channel.ChannelHandlerContext.newProgressivePromise:()Lio/netty/channel/ChannelProgressivePromise;
            invokeinterface io.netty.channel.ChannelHandlerContext.write:(Ljava/lang/Object;Lio/netty/channel/ChannelPromise;)Lio/netty/channel/ChannelFuture;
        48: .line 192
            astore 11 /* sendFileFuture */
        start local 11 // io.netty.channel.ChannelFuture sendFileFuture
        49: .line 195
            aload 1 /* ctx */
            getstatic io.netty.handler.codec.http.LastHttpContent.EMPTY_LAST_CONTENT:Lio/netty/handler/codec/http/LastHttpContent;
            invokeinterface io.netty.channel.ChannelHandlerContext.writeAndFlush:(Ljava/lang/Object;)Lio/netty/channel/ChannelFuture;
            astore 12 /* lastContentFuture */
        start local 12 // io.netty.channel.ChannelFuture lastContentFuture
        50: .line 196
            goto 56
        end local 12 // io.netty.channel.ChannelFuture lastContentFuture
        end local 11 // io.netty.channel.ChannelFuture sendFileFuture
        51: .line 198
      StackMap locals:
      StackMap stack:
            aload 1 /* ctx */
            new io.netty.handler.codec.http.HttpChunkedInput
            dup
            new io.netty.handler.stream.ChunkedFile
            dup
            aload 7 /* raf */
            lconst_0
            lload 8 /* fileLength */
            sipush 8192
            invokespecial io.netty.handler.stream.ChunkedFile.<init>:(Ljava/io/RandomAccessFile;JJI)V
            invokespecial io.netty.handler.codec.http.HttpChunkedInput.<init>:(Lio/netty/handler/stream/ChunkedInput;)V
        52: .line 199
            aload 1 /* ctx */
            invokeinterface io.netty.channel.ChannelHandlerContext.newProgressivePromise:()Lio/netty/channel/ChannelProgressivePromise;
        53: .line 198
            invokeinterface io.netty.channel.ChannelHandlerContext.writeAndFlush:(Ljava/lang/Object;Lio/netty/channel/ChannelPromise;)Lio/netty/channel/ChannelFuture;
        54: .line 197
            astore 11 /* sendFileFuture */
        start local 11 // io.netty.channel.ChannelFuture sendFileFuture
        55: .line 201
            aload 11 /* sendFileFuture */
            astore 12 /* lastContentFuture */
        start local 12 // io.netty.channel.ChannelFuture lastContentFuture
        56: .line 204
      StackMap locals: io.netty.channel.ChannelFuture io.netty.channel.ChannelFuture
      StackMap stack:
            aload 11 /* sendFileFuture */
            new io.netty.example.http.file.HttpStaticFileServerHandler$1
            dup
            aload 0 /* this */
            invokespecial io.netty.example.http.file.HttpStaticFileServerHandler$1.<init>:(Lio/netty/example/http/file/HttpStaticFileServerHandler;)V
            invokeinterface io.netty.channel.ChannelFuture.addListener:(Lio/netty/util/concurrent/GenericFutureListener;)Lio/netty/channel/ChannelFuture;
            pop
        57: .line 221
            aload 2 /* request */
            invokestatic io.netty.handler.codec.http.HttpUtil.isKeepAlive:(Lio/netty/handler/codec/http/HttpMessage;)Z
            ifne 59
        58: .line 223
            aload 12 /* lastContentFuture */
            getstatic io.netty.channel.ChannelFutureListener.CLOSE:Lio/netty/channel/ChannelFutureListener;
            invokeinterface io.netty.channel.ChannelFuture.addListener:(Lio/netty/util/concurrent/GenericFutureListener;)Lio/netty/channel/ChannelFuture;
            pop
        59: .line 225
      StackMap locals:
      StackMap stack:
            return
        end local 12 // io.netty.channel.ChannelFuture lastContentFuture
        end local 11 // io.netty.channel.ChannelFuture sendFileFuture
        end local 10 // io.netty.handler.codec.http.HttpResponse response
        end local 8 // long fileLength
        end local 7 // java.io.RandomAccessFile raf
        end local 6 // java.lang.String ifModifiedSince
        end local 5 // java.io.File file
        end local 4 // java.lang.String path
        end local 3 // java.lang.String uri
        end local 2 // io.netty.handler.codec.http.FullHttpRequest request
        end local 1 // io.netty.channel.ChannelHandlerContext ctx
        end local 0 // io.netty.example.http.file.HttpStaticFileServerHandler this
      LocalVariableTable:
        Start  End  Slot                        Name  Signature
            0   60     0                        this  Lio/netty/example/http/file/HttpStaticFileServerHandler;
            0   60     1                         ctx  Lio/netty/channel/ChannelHandlerContext;
            0   60     2                     request  Lio/netty/handler/codec/http/FullHttpRequest;
            7   60     3                         uri  Ljava/lang/String;
            8   60     4                        path  Ljava/lang/String;
           12   60     5                        file  Ljava/io/File;
           25   60     6             ifModifiedSince  Ljava/lang/String;
           27   33     7               dateFormatter  Ljava/text/SimpleDateFormat;
           28   33     8         ifModifiedSinceDate  Ljava/util/Date;
           29   33     9  ifModifiedSinceDateSeconds  J
           30   33    11     fileLastModifiedSeconds  J
           34   35     7                         raf  Ljava/io/RandomAccessFile;
           38   60     7                         raf  Ljava/io/RandomAccessFile;
           39   60     8                  fileLength  J
           40   60    10                    response  Lio/netty/handler/codec/http/HttpResponse;
           49   51    11              sendFileFuture  Lio/netty/channel/ChannelFuture;
           55   60    11              sendFileFuture  Lio/netty/channel/ChannelFuture;
           50   51    12           lastContentFuture  Lio/netty/channel/ChannelFuture;
           56   60    12           lastContentFuture  Lio/netty/channel/ChannelFuture;
      Exception table:
        from    to  target  type
          33    34      35  Class java.io.FileNotFoundException
    Exceptions:
      throws java.lang.Exception
    MethodParameters:
         Name  Flags
      ctx      
      request  

  public void exceptionCaught(io.netty.channel.ChannelHandlerContext, java.lang.Throwable);
    descriptor: (Lio/netty/channel/ChannelHandlerContext;Ljava/lang/Throwable;)V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=3, args_size=3
        start local 0 // io.netty.example.http.file.HttpStaticFileServerHandler this
        start local 1 // io.netty.channel.ChannelHandlerContext ctx
        start local 2 // java.lang.Throwable cause
         0: .line 229
            aload 2 /* cause */
            invokevirtual java.lang.Throwable.printStackTrace:()V
         1: .line 230
            aload 1 /* ctx */
            invokeinterface io.netty.channel.ChannelHandlerContext.channel:()Lio/netty/channel/Channel;
            invokeinterface io.netty.channel.Channel.isActive:()Z
            ifeq 3
         2: .line 231
            aload 1 /* ctx */
            getstatic io.netty.handler.codec.http.HttpResponseStatus.INTERNAL_SERVER_ERROR:Lio/netty/handler/codec/http/HttpResponseStatus;
            invokestatic io.netty.example.http.file.HttpStaticFileServerHandler.sendError:(Lio/netty/channel/ChannelHandlerContext;Lio/netty/handler/codec/http/HttpResponseStatus;)V
         3: .line 233
      StackMap locals:
      StackMap stack:
            return
        end local 2 // java.lang.Throwable cause
        end local 1 // io.netty.channel.ChannelHandlerContext ctx
        end local 0 // io.netty.example.http.file.HttpStaticFileServerHandler this
      LocalVariableTable:
        Start  End  Slot   Name  Signature
            0    4     0   this  Lio/netty/example/http/file/HttpStaticFileServerHandler;
            0    4     1    ctx  Lio/netty/channel/ChannelHandlerContext;
            0    4     2  cause  Ljava/lang/Throwable;
    MethodParameters:
       Name  Flags
      ctx    
      cause  

  private static java.lang.String sanitizeUri(java.lang.String);
    descriptor: (Ljava/lang/String;)Ljava/lang/String;
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=4, locals=2, args_size=1
        start local 0 // java.lang.String uri
         0: .line 240
            aload 0 /* uri */
            ldc "UTF-8"
            invokestatic java.net.URLDecoder.decode:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
            astore 0 /* uri */
         1: .line 241
            goto 4
      StackMap locals:
      StackMap stack: java.io.UnsupportedEncodingException
         2: astore 1 /* e */
        start local 1 // java.io.UnsupportedEncodingException e
         3: .line 242
            new java.lang.Error
            dup
            aload 1 /* e */
            invokespecial java.lang.Error.<init>:(Ljava/lang/Throwable;)V
            athrow
        end local 1 // java.io.UnsupportedEncodingException e
         4: .line 245
      StackMap locals:
      StackMap stack:
            aload 0 /* uri */
            invokevirtual java.lang.String.isEmpty:()Z
            ifne 5
            aload 0 /* uri */
            iconst_0
            invokevirtual java.lang.String.charAt:(I)C
            bipush 47
            if_icmpeq 6
         5: .line 246
      StackMap locals:
      StackMap stack:
            aconst_null
            areturn
         6: .line 250
      StackMap locals:
      StackMap stack:
            aload 0 /* uri */
            bipush 47
            getstatic java.io.File.separatorChar:C
            invokevirtual java.lang.String.replace:(CC)Ljava/lang/String;
            astore 0 /* uri */
         7: .line 254
            aload 0 /* uri */
            new java.lang.StringBuilder
            dup
            getstatic java.io.File.separator:Ljava/lang/String;
            invokestatic java.lang.String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
            invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
            bipush 46
            invokevirtual java.lang.StringBuilder.append:(C)Ljava/lang/StringBuilder;
            invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
            invokevirtual java.lang.String.contains:(Ljava/lang/CharSequence;)Z
            ifne 11
         8: .line 255
            aload 0 /* uri */
            new java.lang.StringBuilder
            dup
            bipush 46
            invokestatic java.lang.String.valueOf:(C)Ljava/lang/String;
            invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
            getstatic java.io.File.separator:Ljava/lang/String;
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
            invokevirtual java.lang.String.contains:(Ljava/lang/CharSequence;)Z
            ifne 11
         9: .line 256
            aload 0 /* uri */
            iconst_0
            invokevirtual java.lang.String.charAt:(I)C
            bipush 46
            if_icmpeq 11
            aload 0 /* uri */
            aload 0 /* uri */
            invokevirtual java.lang.String.length:()I
            iconst_1
            isub
            invokevirtual java.lang.String.charAt:(I)C
            bipush 46
            if_icmpeq 11
        10: .line 257
            getstatic io.netty.example.http.file.HttpStaticFileServerHandler.INSECURE_URI:Ljava/util/regex/Pattern;
            aload 0 /* uri */
            invokevirtual java.util.regex.Pattern.matcher:(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;
            invokevirtual java.util.regex.Matcher.matches:()Z
            ifeq 12
        11: .line 258
      StackMap locals:
      StackMap stack:
            aconst_null
            areturn
        12: .line 262
      StackMap locals:
      StackMap stack:
            new java.lang.StringBuilder
            dup
            ldc "user.dir"
            invokestatic io.netty.util.internal.SystemPropertyUtil.get:(Ljava/lang/String;)Ljava/lang/String;
            invokestatic java.lang.String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
            invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
            getstatic java.io.File.separator:Ljava/lang/String;
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            aload 0 /* uri */
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
            areturn
        end local 0 // java.lang.String uri
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0   13     0   uri  Ljava/lang/String;
            3    4     1     e  Ljava/io/UnsupportedEncodingException;
      Exception table:
        from    to  target  type
           0     1       2  Class java.io.UnsupportedEncodingException
    MethodParameters:
      Name  Flags
      uri   

  private static void sendListing(io.netty.channel.ChannelHandlerContext, java.io.File, java.lang.String);
    descriptor: (Lio/netty/channel/ChannelHandlerContext;Ljava/io/File;Ljava/lang/String;)V
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=4, locals=10, args_size=3
        start local 0 // io.netty.channel.ChannelHandlerContext ctx
        start local 1 // java.io.File dir
        start local 2 // java.lang.String dirPath
         0: .line 268
            new io.netty.handler.codec.http.DefaultFullHttpResponse
            dup
            getstatic io.netty.handler.codec.http.HttpVersion.HTTP_1_1:Lio/netty/handler/codec/http/HttpVersion;
            getstatic io.netty.handler.codec.http.HttpResponseStatus.OK:Lio/netty/handler/codec/http/HttpResponseStatus;
            invokespecial io.netty.handler.codec.http.DefaultFullHttpResponse.<init>:(Lio/netty/handler/codec/http/HttpVersion;Lio/netty/handler/codec/http/HttpResponseStatus;)V
            astore 3 /* response */
        start local 3 // io.netty.handler.codec.http.FullHttpResponse response
         1: .line 269
            aload 3 /* response */
            invokeinterface io.netty.handler.codec.http.FullHttpResponse.headers:()Lio/netty/handler/codec/http/HttpHeaders;
            getstatic io.netty.handler.codec.http.HttpHeaderNames.CONTENT_TYPE:Lio/netty/util/AsciiString;
            ldc "text/html; charset=UTF-8"
            invokevirtual io.netty.handler.codec.http.HttpHeaders.set:(Ljava/lang/CharSequence;Ljava/lang/Object;)Lio/netty/handler/codec/http/HttpHeaders;
            pop
         2: .line 271
            new java.lang.StringBuilder
            dup
            invokespecial java.lang.StringBuilder.<init>:()V
         3: .line 272
            ldc "<!DOCTYPE html>\r\n"
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
         4: .line 273
            ldc "<html><head><meta charset='utf-8' /><title>"
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
         5: .line 274
            ldc "Listing of: "
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
         6: .line 275
            aload 2 /* dirPath */
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
         7: .line 276
            ldc "</title></head><body>\r\n"
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
         8: .line 278
            ldc "<h3>Listing of: "
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
         9: .line 279
            aload 2 /* dirPath */
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        10: .line 280
            ldc "</h3>\r\n"
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        11: .line 282
            ldc "<ul>"
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        12: .line 283
            ldc "<li><a href=\"../\">..</a></li>\r\n"
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        13: .line 271
            astore 4 /* buf */
        start local 4 // java.lang.StringBuilder buf
        14: .line 285
            aload 1 /* dir */
            invokevirtual java.io.File.listFiles:()[Ljava/io/File;
            dup
            astore 8
            arraylength
            istore 7
            iconst_0
            istore 6
            goto 27
      StackMap locals: io.netty.channel.ChannelHandlerContext java.io.File java.lang.String io.netty.handler.codec.http.FullHttpResponse java.lang.StringBuilder top int int java.io.File[]
      StackMap stack:
        15: aload 8
            iload 6
            aaload
            astore 5 /* f */
        start local 5 // java.io.File f
        16: .line 286
            aload 5 /* f */
            invokevirtual java.io.File.isHidden:()Z
            ifne 26
            aload 5 /* f */
            invokevirtual java.io.File.canRead:()Z
            ifne 18
        17: .line 287
            goto 26
        18: .line 290
      StackMap locals: io.netty.channel.ChannelHandlerContext java.io.File java.lang.String io.netty.handler.codec.http.FullHttpResponse java.lang.StringBuilder java.io.File int int java.io.File[]
      StackMap stack:
            aload 5 /* f */
            invokevirtual java.io.File.getName:()Ljava/lang/String;
            astore 9 /* name */
        start local 9 // java.lang.String name
        19: .line 291
            getstatic io.netty.example.http.file.HttpStaticFileServerHandler.ALLOWED_FILE_NAME:Ljava/util/regex/Pattern;
            aload 9 /* name */
            invokevirtual java.util.regex.Pattern.matcher:(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;
            invokevirtual java.util.regex.Matcher.matches:()Z
            ifne 21
        20: .line 292
            goto 26
        21: .line 295
      StackMap locals: java.lang.String
      StackMap stack:
            aload 4 /* buf */
            ldc "<li><a href=\""
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        22: .line 296
            aload 9 /* name */
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        23: .line 297
            ldc "\">"
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        24: .line 298
            aload 9 /* name */
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        25: .line 299
            ldc "</a></li>\r\n"
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            pop
        end local 9 // java.lang.String name
        end local 5 // java.io.File f
        26: .line 285
      StackMap locals: io.netty.channel.ChannelHandlerContext java.io.File java.lang.String io.netty.handler.codec.http.FullHttpResponse java.lang.StringBuilder top int int java.io.File[]
      StackMap stack:
            iinc 6 1
      StackMap locals:
      StackMap stack:
        27: iload 6
            iload 7
            if_icmplt 15
        28: .line 302
            aload 4 /* buf */
            ldc "</ul></body></html>\r\n"
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            pop
        29: .line 303
            aload 4 /* buf */
            getstatic io.netty.util.CharsetUtil.UTF_8:Ljava/nio/charset/Charset;
            invokestatic io.netty.buffer.Unpooled.copiedBuffer:(Ljava/lang/CharSequence;Ljava/nio/charset/Charset;)Lio/netty/buffer/ByteBuf;
            astore 5 /* buffer */
        start local 5 // io.netty.buffer.ByteBuf buffer
        30: .line 304
            aload 3 /* response */
            invokeinterface io.netty.handler.codec.http.FullHttpResponse.content:()Lio/netty/buffer/ByteBuf;
            aload 5 /* buffer */
            invokevirtual io.netty.buffer.ByteBuf.writeBytes:(Lio/netty/buffer/ByteBuf;)Lio/netty/buffer/ByteBuf;
            pop
        31: .line 305
            aload 5 /* buffer */
            invokevirtual io.netty.buffer.ByteBuf.release:()Z
            pop
        32: .line 308
            aload 0 /* ctx */
            aload 3 /* response */
            invokeinterface io.netty.channel.ChannelHandlerContext.writeAndFlush:(Ljava/lang/Object;)Lio/netty/channel/ChannelFuture;
            getstatic io.netty.channel.ChannelFutureListener.CLOSE:Lio/netty/channel/ChannelFutureListener;
            invokeinterface io.netty.channel.ChannelFuture.addListener:(Lio/netty/util/concurrent/GenericFutureListener;)Lio/netty/channel/ChannelFuture;
            pop
        33: .line 309
            return
        end local 5 // io.netty.buffer.ByteBuf buffer
        end local 4 // java.lang.StringBuilder buf
        end local 3 // io.netty.handler.codec.http.FullHttpResponse response
        end local 2 // java.lang.String dirPath
        end local 1 // java.io.File dir
        end local 0 // io.netty.channel.ChannelHandlerContext ctx
      LocalVariableTable:
        Start  End  Slot      Name  Signature
            0   34     0       ctx  Lio/netty/channel/ChannelHandlerContext;
            0   34     1       dir  Ljava/io/File;
            0   34     2   dirPath  Ljava/lang/String;
            1   34     3  response  Lio/netty/handler/codec/http/FullHttpResponse;
           14   34     4       buf  Ljava/lang/StringBuilder;
           16   26     5         f  Ljava/io/File;
           19   26     9      name  Ljava/lang/String;
           30   34     5    buffer  Lio/netty/buffer/ByteBuf;
    MethodParameters:
         Name  Flags
      ctx      
      dir      
      dirPath  

  private static void sendRedirect(io.netty.channel.ChannelHandlerContext, java.lang.String);
    descriptor: (Lio/netty/channel/ChannelHandlerContext;Ljava/lang/String;)V
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=4, locals=3, args_size=2
        start local 0 // io.netty.channel.ChannelHandlerContext ctx
        start local 1 // java.lang.String newUri
         0: .line 312
            new io.netty.handler.codec.http.DefaultFullHttpResponse
            dup
            getstatic io.netty.handler.codec.http.HttpVersion.HTTP_1_1:Lio/netty/handler/codec/http/HttpVersion;
            getstatic io.netty.handler.codec.http.HttpResponseStatus.FOUND:Lio/netty/handler/codec/http/HttpResponseStatus;
            invokespecial io.netty.handler.codec.http.DefaultFullHttpResponse.<init>:(Lio/netty/handler/codec/http/HttpVersion;Lio/netty/handler/codec/http/HttpResponseStatus;)V
            astore 2 /* response */
        start local 2 // io.netty.handler.codec.http.FullHttpResponse response
         1: .line 313
            aload 2 /* response */
            invokeinterface io.netty.handler.codec.http.FullHttpResponse.headers:()Lio/netty/handler/codec/http/HttpHeaders;
            getstatic io.netty.handler.codec.http.HttpHeaderNames.LOCATION:Lio/netty/util/AsciiString;
            aload 1 /* newUri */
            invokevirtual io.netty.handler.codec.http.HttpHeaders.set:(Ljava/lang/CharSequence;Ljava/lang/Object;)Lio/netty/handler/codec/http/HttpHeaders;
            pop
         2: .line 316
            aload 0 /* ctx */
            aload 2 /* response */
            invokeinterface io.netty.channel.ChannelHandlerContext.writeAndFlush:(Ljava/lang/Object;)Lio/netty/channel/ChannelFuture;
            getstatic io.netty.channel.ChannelFutureListener.CLOSE:Lio/netty/channel/ChannelFutureListener;
            invokeinterface io.netty.channel.ChannelFuture.addListener:(Lio/netty/util/concurrent/GenericFutureListener;)Lio/netty/channel/ChannelFuture;
            pop
         3: .line 317
            return
        end local 2 // io.netty.handler.codec.http.FullHttpResponse response
        end local 1 // java.lang.String newUri
        end local 0 // io.netty.channel.ChannelHandlerContext ctx
      LocalVariableTable:
        Start  End  Slot      Name  Signature
            0    4     0       ctx  Lio/netty/channel/ChannelHandlerContext;
            0    4     1    newUri  Ljava/lang/String;
            1    4     2  response  Lio/netty/handler/codec/http/FullHttpResponse;
    MethodParameters:
        Name  Flags
      ctx     
      newUri  

  private static void sendError(io.netty.channel.ChannelHandlerContext, io.netty.handler.codec.http.HttpResponseStatus);
    descriptor: (Lio/netty/channel/ChannelHandlerContext;Lio/netty/handler/codec/http/HttpResponseStatus;)V
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=7, locals=3, args_size=2
        start local 0 // io.netty.channel.ChannelHandlerContext ctx
        start local 1 // io.netty.handler.codec.http.HttpResponseStatus status
         0: .line 320
            new io.netty.handler.codec.http.DefaultFullHttpResponse
            dup
         1: .line 321
            getstatic io.netty.handler.codec.http.HttpVersion.HTTP_1_1:Lio/netty/handler/codec/http/HttpVersion;
            aload 1 /* status */
            new java.lang.StringBuilder
            dup
            ldc "Failure: "
            invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
            aload 1 /* status */
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
            ldc "\r\n"
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
            getstatic io.netty.util.CharsetUtil.UTF_8:Ljava/nio/charset/Charset;
            invokestatic io.netty.buffer.Unpooled.copiedBuffer:(Ljava/lang/CharSequence;Ljava/nio/charset/Charset;)Lio/netty/buffer/ByteBuf;
         2: .line 320
            invokespecial io.netty.handler.codec.http.DefaultFullHttpResponse.<init>:(Lio/netty/handler/codec/http/HttpVersion;Lio/netty/handler/codec/http/HttpResponseStatus;Lio/netty/buffer/ByteBuf;)V
            astore 2 /* response */
        start local 2 // io.netty.handler.codec.http.FullHttpResponse response
         3: .line 322
            aload 2 /* response */
            invokeinterface io.netty.handler.codec.http.FullHttpResponse.headers:()Lio/netty/handler/codec/http/HttpHeaders;
            getstatic io.netty.handler.codec.http.HttpHeaderNames.CONTENT_TYPE:Lio/netty/util/AsciiString;
            ldc "text/plain; charset=UTF-8"
            invokevirtual io.netty.handler.codec.http.HttpHeaders.set:(Ljava/lang/CharSequence;Ljava/lang/Object;)Lio/netty/handler/codec/http/HttpHeaders;
            pop
         4: .line 325
            aload 0 /* ctx */
            aload 2 /* response */
            invokeinterface io.netty.channel.ChannelHandlerContext.writeAndFlush:(Ljava/lang/Object;)Lio/netty/channel/ChannelFuture;
            getstatic io.netty.channel.ChannelFutureListener.CLOSE:Lio/netty/channel/ChannelFutureListener;
            invokeinterface io.netty.channel.ChannelFuture.addListener:(Lio/netty/util/concurrent/GenericFutureListener;)Lio/netty/channel/ChannelFuture;
            pop
         5: .line 326
            return
        end local 2 // io.netty.handler.codec.http.FullHttpResponse response
        end local 1 // io.netty.handler.codec.http.HttpResponseStatus status
        end local 0 // io.netty.channel.ChannelHandlerContext ctx
      LocalVariableTable:
        Start  End  Slot      Name  Signature
            0    6     0       ctx  Lio/netty/channel/ChannelHandlerContext;
            0    6     1    status  Lio/netty/handler/codec/http/HttpResponseStatus;
            3    6     2  response  Lio/netty/handler/codec/http/FullHttpResponse;
    MethodParameters:
        Name  Flags
      ctx     
      status  

  private static void sendNotModified(io.netty.channel.ChannelHandlerContext);
    descriptor: (Lio/netty/channel/ChannelHandlerContext;)V
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=4, locals=2, args_size=1
        start local 0 // io.netty.channel.ChannelHandlerContext ctx
         0: .line 335
            new io.netty.handler.codec.http.DefaultFullHttpResponse
            dup
            getstatic io.netty.handler.codec.http.HttpVersion.HTTP_1_1:Lio/netty/handler/codec/http/HttpVersion;
            getstatic io.netty.handler.codec.http.HttpResponseStatus.NOT_MODIFIED:Lio/netty/handler/codec/http/HttpResponseStatus;
            invokespecial io.netty.handler.codec.http.DefaultFullHttpResponse.<init>:(Lio/netty/handler/codec/http/HttpVersion;Lio/netty/handler/codec/http/HttpResponseStatus;)V
            astore 1 /* response */
        start local 1 // io.netty.handler.codec.http.FullHttpResponse response
         1: .line 336
            aload 1 /* response */
            invokestatic io.netty.example.http.file.HttpStaticFileServerHandler.setDateHeader:(Lio/netty/handler/codec/http/FullHttpResponse;)V
         2: .line 339
            aload 0 /* ctx */
            aload 1 /* response */
            invokeinterface io.netty.channel.ChannelHandlerContext.writeAndFlush:(Ljava/lang/Object;)Lio/netty/channel/ChannelFuture;
            getstatic io.netty.channel.ChannelFutureListener.CLOSE:Lio/netty/channel/ChannelFutureListener;
            invokeinterface io.netty.channel.ChannelFuture.addListener:(Lio/netty/util/concurrent/GenericFutureListener;)Lio/netty/channel/ChannelFuture;
            pop
         3: .line 340
            return
        end local 1 // io.netty.handler.codec.http.FullHttpResponse response
        end local 0 // io.netty.channel.ChannelHandlerContext ctx
      LocalVariableTable:
        Start  End  Slot      Name  Signature
            0    4     0       ctx  Lio/netty/channel/ChannelHandlerContext;
            1    4     1  response  Lio/netty/handler/codec/http/FullHttpResponse;
    MethodParameters:
      Name  Flags
      ctx   

  private static void setDateHeader(io.netty.handler.codec.http.FullHttpResponse);
    descriptor: (Lio/netty/handler/codec/http/FullHttpResponse;)V
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=4, locals=3, args_size=1
        start local 0 // io.netty.handler.codec.http.FullHttpResponse response
         0: .line 349
            new java.text.SimpleDateFormat
            dup
            ldc "EEE, dd MMM yyyy HH:mm:ss zzz"
            getstatic java.util.Locale.US:Ljava/util/Locale;
            invokespecial java.text.SimpleDateFormat.<init>:(Ljava/lang/String;Ljava/util/Locale;)V
            astore 1 /* dateFormatter */
        start local 1 // java.text.SimpleDateFormat dateFormatter
         1: .line 350
            aload 1 /* dateFormatter */
            ldc "GMT"
            invokestatic java.util.TimeZone.getTimeZone:(Ljava/lang/String;)Ljava/util/TimeZone;
            invokevirtual java.text.SimpleDateFormat.setTimeZone:(Ljava/util/TimeZone;)V
         2: .line 352
            new java.util.GregorianCalendar
            dup
            invokespecial java.util.GregorianCalendar.<init>:()V
            astore 2 /* time */
        start local 2 // java.util.Calendar time
         3: .line 353
            aload 0 /* response */
            invokeinterface io.netty.handler.codec.http.FullHttpResponse.headers:()Lio/netty/handler/codec/http/HttpHeaders;
            getstatic io.netty.handler.codec.http.HttpHeaderNames.DATE:Lio/netty/util/AsciiString;
            aload 1 /* dateFormatter */
            aload 2 /* time */
            invokevirtual java.util.Calendar.getTime:()Ljava/util/Date;
            invokevirtual java.text.SimpleDateFormat.format:(Ljava/util/Date;)Ljava/lang/String;
            invokevirtual io.netty.handler.codec.http.HttpHeaders.set:(Ljava/lang/CharSequence;Ljava/lang/Object;)Lio/netty/handler/codec/http/HttpHeaders;
            pop
         4: .line 354
            return
        end local 2 // java.util.Calendar time
        end local 1 // java.text.SimpleDateFormat dateFormatter
        end local 0 // io.netty.handler.codec.http.FullHttpResponse response
      LocalVariableTable:
        Start  End  Slot           Name  Signature
            0    5     0       response  Lio/netty/handler/codec/http/FullHttpResponse;
            1    5     1  dateFormatter  Ljava/text/SimpleDateFormat;
            3    5     2           time  Ljava/util/Calendar;
    MethodParameters:
          Name  Flags
      response  

  private static void setDateAndCacheHeaders(io.netty.handler.codec.http.HttpResponse, java.io.File);
    descriptor: (Lio/netty/handler/codec/http/HttpResponse;Ljava/io/File;)V
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=7, locals=4, args_size=2
        start local 0 // io.netty.handler.codec.http.HttpResponse response
        start local 1 // java.io.File fileToCache
         0: .line 365
            new java.text.SimpleDateFormat
            dup
            ldc "EEE, dd MMM yyyy HH:mm:ss zzz"
            getstatic java.util.Locale.US:Ljava/util/Locale;
            invokespecial java.text.SimpleDateFormat.<init>:(Ljava/lang/String;Ljava/util/Locale;)V
            astore 2 /* dateFormatter */
        start local 2 // java.text.SimpleDateFormat dateFormatter
         1: .line 366
            aload 2 /* dateFormatter */
            ldc "GMT"
            invokestatic java.util.TimeZone.getTimeZone:(Ljava/lang/String;)Ljava/util/TimeZone;
            invokevirtual java.text.SimpleDateFormat.setTimeZone:(Ljava/util/TimeZone;)V
         2: .line 369
            new java.util.GregorianCalendar
            dup
            invokespecial java.util.GregorianCalendar.<init>:()V
            astore 3 /* time */
        start local 3 // java.util.Calendar time
         3: .line 370
            aload 0 /* response */
            invokeinterface io.netty.handler.codec.http.HttpResponse.headers:()Lio/netty/handler/codec/http/HttpHeaders;
            getstatic io.netty.handler.codec.http.HttpHeaderNames.DATE:Lio/netty/util/AsciiString;
            aload 2 /* dateFormatter */
            aload 3 /* time */
            invokevirtual java.util.Calendar.getTime:()Ljava/util/Date;
            invokevirtual java.text.SimpleDateFormat.format:(Ljava/util/Date;)Ljava/lang/String;
            invokevirtual io.netty.handler.codec.http.HttpHeaders.set:(Ljava/lang/CharSequence;Ljava/lang/Object;)Lio/netty/handler/codec/http/HttpHeaders;
            pop
         4: .line 373
            aload 3 /* time */
            bipush 13
            bipush 60
            invokevirtual java.util.Calendar.add:(II)V
         5: .line 374
            aload 0 /* response */
            invokeinterface io.netty.handler.codec.http.HttpResponse.headers:()Lio/netty/handler/codec/http/HttpHeaders;
            getstatic io.netty.handler.codec.http.HttpHeaderNames.EXPIRES:Lio/netty/util/AsciiString;
            aload 2 /* dateFormatter */
            aload 3 /* time */
            invokevirtual java.util.Calendar.getTime:()Ljava/util/Date;
            invokevirtual java.text.SimpleDateFormat.format:(Ljava/util/Date;)Ljava/lang/String;
            invokevirtual io.netty.handler.codec.http.HttpHeaders.set:(Ljava/lang/CharSequence;Ljava/lang/Object;)Lio/netty/handler/codec/http/HttpHeaders;
            pop
         6: .line 375
            aload 0 /* response */
            invokeinterface io.netty.handler.codec.http.HttpResponse.headers:()Lio/netty/handler/codec/http/HttpHeaders;
            getstatic io.netty.handler.codec.http.HttpHeaderNames.CACHE_CONTROL:Lio/netty/util/AsciiString;
            ldc "private, max-age=60"
            invokevirtual io.netty.handler.codec.http.HttpHeaders.set:(Ljava/lang/CharSequence;Ljava/lang/Object;)Lio/netty/handler/codec/http/HttpHeaders;
            pop
         7: .line 376
            aload 0 /* response */
            invokeinterface io.netty.handler.codec.http.HttpResponse.headers:()Lio/netty/handler/codec/http/HttpHeaders;
         8: .line 377
            getstatic io.netty.handler.codec.http.HttpHeaderNames.LAST_MODIFIED:Lio/netty/util/AsciiString;
            aload 2 /* dateFormatter */
            new java.util.Date
            dup
            aload 1 /* fileToCache */
            invokevirtual java.io.File.lastModified:()J
            invokespecial java.util.Date.<init>:(J)V
            invokevirtual java.text.SimpleDateFormat.format:(Ljava/util/Date;)Ljava/lang/String;
         9: .line 376
            invokevirtual io.netty.handler.codec.http.HttpHeaders.set:(Ljava/lang/CharSequence;Ljava/lang/Object;)Lio/netty/handler/codec/http/HttpHeaders;
            pop
        10: .line 378
            return
        end local 3 // java.util.Calendar time
        end local 2 // java.text.SimpleDateFormat dateFormatter
        end local 1 // java.io.File fileToCache
        end local 0 // io.netty.handler.codec.http.HttpResponse response
      LocalVariableTable:
        Start  End  Slot           Name  Signature
            0   11     0       response  Lio/netty/handler/codec/http/HttpResponse;
            0   11     1    fileToCache  Ljava/io/File;
            1   11     2  dateFormatter  Ljava/text/SimpleDateFormat;
            3   11     3           time  Ljava/util/Calendar;
    MethodParameters:
             Name  Flags
      response     
      fileToCache  

  private static void setContentTypeHeader(io.netty.handler.codec.http.HttpResponse, java.io.File);
    descriptor: (Lio/netty/handler/codec/http/HttpResponse;Ljava/io/File;)V
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=4, locals=3, args_size=2
        start local 0 // io.netty.handler.codec.http.HttpResponse response
        start local 1 // java.io.File file
         0: .line 389
            new javax.activation.MimetypesFileTypeMap
            dup
            invokespecial javax.activation.MimetypesFileTypeMap.<init>:()V
            astore 2 /* mimeTypesMap */
        start local 2 // javax.activation.MimetypesFileTypeMap mimeTypesMap
         1: .line 390
            aload 0 /* response */
            invokeinterface io.netty.handler.codec.http.HttpResponse.headers:()Lio/netty/handler/codec/http/HttpHeaders;
            getstatic io.netty.handler.codec.http.HttpHeaderNames.CONTENT_TYPE:Lio/netty/util/AsciiString;
            aload 2 /* mimeTypesMap */
            aload 1 /* file */
            invokevirtual java.io.File.getPath:()Ljava/lang/String;
            invokevirtual javax.activation.MimetypesFileTypeMap.getContentType:(Ljava/lang/String;)Ljava/lang/String;
            invokevirtual io.netty.handler.codec.http.HttpHeaders.set:(Ljava/lang/CharSequence;Ljava/lang/Object;)Lio/netty/handler/codec/http/HttpHeaders;
            pop
         2: .line 391
            return
        end local 2 // javax.activation.MimetypesFileTypeMap mimeTypesMap
        end local 1 // java.io.File file
        end local 0 // io.netty.handler.codec.http.HttpResponse response
      LocalVariableTable:
        Start  End  Slot          Name  Signature
            0    3     0      response  Lio/netty/handler/codec/http/HttpResponse;
            0    3     1          file  Ljava/io/File;
            1    3     2  mimeTypesMap  Ljavax/activation/MimetypesFileTypeMap;
    MethodParameters:
          Name  Flags
      response  
      file      

  public void channelRead0(io.netty.channel.ChannelHandlerContext, java.lang.Object);
    descriptor: (Lio/netty/channel/ChannelHandlerContext;Ljava/lang/Object;)V
    flags: (0x1041) ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC
    Code:
      stack=3, locals=3, args_size=3
         0: .line 1
            aload 0
            aload 1
            aload 2
            checkcast io.netty.handler.codec.http.FullHttpRequest
            invokevirtual io.netty.example.http.file.HttpStaticFileServerHandler.channelRead0:(Lio/netty/channel/ChannelHandlerContext;Lio/netty/handler/codec/http/FullHttpRequest;)V
            return
      LocalVariableTable:
        Start  End  Slot  Name  Signature
    Exceptions:
      throws java.lang.Exception
}
Signature: Lio/netty/channel/SimpleChannelInboundHandler<Lio/netty/handler/codec/http/FullHttpRequest;>;
SourceFile: "HttpStaticFileServerHandler.java"
NestMembers:
  io.netty.example.http.file.HttpStaticFileServerHandler$1
InnerClasses:
  io.netty.example.http.file.HttpStaticFileServerHandler$1