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
public abstract class HttpMessageDecoder extends ReplayingDecoder<HttpMessageDecoder.State>
DecodesChannelBuffer
s intoHttpMessage
s andHttpChunk
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, aTooLongFrameException
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 ismaxChunkSize
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 oneHttpMessage
instance and its followingHttpChunk
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]
triggersHttpRequestDecoder
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, insertHttpChunkAggregator
after this decoder in theChannelPipeline
. 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 Classes Modifier and Type Class Description protected static class
HttpMessageDecoder.State
The internal state ofHttpMessageDecoder
.-
Nested classes/interfaces inherited from interface org.jboss.netty.channel.ChannelHandler
ChannelHandler.Sharable
-
-
Field Summary
Fields Modifier and Type Field Description private long
chunkSize
private ChannelBuffer
content
private int
contentRead
private int
headerSize
private int
maxChunkSize
private int
maxHeaderSize
private int
maxInitialLineLength
private HttpMessage
message
-
Fields inherited from class org.jboss.netty.handler.codec.frame.FrameDecoder
cumulation, DEFAULT_MAX_COMPOSITEBUFFER_COMPONENTS
-
-
Constructor Summary
Constructors Modifier Constructor Description protected
HttpMessageDecoder()
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
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected abstract HttpMessage
createMessage(java.lang.String[] initialLine)
protected java.lang.Object
decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer, HttpMessageDecoder.State state)
Decodes the received packets so far into a frame.private static int
findEndOfString(java.lang.String sb)
private static int
findNonWhitespace(java.lang.String sb, int offset)
private static int
findWhitespace(java.lang.String sb, int offset)
private static int
getChunkSize(java.lang.String hex)
protected boolean
isContentAlwaysEmpty(HttpMessage msg)
protected abstract boolean
isDecodingRequest()
private java.lang.Object
readFixedLengthContent(ChannelBuffer buffer)
private java.lang.String
readHeader(ChannelBuffer buffer)
private HttpMessageDecoder.State
readHeaders(ChannelBuffer buffer)
private static java.lang.String
readLine(ChannelBuffer buffer, int maxLineLength)
private HttpChunkTrailer
readTrailingHeaders(ChannelBuffer buffer)
private java.lang.Object
reset()
private void
resetState()
private static void
skipControlCharacters(ChannelBuffer buffer)
private static java.lang.String[]
splitHeader(java.lang.String sb)
private static java.lang.String[]
splitInitialLine(java.lang.String sb)
-
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 Detail
-
maxInitialLineLength
private final int maxInitialLineLength
-
maxHeaderSize
private final int maxHeaderSize
-
maxChunkSize
private final int maxChunkSize
-
message
private HttpMessage message
-
content
private ChannelBuffer content
-
chunkSize
private long chunkSize
-
headerSize
private int headerSize
-
contentRead
private int contentRead
-
-
Constructor Detail
-
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 Detail
-
decode
protected java.lang.Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer, HttpMessageDecoder.State state) throws java.lang.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:
java.lang.Exception
-
isContentAlwaysEmpty
protected boolean isContentAlwaysEmpty(HttpMessage msg)
-
reset
private java.lang.Object reset()
-
resetState
private void resetState()
-
skipControlCharacters
private static void skipControlCharacters(ChannelBuffer buffer)
-
readFixedLengthContent
private java.lang.Object readFixedLengthContent(ChannelBuffer buffer)
-
readHeaders
private HttpMessageDecoder.State readHeaders(ChannelBuffer buffer) throws TooLongFrameException
- Throws:
TooLongFrameException
-
readTrailingHeaders
private HttpChunkTrailer readTrailingHeaders(ChannelBuffer buffer) throws TooLongFrameException
- Throws:
TooLongFrameException
-
readHeader
private java.lang.String readHeader(ChannelBuffer buffer) throws TooLongFrameException
- Throws:
TooLongFrameException
-
isDecodingRequest
protected abstract boolean isDecodingRequest()
-
createMessage
protected abstract HttpMessage createMessage(java.lang.String[] initialLine) throws java.lang.Exception
- Throws:
java.lang.Exception
-
getChunkSize
private static int getChunkSize(java.lang.String hex)
-
readLine
private static java.lang.String readLine(ChannelBuffer buffer, int maxLineLength) throws TooLongFrameException
- Throws:
TooLongFrameException
-
splitInitialLine
private static java.lang.String[] splitInitialLine(java.lang.String sb)
-
splitHeader
private static java.lang.String[] splitHeader(java.lang.String sb)
-
findNonWhitespace
private static int findNonWhitespace(java.lang.String sb, int offset)
-
findWhitespace
private static int findWhitespace(java.lang.String sb, int offset)
-
findEndOfString
private static int findEndOfString(java.lang.String sb)
-
-