Class HttpMessageDecoder
java.lang.Object
org.jboss.netty.channel.SimpleChannelUpstreamHandler
org.jboss.netty.handler.codec.frame.FrameDecoder
org.jboss.netty.handler.codec.replay.ReplayingDecoder<HttpMessageDecoder.State>
org.jboss.netty.handler.codec.http.HttpMessageDecoder
- All Implemented Interfaces:
ChannelHandler
,ChannelUpstreamHandler
,LifeCycleAwareChannelHandler
- Direct Known Subclasses:
HttpRequestDecoder
,HttpResponseDecoder
,RtspMessageDecoder
Decodes
ChannelBuffer
s into HttpMessage
s and
HttpChunk
s.
Parameters that prevents excessive memory consumption
Name | Meaning |
---|---|
maxInitialLineLength |
The maximum length of the initial line
(e.g. "GET / HTTP/1.0" or "HTTP/1.0 200 OK" )
If the length of the initial line exceeds this value, a
TooLongFrameException will be raised. |
maxHeaderSize |
The maximum length of all headers. If the sum of the length of each
header exceeds this value, a TooLongFrameException will be raised. |
maxChunkSize |
The maximum length of the content or each chunk. If the content length
(or the length of each chunk) exceeds this value, the content or chunk
will be split into multiple HttpChunk s whose length is
maxChunkSize at maximum. |
Chunked Content
If the content of an HTTP message is greater thanmaxChunkSize
or
the transfer encoding of the HTTP message is 'chunked', this decoder
generates one HttpMessage
instance and its following
HttpChunk
s per single HTTP message to avoid excessive memory
consumption. For example, the following HTTP message:
GET / HTTP/1.1 Transfer-Encoding: chunked 1a abcdefghijklmnopqrstuvwxyz 10 1234567890abcdef 0 Content-MD5: ... [blank line]triggers
HttpRequestDecoder
to generate 4 objects:
- An
HttpRequest
whosechunked
property istrue
, - The first
HttpChunk
whose content is'abcdefghijklmnopqrstuvwxyz'
, - The second
HttpChunk
whose content is'1234567890abcdef'
, and - An
HttpChunkTrailer
which marks the end of the content.
HttpChunk
s by yourself for your
convenience, insert HttpChunkAggregator
after this decoder in the
ChannelPipeline
. However, please note that your server might not
be as memory efficient as without the aggregator.
Extensibility
Please note that this decoder is designed to be extended to implement a protocol derived from HTTP, such as RTSP and ICAP. To implement the decoder of such a derived protocol, extend this class and implement all abstract methods properly.-
Nested Class Summary
Nested ClassesNested classes/interfaces inherited from interface org.jboss.netty.channel.ChannelHandler
ChannelHandler.Sharable
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate long
private ChannelBuffer
private int
private int
private final int
private final int
private final int
private HttpMessage
Fields inherited from class org.jboss.netty.handler.codec.frame.FrameDecoder
cumulation, DEFAULT_MAX_COMPOSITEBUFFER_COMPONENTS
-
Constructor Summary
ConstructorsModifierConstructorDescriptionprotected
Creates a new instance with the defaultmaxInitialLineLength (4096
},maxHeaderSize (8192)
, andmaxChunkSize (8192)
.protected
HttpMessageDecoder
(int maxInitialLineLength, int maxHeaderSize, int maxChunkSize) Creates a new instance with the specified parameters. -
Method Summary
Modifier and TypeMethodDescriptionprotected abstract HttpMessage
createMessage
(String[] initialLine) protected Object
decode
(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer, HttpMessageDecoder.State state) Decodes the received packets so far into a frame.private static int
private static int
findNonWhitespace
(String sb, int offset) private static int
findWhitespace
(String sb, int offset) private static int
getChunkSize
(String hex) protected boolean
protected abstract boolean
private Object
readFixedLengthContent
(ChannelBuffer buffer) private String
readHeader
(ChannelBuffer buffer) private HttpMessageDecoder.State
readHeaders
(ChannelBuffer buffer) private static String
readLine
(ChannelBuffer buffer, int maxLineLength) private HttpChunkTrailer
readTrailingHeaders
(ChannelBuffer buffer) private Object
reset()
private void
private static void
skipControlCharacters
(ChannelBuffer buffer) private static String[]
splitHeader
(String sb) private static String[]
Methods inherited from class org.jboss.netty.handler.codec.replay.ReplayingDecoder
checkpoint, checkpoint, cleanup, decode, decodeLast, decodeLast, getState, internalBuffer, messageReceived, setState
Methods inherited from class org.jboss.netty.handler.codec.frame.FrameDecoder
actualReadableBytes, afterAdd, afterRemove, appendToCumulation, beforeAdd, beforeRemove, channelClosed, channelDisconnected, exceptionCaught, extractFrame, getMaxCumulationBufferCapacity, getMaxCumulationBufferComponents, isUnfold, newCumulationBuffer, replace, setMaxCumulationBufferCapacity, setMaxCumulationBufferComponents, setUnfold, unfoldAndFireMessageReceived, updateCumulation
Methods inherited from class org.jboss.netty.channel.SimpleChannelUpstreamHandler
channelBound, channelConnected, channelInterestChanged, channelOpen, channelUnbound, childChannelClosed, childChannelOpen, handleUpstream, writeComplete
-
Field Details
-
maxInitialLineLength
private final int maxInitialLineLength -
maxHeaderSize
private final int maxHeaderSize -
maxChunkSize
private final int maxChunkSize -
message
-
-
chunkSize
private long chunkSize -
headerSize
private int headerSize -
contentRead
private int contentRead
-
-
Constructor Details
-
HttpMessageDecoder
protected HttpMessageDecoder()Creates a new instance with the defaultmaxInitialLineLength (4096
},maxHeaderSize (8192)
, andmaxChunkSize (8192)
. -
HttpMessageDecoder
protected HttpMessageDecoder(int maxInitialLineLength, int maxHeaderSize, int maxChunkSize) Creates a new instance with the specified parameters.
-
-
Method Details
-
decode
protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer, HttpMessageDecoder.State state) throws Exception Description copied from class:ReplayingDecoder
Decodes the received packets so far into a frame.- Specified by:
decode
in classReplayingDecoder<HttpMessageDecoder.State>
- Parameters:
ctx
- the context of this handlerchannel
- the current channelbuffer
- the cumulative buffer of received packets so far. Note that the buffer might be empty, which means you should not make an assumption that the buffer contains at least one byte in your decoder implementation.state
- the current decoder state (null
if unused)- Returns:
- the decoded frame
- Throws:
Exception
-
isContentAlwaysEmpty
-
reset
-
resetState
private void resetState() -
skipControlCharacters
-
readFixedLengthContent
-
readHeaders
- Throws:
TooLongFrameException
-
readTrailingHeaders
- Throws:
TooLongFrameException
-
readHeader
- Throws:
TooLongFrameException
-
isDecodingRequest
protected abstract boolean isDecodingRequest() -
createMessage
- Throws:
Exception
-
getChunkSize
-
readLine
private static String readLine(ChannelBuffer buffer, int maxLineLength) throws TooLongFrameException - Throws:
TooLongFrameException
-
splitInitialLine
-
splitHeader
-
findNonWhitespace
-
findWhitespace
-
findEndOfString
-