Class HttpObjectEncoder<H extends HttpMessage>

java.lang.Object
All Implemented Interfaces:
ChannelHandler, ChannelOutboundHandler
Direct Known Subclasses:
HttpRequestEncoder, HttpResponseEncoder, RtspEncoder, RtspObjectEncoder

public abstract class HttpObjectEncoder<H extends HttpMessage> extends MessageToMessageEncoder<java.lang.Object>
Encodes an HttpMessage or an HttpContent into a ByteBuf.

Extensibility

Please note that this encoder is designed to be extended to implement a protocol derived from HTTP, such as RTSP and ICAP. To implement the encoder of such a derived protocol, extend this class and implement all abstract methods properly.
  • Field Details

    • COPY_CONTENT_THRESHOLD

      private static final int COPY_CONTENT_THRESHOLD
      See Also:
    • CRLF_SHORT

      static final int CRLF_SHORT
      See Also:
    • ZERO_CRLF_MEDIUM

      private static final int ZERO_CRLF_MEDIUM
      See Also:
    • ZERO_CRLF_CRLF

      private static final byte[] ZERO_CRLF_CRLF
    • CRLF_BUF

      private static final ByteBuf CRLF_BUF
    • ZERO_CRLF_CRLF_BUF

      private static final ByteBuf ZERO_CRLF_CRLF_BUF
    • HEADERS_WEIGHT_NEW

      private static final float HEADERS_WEIGHT_NEW
      See Also:
    • HEADERS_WEIGHT_HISTORICAL

      private static final float HEADERS_WEIGHT_HISTORICAL
      See Also:
    • TRAILERS_WEIGHT_NEW

      private static final float TRAILERS_WEIGHT_NEW
      See Also:
    • TRAILERS_WEIGHT_HISTORICAL

      private static final float TRAILERS_WEIGHT_HISTORICAL
      See Also:
    • ST_INIT

      private static final int ST_INIT
      See Also:
    • ST_CONTENT_NON_CHUNK

      private static final int ST_CONTENT_NON_CHUNK
      See Also:
    • ST_CONTENT_CHUNK

      private static final int ST_CONTENT_CHUNK
      See Also:
    • ST_CONTENT_ALWAYS_EMPTY

      private static final int ST_CONTENT_ALWAYS_EMPTY
      See Also:
    • state

      private int state
    • headersEncodedSizeAccumulator

      private float headersEncodedSizeAccumulator
      Used to calculate an exponential moving average of the encoded size of the initial line and the headers for a guess for future buffer allocations.
    • trailersEncodedSizeAccumulator

      private float trailersEncodedSizeAccumulator
      Used to calculate an exponential moving average of the encoded size of the trailers for a guess for future buffer allocations.
    • out

      private final java.util.List<java.lang.Object> out
    • HEX

      private static final byte[] HEX
  • Constructor Details

    • HttpObjectEncoder

      public HttpObjectEncoder()
  • Method Details

    • checkContentState

      private static boolean checkContentState(int state)
    • write

      public void write(ChannelHandlerContext ctx, java.lang.Object msg, ChannelPromise promise) throws java.lang.Exception
      Description copied from class: ChannelOutboundHandlerAdapter
      Calls ChannelOutboundInvoker.write(Object, ChannelPromise) to forward to the next ChannelOutboundHandler in the ChannelPipeline. Sub-classes may override this method to change behavior.
      Specified by:
      write in interface ChannelOutboundHandler
      Overrides:
      write in class MessageToMessageEncoder<java.lang.Object>
      Parameters:
      ctx - the ChannelHandlerContext for which the write operation is made
      msg - the message to write
      promise - the ChannelPromise to notify once the operation completes
      Throws:
      java.lang.Exception - thrown if an error occurs
    • writeOutList

      private static void writeOutList(ChannelHandlerContext ctx, java.util.List<java.lang.Object> out, ChannelPromise promise)
    • writeVoidPromise

      private static void writeVoidPromise(ChannelHandlerContext ctx, java.util.List<java.lang.Object> out)
    • writePromiseCombiner

      private static void writePromiseCombiner(ChannelHandlerContext ctx, java.util.List<java.lang.Object> out, ChannelPromise promise)
    • encode

      protected void encode(ChannelHandlerContext ctx, java.lang.Object msg, java.util.List<java.lang.Object> out) throws java.lang.Exception
      Description copied from class: MessageToMessageEncoder
      Encode from one message to an other. This method will be called for each written message that can be handled by this encoder.
      Specified by:
      encode in class MessageToMessageEncoder<java.lang.Object>
      Parameters:
      ctx - the ChannelHandlerContext which this MessageToMessageEncoder belongs to
      msg - the message to encode to an other one
      out - the List into which the encoded msg should be added needs to do some kind of aggregation
      Throws:
      java.lang.Exception - is thrown if an error occurs
    • encodeJustHttpMessage

      private void encodeJustHttpMessage(ChannelHandlerContext ctx, H m, java.util.List<java.lang.Object> out) throws java.lang.Exception
      Throws:
      java.lang.Exception
    • encodeByteBufHttpContent

      private void encodeByteBufHttpContent(int state, ChannelHandlerContext ctx, ByteBuf buf, ByteBuf content, HttpHeaders trailingHeaders, java.util.List<java.lang.Object> out)
    • encodeHttpMessageNotLastContent

      private void encodeHttpMessageNotLastContent(ChannelHandlerContext ctx, H m, java.util.List<java.lang.Object> out) throws java.lang.Exception
      Throws:
      java.lang.Exception
    • encodeHttpMessageLastContent

      private void encodeHttpMessageLastContent(ChannelHandlerContext ctx, H m, java.util.List<java.lang.Object> out) throws java.lang.Exception
      Throws:
      java.lang.Exception
    • encodeNotHttpMessageContentTypes

      private void encodeNotHttpMessageContentTypes(ChannelHandlerContext ctx, java.lang.Object msg, java.util.List<java.lang.Object> out)
    • encodeFullHttpMessage

      private void encodeFullHttpMessage(ChannelHandlerContext ctx, java.lang.Object o, java.util.List<java.lang.Object> out) throws java.lang.Exception
      Throws:
      java.lang.Exception
    • encodeContentNonChunk

      private static boolean encodeContentNonChunk(java.util.List<java.lang.Object> out, ByteBuf buf, ByteBuf content)
    • throwUnexpectedMessageTypeEx

      private static void throwUnexpectedMessageTypeEx(java.lang.Object msg, int state)
    • encodeFileRegionContent

      private void encodeFileRegionContent(ChannelHandlerContext ctx, FileRegion msg, java.util.List<java.lang.Object> out)
    • bypassEncoderIfEmpty

      private static boolean bypassEncoderIfEmpty(ByteBuf msg, java.util.List<java.lang.Object> out)
    • encodeByteBufContent

      private void encodeByteBufContent(ChannelHandlerContext ctx, ByteBuf content, java.util.List<java.lang.Object> out)
    • encodeEmptyLastHttpContent

      private static int encodeEmptyLastHttpContent(int state, java.util.List<java.lang.Object> out)
    • encodeLastHttpContent

      private void encodeLastHttpContent(ChannelHandlerContext ctx, LastHttpContent msg, java.util.List<java.lang.Object> out)
    • encodeHttpContent

      private void encodeHttpContent(ChannelHandlerContext ctx, HttpContent msg, java.util.List<java.lang.Object> out)
    • encodeByteBufAndTrailers

      private void encodeByteBufAndTrailers(int state, ChannelHandlerContext ctx, java.util.List<java.lang.Object> out, ByteBuf content, HttpHeaders trailingHeaders)
    • encodeChunkedHttpContent

      private void encodeChunkedHttpContent(ChannelHandlerContext ctx, ByteBuf content, HttpHeaders trailingHeaders, java.util.List<java.lang.Object> out)
    • encodeTrailingHeaders

      private void encodeTrailingHeaders(ChannelHandlerContext ctx, HttpHeaders trailingHeaders, java.util.List<java.lang.Object> out)
    • encodeInitHttpMessage

      private ByteBuf encodeInitHttpMessage(ChannelHandlerContext ctx, H m) throws java.lang.Exception
      Throws:
      java.lang.Exception
    • encodeHeaders

      protected void encodeHeaders(HttpHeaders headers, ByteBuf buf)
      Encode the HttpHeaders into a ByteBuf.
    • encodedChunkedFileRegionContent

      private static void encodedChunkedFileRegionContent(ChannelHandlerContext ctx, FileRegion msg, java.util.List<java.lang.Object> out)
    • addEncodedLengthHex

      private static void addEncodedLengthHex(ChannelHandlerContext ctx, long contentLength, java.util.List<java.lang.Object> out)
    • writeHexAscii

      private static void writeHexAscii(ByteBuf out, long contentLength, int hexLen)
    • sanitizeHeadersBeforeEncode

      protected void sanitizeHeadersBeforeEncode(H msg, boolean isAlwaysEmpty)
      Allows to sanitize headers of the message before encoding these.
    • isContentAlwaysEmpty

      protected boolean isContentAlwaysEmpty(H msg)
      Determine whether a message has a content or not. Some message may have headers indicating a content without having an actual content, e.g the response to an HEAD or CONNECT request.
      Parameters:
      msg - the message to test
      Returns:
      true to signal the message has no content
    • acceptOutboundMessage

      public boolean acceptOutboundMessage(java.lang.Object msg) throws java.lang.Exception
      Description copied from class: MessageToMessageEncoder
      Returns true if the given message should be handled. If false it will be passed to the next ChannelOutboundHandler in the ChannelPipeline.
      Overrides:
      acceptOutboundMessage in class MessageToMessageEncoder<java.lang.Object>
      Throws:
      java.lang.Exception
    • padSizeForAccumulation

      private static int padSizeForAccumulation(int readableBytes)
      Add some additional overhead to the buffer. The rational is that it is better to slightly over allocate and waste some memory, rather than under allocate and require a resize/copy.
      Parameters:
      readableBytes - The readable bytes in the buffer.
      Returns:
      The readableBytes with some additional padding.
    • encodeAscii

      @Deprecated protected static void encodeAscii(java.lang.String s, ByteBuf buf)
      Deprecated.
    • encodeInitialLine

      protected abstract void encodeInitialLine(ByteBuf buf, H message) throws java.lang.Exception
      Throws:
      java.lang.Exception