Class HttpCodecFilter

java.lang.Object
org.glassfish.grizzly.filterchain.BaseFilter
org.glassfish.grizzly.http.HttpBaseFilter
org.glassfish.grizzly.http.HttpCodecFilter
All Implemented Interfaces:
org.glassfish.grizzly.filterchain.Filter, org.glassfish.grizzly.monitoring.MonitoringAware<HttpProbe>
Direct Known Subclasses:
HttpClientFilter, HttpServerFilter

public abstract class HttpCodecFilter extends HttpBaseFilter implements org.glassfish.grizzly.monitoring.MonitoringAware<HttpProbe>
The Filter, responsible for transforming Buffer into HttpPacket and vice versa in asynchronous mode. When the HttpCodecFilter is added to a FilterChain, on read phase it consumes incoming Buffer and provides HttpContent as the result of transformation. On write phase the HttpCodecFilter consumes input HttpPacket and serializes it to a Buffer, which gets passed farther as the result of transformation. So transformations, provided by this filter are following: (read phase): Buffer -> HttpContent (write phase): HttpPacket -> Buffer.
Author:
Alexey Stashok
See Also:
  • Field Details

    • DEFAULT_MAX_HTTP_PACKET_HEADER_SIZE

      public static final int DEFAULT_MAX_HTTP_PACKET_HEADER_SIZE
      See Also:
    • CLOSE_BYTES

      protected static final byte[] CLOSE_BYTES
      Close bytes.
    • KEEPALIVE_BYTES

      protected static final byte[] KEEPALIVE_BYTES
      Keep-alive bytes.
    • contentEncodings

      protected final org.glassfish.grizzly.utils.ArraySet<ContentEncoding> contentEncodings
    • chunkingEnabled

      protected final boolean chunkingEnabled
    • maxPayloadRemainderToSkip

      protected long maxPayloadRemainderToSkip
      The maximum request payload remainder (in bytes) HttpServerFilter will try to swallow after HTTP request processing is over in order to keep the connection alive. If the remainder is too large - HttpServerFilter will close the connection.
    • monitoringConfig

      protected final org.glassfish.grizzly.monitoring.DefaultMonitoringConfig<HttpProbe> monitoringConfig
      File cache probes
    • maxHeadersSize

      protected final int maxHeadersSize
    • preserveHeaderCase

      protected boolean preserveHeaderCase
  • Constructor Details

    • HttpCodecFilter

      public HttpCodecFilter(boolean chunkingEnabled, int maxHeadersSize)
      Constructor, which creates HttpCodecFilter instance, with the specific max header size parameter.
      Parameters:
      chunkingEnabled - true if the chunked transfer encoding should be used when no explicit content length has been set.
      maxHeadersSize - the maximum size of the HTTP message header.
  • Method Details

    • onHttpPacketParsed

      protected abstract boolean onHttpPacketParsed(HttpHeader httpHeader, org.glassfish.grizzly.filterchain.FilterChainContext ctx)
      Callback method, called when HttpPacket parsing has been completed.
      Parameters:
      httpHeader - HttpHeader, which represents parsed HTTP packet header
      ctx - processing context.
      Returns:
      true if an error has occurred while processing the header portion of the HTTP request, otherwise returns false.s
    • onHttpHeaderParsed

      protected abstract boolean onHttpHeaderParsed(HttpHeader httpHeader, org.glassfish.grizzly.Buffer buffer, org.glassfish.grizzly.filterchain.FilterChainContext ctx)
      Callback invoked when the HTTP message header parsing is complete.
      Parameters:
      httpHeader - HttpHeader, which represents parsed HTTP packet header
      buffer - Buffer the header was parsed from
      ctx - processing context.
      Returns:
      true if an error has occurred while processing the header portion of the HTTP request, otherwise returns false.
    • onInitialLineParsed

      protected abstract void onInitialLineParsed(HttpHeader httpHeader, org.glassfish.grizzly.filterchain.FilterChainContext ctx)

      Invoked when either the request line or status line has been parsed.

      Parameters:
      httpHeader - HttpHeader, which represents HTTP packet header
      ctx - processing context.
    • onInitialLineEncoded

      protected abstract void onInitialLineEncoded(HttpHeader httpHeader, org.glassfish.grizzly.filterchain.FilterChainContext ctx)

      Invoked when the initial response line has been encoded in preparation to being transmitted to the user-agent.

      Parameters:
      httpHeader - HttpHeader, which represents HTTP packet header
      ctx - processing context.
      Since:
      2.1.2
    • onHttpHeadersParsed

      protected abstract void onHttpHeadersParsed(HttpHeader httpHeader, MimeHeaders headers, org.glassfish.grizzly.filterchain.FilterChainContext ctx)

      Invoked when HTTP headers portion comes for HttpHeader message. Depending on the transfer encoding being used by the current request, this method may be invoked multiple times.

      Parameters:
      httpHeader - HttpHeader, which represents HTTP packet header
      headers - the headers portion, that has been parsed
      ctx - processing context.
    • onHttpHeadersEncoded

      protected abstract void onHttpHeadersEncoded(HttpHeader httpHeader, org.glassfish.grizzly.filterchain.FilterChainContext ctx)

      Invoked when HTTP headers have been encoded in preparation to being transmitted to the user-agent.

      Parameters:
      httpHeader - HttpHeader, which represents HTTP packet header
      ctx - processing context.
      Since:
      2.1.2
    • onHttpContentParsed

      protected abstract void onHttpContentParsed(HttpContent content, org.glassfish.grizzly.filterchain.FilterChainContext ctx)

      Invoked as request/response body content has been processed by this Filter.

      Parameters:
      content - request/response body content
      ctx - processing context.
    • onHttpContentEncoded

      protected abstract void onHttpContentEncoded(HttpContent content, org.glassfish.grizzly.filterchain.FilterChainContext ctx)

      Invoked when a HTTP body chunk has been encoded in preparation to being transmitted to the user-agent.

      Parameters:
      content - HttpContent, which represents HTTP packet header
      ctx - processing context.
      Since:
      2.1.2
    • onHttpHeaderError

      protected abstract void onHttpHeaderError(HttpHeader httpHeader, org.glassfish.grizzly.filterchain.FilterChainContext ctx, Throwable t) throws IOException

      Callback which is invoked when parsing an HTTP message header fails. The processing logic has to take care about error handling and following connection closing.

      Parameters:
      httpHeader - HttpHeader, which represents HTTP packet header
      ctx - the FilterChainContext processing this request
      t - the cause of the error
      Throws:
      IOException
    • onHttpContentError

      protected abstract void onHttpContentError(HttpHeader httpHeader, org.glassfish.grizzly.filterchain.FilterChainContext ctx, Throwable t) throws IOException

      Callback which is invoked when parsing an HTTP message payload fails. The processing logic has to take care about error handling and following connection closing.

      Parameters:
      httpHeader - HttpHeader, which represents HTTP packet header
      ctx - the FilterChainContext processing this request
      t - the cause of the error
      Throws:
      IOException
    • getMaxPayloadRemainderToSkip

      public long getMaxPayloadRemainderToSkip()
      Returns:
      the maximum request payload remainder (in bytes) HttpServerFilter will try to swallow after HTTP request processing is over in order to keep the connection alive. If the remainder is too large - the connection will be closed. -1 means no limits will be applied.
      Since:
      2.3.13
    • setMaxPayloadRemainderToSkip

      public void setMaxPayloadRemainderToSkip(long maxPayloadRemainderToSkip)
      Set the maximum request payload remainder (in bytes) HttpServerFilter will try to swallow after HTTP request processing is over in order to keep the connection alive. If the remainder is too large - the connection will be closed. -1 means no limits will be applied.
      Parameters:
      maxPayloadRemainderToSkip -
      Since:
      2.3.13
    • isPreserveHeaderCase

      public boolean isPreserveHeaderCase()
      Returns:
      true if header case will be preserved, otherwise false. Default is false.
    • setPreserveHeaderCase

      public void setPreserveHeaderCase(boolean preserveHeaderCase)
      Set to true to preserve header case. Default is false.
      Parameters:
      preserveHeaderCase - true to preserve header case.
    • getTransferEncodings

      public TransferEncoding[] getTransferEncodings()

      Gets registered TransferEncodings.

      Returns:
      registered TransferEncodings.
    • addTransferEncoding

      public void addTransferEncoding(TransferEncoding transferEncoding)

      Adds the specified TransferEncoding to the HttpCodecFilter.

      Parameters:
      transferEncoding - the TransferEncoding to add
    • removeTransferEncoding

      public boolean removeTransferEncoding(TransferEncoding transferEncoding)

      Removes the specified TransferEncoding from the HttpCodecFilter.

      Parameters:
      transferEncoding - the TransferEncoding to remove
      Returns:
      true if the TransferEncoding was removed, otherwise false indicating the TransferEncoding was not already present
    • getContentEncodings

      public ContentEncoding[] getContentEncodings()

      Gets registered ContentEncodings.

      Returns:
      registered ContentEncodings.
    • addContentEncoding

      public void addContentEncoding(ContentEncoding contentEncoding)

      Adds the specified ContentEncoding to the HttpCodecFilter.

      Parameters:
      contentEncoding - the ContentEncoding to add
    • removeContentEncoding

      public boolean removeContentEncoding(ContentEncoding contentEncoding)

      Removes the specified ContentEncoding from the HttpCodecFilter.

      Parameters:
      contentEncoding - the ContentEncoding to remove
      Returns:
      true if the ContentEncoding was removed, otherwise false indicating the ContentEncoding was not already present
    • isChunkingEnabled

      protected boolean isChunkingEnabled()
      Return true if chunked transfer-encoding may be used.
      Returns:
      true if chunked transfer-encoding may be used.
      Since:
      2.1.2
    • isRemoveHandledContentEncodingHeaders

      public boolean isRemoveHandledContentEncodingHeaders()
      Returns:
      true if content-encoding headers that are handled by this module should be removed from the header
      Since:
      2.3.39
      See Also:
    • setRemoveHandledContentEncodingHeaders

      public void setRemoveHandledContentEncodingHeaders(boolean removeHandledContentEncodingHeaders)

      If enabled the content-encoding header for handled content-encodings is removed.

      The primary usecase for this option is the use in a servlet container that enables compression handling on the server level. In this case the next level (the webapplication) has to be notified, that compression of the stream has been dealt with.
      For this usecase it is assumed, that a servlet filter might be present that also does compression/decompression. To prevent double decompression the content-encoding header is removed, so the servlet filter can't assume it needs to decode.

      Parameters:
      removeHandledContentEncodingHeaders - true if content-encoding headers that are handled by this module should be removed from the header
      Since:
      2.3.39
    • handleRead

      public final org.glassfish.grizzly.filterchain.NextAction handleRead(org.glassfish.grizzly.filterchain.FilterChainContext ctx, HttpHeader httpHeader) throws IOException
      The method is called by the specific HttpCodecFilter implementation, once we have received a Buffer, which has to be transformed into HTTP packet part. Filter gets Buffer, which represents a part or complete HTTP message. As the result of "read" transformation - we will get HttpContent message, which will represent HTTP packet content (might be zero length content) and reference to a HttpHeader, which contains HTTP message header.
      Parameters:
      ctx - Request processing context
      httpHeader - the current HttpHeader, which is being processed.
      Returns:
      NextAction
      Throws:
      IOException
    • decodeHttpPacket

      protected boolean decodeHttpPacket(org.glassfish.grizzly.filterchain.FilterChainContext ctx, HttpPacketParsing httpPacket, org.glassfish.grizzly.Buffer input)
    • decodeHttpPacketFromBytes

      protected boolean decodeHttpPacketFromBytes(org.glassfish.grizzly.filterchain.FilterChainContext ctx, HttpPacketParsing httpPacket, org.glassfish.grizzly.Buffer inputBuffer)
    • parseHeadersFromBytes

      protected boolean parseHeadersFromBytes(HttpHeader httpHeader, MimeHeaders mimeHeaders, HttpCodecFilter.HeaderParsingState parsingState, byte[] input, int end)
    • parseHeaderFromBytes

      protected boolean parseHeaderFromBytes(HttpHeader httpHeader, MimeHeaders mimeHeaders, HttpCodecFilter.HeaderParsingState parsingState, byte[] input, int end)
    • parseHeaderName

      protected boolean parseHeaderName(HttpHeader httpHeader, MimeHeaders mimeHeaders, HttpCodecFilter.HeaderParsingState parsingState, byte[] input, int end)
    • parseHeaderValue

      protected static int parseHeaderValue(HttpHeader httpHeader, HttpCodecFilter.HeaderParsingState parsingState, byte[] input, int end)
    • decodeHttpPacketFromBuffer

      protected boolean decodeHttpPacketFromBuffer(org.glassfish.grizzly.filterchain.FilterChainContext ctx, HttpPacketParsing httpPacket, org.glassfish.grizzly.Buffer input)
    • parseHeadersFromBuffer

      protected boolean parseHeadersFromBuffer(HttpHeader httpHeader, MimeHeaders mimeHeaders, HttpCodecFilter.HeaderParsingState parsingState, org.glassfish.grizzly.Buffer input)
    • parseHeaderFromBuffer

      protected boolean parseHeaderFromBuffer(HttpHeader httpHeader, MimeHeaders mimeHeaders, HttpCodecFilter.HeaderParsingState parsingState, org.glassfish.grizzly.Buffer input)
    • parseHeaderName

      protected boolean parseHeaderName(HttpHeader httpHeader, MimeHeaders mimeHeaders, HttpCodecFilter.HeaderParsingState parsingState, org.glassfish.grizzly.Buffer input)
    • parseHeaderValue

      protected static int parseHeaderValue(HttpHeader httpHeader, HttpCodecFilter.HeaderParsingState parsingState, org.glassfish.grizzly.Buffer input)
    • handleWrite

      public org.glassfish.grizzly.filterchain.NextAction handleWrite(org.glassfish.grizzly.filterchain.FilterChainContext ctx) throws IOException
      The method is called, once we need to serialize a HttpPacket, which may represent HTTP packet header, content or content chunk. Filter gets HttpPacket, which represents a HTTP header, content, or content part. As the result of "write" transformation - we will get Buffer, which will represent serialized HTTP packet.
      Specified by:
      handleWrite in interface org.glassfish.grizzly.filterchain.Filter
      Overrides:
      handleWrite in class org.glassfish.grizzly.filterchain.BaseFilter
      Parameters:
      ctx - Request processing context
      Returns:
      NextAction
      Throws:
      IOException
    • onIncomingUpgrade

      protected void onIncomingUpgrade(org.glassfish.grizzly.filterchain.FilterChainContext ctx, HttpHeader httpHeader)
      The method is called, when a peer sends an upgrade HTTP packet (either request or response).
      Parameters:
      ctx -
      httpHeader -
    • onOutgoingUpgrade

      protected void onOutgoingUpgrade(org.glassfish.grizzly.filterchain.FilterChainContext ctx, HttpHeader httpHeader)
    • encodeHttpPacket

      protected org.glassfish.grizzly.Buffer encodeHttpPacket(org.glassfish.grizzly.filterchain.FilterChainContext ctx, HttpPacket input)
    • encodeHttpPacket

      protected final org.glassfish.grizzly.Buffer encodeHttpPacket(org.glassfish.grizzly.filterchain.FilterChainContext ctx, HttpHeader httpHeader, HttpContent httpContent, boolean isContentAlreadyEncoded)
    • encodeKnownHeaders

      protected static org.glassfish.grizzly.Buffer encodeKnownHeaders(org.glassfish.grizzly.memory.MemoryManager memoryManager, org.glassfish.grizzly.Buffer buffer, HttpHeader httpHeader)
    • encodeMimeHeaders

      protected static org.glassfish.grizzly.Buffer encodeMimeHeaders(org.glassfish.grizzly.memory.MemoryManager memoryManager, org.glassfish.grizzly.Buffer buffer, MimeHeaders mimeHeaders, byte[] tempEncodingBuffer)
    • encodeMimeHeader

      protected static org.glassfish.grizzly.Buffer encodeMimeHeader(org.glassfish.grizzly.memory.MemoryManager memoryManager, org.glassfish.grizzly.Buffer buffer, DataChunk name, DataChunk value, byte[] tempBuffer, boolean encodeLastCRLF)
    • isSecure

      protected static boolean isSecure(org.glassfish.grizzly.Connection connection)
      flag, which indicates whether this HttpCodecFilter is dealing with the secured HTTP packets. For this filter flag means nothing, it's just a value, which is getting set to a HttpRequestPacket or HttpResponsePacket.
      Parameters:
      connection - Connection
      Returns:
      true, if the Connection is secured, or false otherwise
    • statusDropsConnection

      protected static boolean statusDropsConnection(int status)
      Determine if we must drop the connection because of the HTTP status code. Use the same list of codes as Apache/httpd.
    • getMonitoringConfig

      public org.glassfish.grizzly.monitoring.MonitoringConfig<HttpProbe> getMonitoringConfig()
      Specified by:
      getMonitoringConfig in interface org.glassfish.grizzly.monitoring.MonitoringAware<HttpProbe>
    • createJmxManagementObject

      protected Object createJmxManagementObject()