Class CompressorHttp2ConnectionEncoder

All Implemented Interfaces:
Http2ConnectionEncoder, Http2DataWriter, Http2FrameWriter, Http2SettingsReceivedConsumer, Closeable, AutoCloseable

@UnstableApi public class CompressorHttp2ConnectionEncoder extends DecoratingHttp2ConnectionEncoder
A decorating HTTP2 encoder that will compress data frames according to the content-encoding header for each stream. The compression provided by this class will be applied to the data for the entire stream.
  • Field Details

    • DEFAULT_COMPRESSION_LEVEL

      public static final int DEFAULT_COMPRESSION_LEVEL
      See Also:
    • DEFAULT_WINDOW_BITS

      public static final int DEFAULT_WINDOW_BITS
      See Also:
    • DEFAULT_MEM_LEVEL

      public static final int DEFAULT_MEM_LEVEL
      See Also:
    • compressionLevel

      private int compressionLevel
    • windowBits

      private int windowBits
    • memLevel

      private int memLevel
    • propertyKey

      private final Http2Connection.PropertyKey propertyKey
    • supportsCompressionOptions

      private final boolean supportsCompressionOptions
    • gzipCompressionOptions

      private GzipOptions gzipCompressionOptions
    • deflateOptions

      private DeflateOptions deflateOptions
  • Constructor Details

  • Method Details

    • defaultCompressionOptions

      private static CompressionOptions[] defaultCompressionOptions()
    • writeData

      public ChannelFuture writeData(ChannelHandlerContext ctx, int streamId, ByteBuf data, int padding, boolean endOfStream, ChannelPromise promise)
      Description copied from interface: Http2DataWriter
      Writes a DATA frame to the remote endpoint. This will result in one or more frames being written to the context.
      Specified by:
      writeData in interface Http2DataWriter
      Overrides:
      writeData in class DecoratingHttp2FrameWriter
      Parameters:
      ctx - the context to use for writing.
      streamId - the stream for which to send the frame.
      data - the payload of the frame. This will be released by this method.
      padding - additional bytes that should be added to obscure the true content size. Must be between 0 and 256 (inclusive). A 1 byte padding is encoded as just the pad length field with value 0. A 256 byte padding is encoded as the pad length field with value 255 and 255 padding bytes appended to the end of the frame.
      endOfStream - indicates if this is the last frame to be sent for the stream.
      promise - the promise for the write.
      Returns:
      the future for the write.
    • writeHeaders

      public ChannelFuture writeHeaders(ChannelHandlerContext ctx, int streamId, Http2Headers headers, int padding, boolean endStream, ChannelPromise promise)
      Description copied from interface: Http2FrameWriter
      Writes a HEADERS frame to the remote endpoint.
      Specified by:
      writeHeaders in interface Http2FrameWriter
      Overrides:
      writeHeaders in class DecoratingHttp2FrameWriter
      Parameters:
      ctx - the context to use for writing.
      streamId - the stream for which to send the frame.
      headers - the headers to be sent.
      padding - additional bytes that should be added to obscure the true content size. Must be between 0 and 256 (inclusive).
      endStream - indicates if this is the last frame to be sent for the stream.
      promise - the promise for the write.
      Returns:
      the future for the write. Section 10.5.1 states the following:
       The header block MUST be processed to ensure a consistent connection state, unless the connection is closed.
       
      If this call has modified the HPACK header state you MUST throw a connection error.

      If this call has NOT modified the HPACK header state you are free to throw a stream error.

    • writeHeaders

      public ChannelFuture writeHeaders(ChannelHandlerContext ctx, int streamId, Http2Headers headers, int streamDependency, short weight, boolean exclusive, int padding, boolean endOfStream, ChannelPromise promise)
      Description copied from interface: Http2FrameWriter
      Writes a HEADERS frame with priority specified to the remote endpoint.
      Specified by:
      writeHeaders in interface Http2FrameWriter
      Overrides:
      writeHeaders in class DecoratingHttp2FrameWriter
      Parameters:
      ctx - the context to use for writing.
      streamId - the stream for which to send the frame.
      headers - the headers to be sent.
      streamDependency - the stream on which this stream should depend, or 0 if it should depend on the connection.
      weight - the weight for this stream.
      exclusive - whether this stream should be the exclusive dependant of its parent.
      padding - additional bytes that should be added to obscure the true content size. Must be between 0 and 256 (inclusive).
      endOfStream - indicates if this is the last frame to be sent for the stream.
      promise - the promise for the write.
      Returns:
      the future for the write. Section 10.5.1 states the following:
       The header block MUST be processed to ensure a consistent connection state, unless the connection is closed.
       
      If this call has modified the HPACK header state you MUST throw a connection error.

      If this call has NOT modified the HPACK header state you are free to throw a stream error.

    • newContentCompressor

      protected EmbeddedChannel newContentCompressor(ChannelHandlerContext ctx, CharSequence contentEncoding) throws Http2Exception
      Returns a new EmbeddedChannel that encodes the HTTP2 message content encoded in the specified contentEncoding.
      Parameters:
      ctx - the context.
      contentEncoding - the value of the content-encoding header
      Returns:
      a new ByteToMessageDecoder if the specified encoding is supported. null otherwise (alternatively, you can throw a Http2Exception to block unknown encoding).
      Throws:
      Http2Exception - If the specified encoding is not supported and warrants an exception
    • getTargetContentEncoding

      protected CharSequence getTargetContentEncoding(CharSequence contentEncoding) throws Http2Exception
      Returns the expected content encoding of the decoded content. Returning contentEncoding is the default behavior, which is the case for most compressors.
      Parameters:
      contentEncoding - the value of the content-encoding header
      Returns:
      the expected content encoding of the new content.
      Throws:
      Http2Exception - if the contentEncoding is not supported and warrants an exception
    • newCompressionChannel

      private EmbeddedChannel newCompressionChannel(ChannelHandlerContext ctx, ZlibWrapper wrapper)
      Generate a new instance of an EmbeddedChannel capable of compressing data
      Parameters:
      ctx - the context.
      wrapper - Defines what type of encoder should be used
    • newCompressor

      private EmbeddedChannel newCompressor(ChannelHandlerContext ctx, Http2Headers headers, boolean endOfStream) throws Http2Exception
      Checks if a new compressor object is needed for the stream identified by streamId. This method will modify the content-encoding header contained in headers.
      Parameters:
      ctx - the context.
      headers - Object representing headers which are to be written
      endOfStream - Indicates if the stream has ended
      Returns:
      The channel used to compress data.
      Throws:
      Http2Exception - if any problems occur during initialization.
    • bindCompressorToStream

      private void bindCompressorToStream(EmbeddedChannel compressor, int streamId)
      Called after the super class has written the headers and created any associated stream objects.
      Parameters:
      compressor - The compressor associated with the stream identified by streamId.
      streamId - The stream id for which the headers were written.
    • cleanup

      void cleanup(Http2Stream stream, EmbeddedChannel compressor)
      Release remaining content from EmbeddedChannel and remove the compressor from the Http2Stream.
      Parameters:
      stream - The stream for which compressor is the compressor for
      compressor - The compressor for stream
    • nextReadableBuf

      private static ByteBuf nextReadableBuf(EmbeddedChannel compressor)
      Read the next compressed ByteBuf from the EmbeddedChannel or null if one does not exist.
      Parameters:
      compressor - The channel to read from
      Returns:
      The next decoded ByteBuf from the EmbeddedChannel or null if one does not exist