Package io.netty.handler.codec.http
Class EspressoHttpObjectAggregator
- java.lang.Object
-
- io.netty.channel.ChannelHandlerAdapter
-
- io.netty.channel.ChannelInboundHandlerAdapter
-
- io.netty.handler.codec.EspressoMessageToMessageDecoder<I>
-
- io.netty.handler.codec.EspressoMessageAggregator<io.netty.handler.codec.http.HttpObject,io.netty.handler.codec.http.HttpMessage,io.netty.handler.codec.http.HttpContent,io.netty.handler.codec.http.FullHttpMessage>
-
- io.netty.handler.codec.http.EspressoHttpObjectAggregator
-
- All Implemented Interfaces:
io.netty.channel.ChannelHandler
,io.netty.channel.ChannelInboundHandler
public class EspressoHttpObjectAggregator extends EspressoMessageAggregator<io.netty.handler.codec.http.HttpObject,io.netty.handler.codec.http.HttpMessage,io.netty.handler.codec.http.HttpContent,io.netty.handler.codec.http.FullHttpMessage>
Forked from Netty 4.1.42.Final. Main change is to extend EspressoMessageAggregator to avoid creatingTypeParameterMatcher
. AChannelHandler
that aggregates anHttpMessage
and its followingHttpContent
s into a singleFullHttpRequest
orFullHttpResponse
(depending on if it used to handle requests or responses) with no followingHttpContent
s. It is useful when you don't want to take care of HTTP messages whose transfer encoding is 'chunked'. Insert this handler afterHttpResponseDecoder
in theChannelPipeline
if being used to handle responses, or afterHttpRequestDecoder
andHttpResponseEncoder
in theChannelPipeline
if being used to handle requests.ChannelPipeline
p = ...; ... p.addLast("decoder", newHttpRequestDecoder
()); p.addLast("encoder", newHttpResponseEncoder
()); p.addLast("aggregator", newHttpObjectAggregator
(1048576)); ... p.addLast("handler", new HttpRequestHandler());For convenience, consider putting a
Be aware thatHttpServerCodec
before theHttpObjectAggregator
as it functions as both aHttpRequestDecoder
and aHttpResponseEncoder
.HttpObjectAggregator
may end up sending aHttpResponse
:Response Status Condition When Sent 100 Continue A '100-continue' expectation is received and the 'content-length' doesn't exceed maxContentLength 417 Expectation Failed A '100-continue' expectation is received and the 'content-length' exceeds maxContentLength 413 Request Entity Too Large Either the 'content-length' or the bytes received so far exceed maxContentLength - See Also:
FullHttpRequest
,FullHttpResponse
,HttpResponseDecoder
,HttpServerCodec
-
-
Constructor Summary
Constructors Constructor Description EspressoHttpObjectAggregator(int maxContentLength)
Creates a new instance.EspressoHttpObjectAggregator(int maxContentLength, boolean closeOnExpectationFailed)
Creates a new instance.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected void
aggregate(io.netty.handler.codec.http.FullHttpMessage aggregated, io.netty.handler.codec.http.HttpContent content)
Transfers the information provided by the specified content message to the specified aggregated message.protected io.netty.handler.codec.http.FullHttpMessage
beginAggregation(io.netty.handler.codec.http.HttpMessage start, io.netty.buffer.ByteBuf content)
Creates a new aggregated message from the specified start message and the specified content.protected boolean
closeAfterContinueResponse(java.lang.Object msg)
Determine if the channel should be closed after the result ofEspressoMessageAggregator.newContinueResponse(Object, int, ChannelPipeline)
is written.protected void
finishAggregation(io.netty.handler.codec.http.FullHttpMessage aggregated)
Invoked when the specifiedaggregated
message is about to be passed to the next handler in the pipeline.protected void
handleOversizedMessage(io.netty.channel.ChannelHandlerContext ctx, io.netty.handler.codec.http.HttpMessage oversized)
Invoked when an incoming request exceeds the maximum content length.protected boolean
ignoreContentAfterContinueResponse(java.lang.Object msg)
Determine if all objects for the current request/response should be ignored or not.protected boolean
isAggregated(io.netty.handler.codec.http.HttpObject msg)
Returnstrue
if and only if the specified message is already aggregated.protected boolean
isContentLengthInvalid(io.netty.handler.codec.http.HttpMessage start, int maxContentLength)
Determine if the messagestart
's content length is known, and if it greater thanmaxContentLength
.protected boolean
isContentMessage(io.netty.handler.codec.http.HttpObject msg)
Returnstrue
if and only if the specified message is a content message.protected boolean
isLastContentMessage(io.netty.handler.codec.http.HttpContent msg)
Returnstrue
if and only if the specified message is the last content message.protected boolean
isStartMessage(io.netty.handler.codec.http.HttpObject msg)
Returnstrue
if and only if the specified message is a start message.protected java.lang.Object
newContinueResponse(io.netty.handler.codec.http.HttpMessage start, int maxContentLength, io.netty.channel.ChannelPipeline pipeline)
Returns the 'continue response' for the specified start message if necessary.-
Methods inherited from class io.netty.handler.codec.EspressoMessageAggregator
acceptInboundMessage, channelInactive, channelReadComplete, ctx, decode, handlerAdded, handlerRemoved, isHandlingOversizedMessage, maxContentLength, maxCumulationBufferComponents, setMaxCumulationBufferComponents
-
Methods inherited from class io.netty.handler.codec.EspressoMessageToMessageDecoder
channelRead
-
-
-
-
Constructor Detail
-
EspressoHttpObjectAggregator
public EspressoHttpObjectAggregator(int maxContentLength)
Creates a new instance.- Parameters:
maxContentLength
- the maximum length of the aggregated content in bytes. If the length of the aggregated content exceeds this value,handleOversizedMessage(ChannelHandlerContext, HttpMessage)
will be called.
-
EspressoHttpObjectAggregator
public EspressoHttpObjectAggregator(int maxContentLength, boolean closeOnExpectationFailed)
Creates a new instance.- Parameters:
maxContentLength
- the maximum length of the aggregated content in bytes. If the length of the aggregated content exceeds this value,handleOversizedMessage(ChannelHandlerContext, HttpMessage)
will be called.closeOnExpectationFailed
- If a 100-continue response is detected but the content length is too large thentrue
means close the connection. otherwise the connection will remain open and data will be consumed and discarded until the next request is received.
-
-
Method Detail
-
isStartMessage
protected boolean isStartMessage(io.netty.handler.codec.http.HttpObject msg) throws java.lang.Exception
Description copied from class:EspressoMessageAggregator
Returnstrue
if and only if the specified message is a start message. Typically, this method is implemented as a singlereturn
statement withinstanceof
:return msg instanceof MyStartMessage;
- Specified by:
isStartMessage
in classEspressoMessageAggregator<io.netty.handler.codec.http.HttpObject,io.netty.handler.codec.http.HttpMessage,io.netty.handler.codec.http.HttpContent,io.netty.handler.codec.http.FullHttpMessage>
- Throws:
java.lang.Exception
-
isContentMessage
protected boolean isContentMessage(io.netty.handler.codec.http.HttpObject msg) throws java.lang.Exception
Description copied from class:EspressoMessageAggregator
Returnstrue
if and only if the specified message is a content message. Typically, this method is implemented as a singlereturn
statement withinstanceof
:return msg instanceof MyContentMessage;
- Specified by:
isContentMessage
in classEspressoMessageAggregator<io.netty.handler.codec.http.HttpObject,io.netty.handler.codec.http.HttpMessage,io.netty.handler.codec.http.HttpContent,io.netty.handler.codec.http.FullHttpMessage>
- Throws:
java.lang.Exception
-
isLastContentMessage
protected boolean isLastContentMessage(io.netty.handler.codec.http.HttpContent msg) throws java.lang.Exception
Description copied from class:EspressoMessageAggregator
Returnstrue
if and only if the specified message is the last content message. Typically, this method is implemented as a singlereturn
statement withinstanceof
:return msg instanceof MyLastContentMessage;
or withinstanceof
and boolean field check:return msg instanceof MyContentMessage && msg.isLastFragment();
- Specified by:
isLastContentMessage
in classEspressoMessageAggregator<io.netty.handler.codec.http.HttpObject,io.netty.handler.codec.http.HttpMessage,io.netty.handler.codec.http.HttpContent,io.netty.handler.codec.http.FullHttpMessage>
- Throws:
java.lang.Exception
-
isAggregated
protected boolean isAggregated(io.netty.handler.codec.http.HttpObject msg) throws java.lang.Exception
Description copied from class:EspressoMessageAggregator
Returnstrue
if and only if the specified message is already aggregated. If this method returnstrue
, this handler will simply forward the message to the next handler as-is.- Specified by:
isAggregated
in classEspressoMessageAggregator<io.netty.handler.codec.http.HttpObject,io.netty.handler.codec.http.HttpMessage,io.netty.handler.codec.http.HttpContent,io.netty.handler.codec.http.FullHttpMessage>
- Throws:
java.lang.Exception
-
isContentLengthInvalid
protected boolean isContentLengthInvalid(io.netty.handler.codec.http.HttpMessage start, int maxContentLength)
Description copied from class:EspressoMessageAggregator
Determine if the messagestart
's content length is known, and if it greater thanmaxContentLength
.- Specified by:
isContentLengthInvalid
in classEspressoMessageAggregator<io.netty.handler.codec.http.HttpObject,io.netty.handler.codec.http.HttpMessage,io.netty.handler.codec.http.HttpContent,io.netty.handler.codec.http.FullHttpMessage>
- Parameters:
start
- The message which may indicate the content length.maxContentLength
- The maximum allowed content length.- Returns:
true
if the messagestart
's content length is known, and if it greater thanmaxContentLength
.false
otherwise.
-
newContinueResponse
protected java.lang.Object newContinueResponse(io.netty.handler.codec.http.HttpMessage start, int maxContentLength, io.netty.channel.ChannelPipeline pipeline)
Description copied from class:EspressoMessageAggregator
Returns the 'continue response' for the specified start message if necessary. For example, this method is useful to handle an HTTP 100-continue header.- Specified by:
newContinueResponse
in classEspressoMessageAggregator<io.netty.handler.codec.http.HttpObject,io.netty.handler.codec.http.HttpMessage,io.netty.handler.codec.http.HttpContent,io.netty.handler.codec.http.FullHttpMessage>
- Returns:
- the 'continue response', or
null
if there's no message to send
-
closeAfterContinueResponse
protected boolean closeAfterContinueResponse(java.lang.Object msg)
Description copied from class:EspressoMessageAggregator
Determine if the channel should be closed after the result ofEspressoMessageAggregator.newContinueResponse(Object, int, ChannelPipeline)
is written.- Specified by:
closeAfterContinueResponse
in classEspressoMessageAggregator<io.netty.handler.codec.http.HttpObject,io.netty.handler.codec.http.HttpMessage,io.netty.handler.codec.http.HttpContent,io.netty.handler.codec.http.FullHttpMessage>
- Parameters:
msg
- The return value fromEspressoMessageAggregator.newContinueResponse(Object, int, ChannelPipeline)
.- Returns:
true
if the channel should be closed after the result ofEspressoMessageAggregator.newContinueResponse(Object, int, ChannelPipeline)
is written.false
otherwise.
-
ignoreContentAfterContinueResponse
protected boolean ignoreContentAfterContinueResponse(java.lang.Object msg)
Description copied from class:EspressoMessageAggregator
Determine if all objects for the current request/response should be ignored or not. Messages will stop being ignored the next timeEspressoMessageAggregator.isContentMessage(Object)
returnstrue
.- Specified by:
ignoreContentAfterContinueResponse
in classEspressoMessageAggregator<io.netty.handler.codec.http.HttpObject,io.netty.handler.codec.http.HttpMessage,io.netty.handler.codec.http.HttpContent,io.netty.handler.codec.http.FullHttpMessage>
- Parameters:
msg
- The return value fromEspressoMessageAggregator.newContinueResponse(Object, int, ChannelPipeline)
.- Returns:
true
if all objects for the current request/response should be ignored or not.false
otherwise.
-
beginAggregation
protected io.netty.handler.codec.http.FullHttpMessage beginAggregation(io.netty.handler.codec.http.HttpMessage start, io.netty.buffer.ByteBuf content) throws java.lang.Exception
Description copied from class:EspressoMessageAggregator
Creates a new aggregated message from the specified start message and the specified content. If the start message implementsByteBufHolder
, its content is appended to the specifiedcontent
. This aggregator will continue to append the received content to the specifiedcontent
.- Specified by:
beginAggregation
in classEspressoMessageAggregator<io.netty.handler.codec.http.HttpObject,io.netty.handler.codec.http.HttpMessage,io.netty.handler.codec.http.HttpContent,io.netty.handler.codec.http.FullHttpMessage>
- Throws:
java.lang.Exception
-
aggregate
protected void aggregate(io.netty.handler.codec.http.FullHttpMessage aggregated, io.netty.handler.codec.http.HttpContent content) throws java.lang.Exception
Description copied from class:EspressoMessageAggregator
Transfers the information provided by the specified content message to the specified aggregated message. Note that the content of the specified content message has been appended to the content of the specified aggregated message already, so that you don't need to. Use this method to transfer the additional information that the content message provides toaggregated
.- Overrides:
aggregate
in classEspressoMessageAggregator<io.netty.handler.codec.http.HttpObject,io.netty.handler.codec.http.HttpMessage,io.netty.handler.codec.http.HttpContent,io.netty.handler.codec.http.FullHttpMessage>
- Throws:
java.lang.Exception
-
finishAggregation
protected void finishAggregation(io.netty.handler.codec.http.FullHttpMessage aggregated) throws java.lang.Exception
Description copied from class:EspressoMessageAggregator
Invoked when the specifiedaggregated
message is about to be passed to the next handler in the pipeline.- Overrides:
finishAggregation
in classEspressoMessageAggregator<io.netty.handler.codec.http.HttpObject,io.netty.handler.codec.http.HttpMessage,io.netty.handler.codec.http.HttpContent,io.netty.handler.codec.http.FullHttpMessage>
- Throws:
java.lang.Exception
-
handleOversizedMessage
protected void handleOversizedMessage(io.netty.channel.ChannelHandlerContext ctx, io.netty.handler.codec.http.HttpMessage oversized) throws java.lang.Exception
Description copied from class:EspressoMessageAggregator
Invoked when an incoming request exceeds the maximum content length. The default behvaior is to trigger anexceptionCaught()
event with aTooLongFrameException
.- Overrides:
handleOversizedMessage
in classEspressoMessageAggregator<io.netty.handler.codec.http.HttpObject,io.netty.handler.codec.http.HttpMessage,io.netty.handler.codec.http.HttpContent,io.netty.handler.codec.http.FullHttpMessage>
- Parameters:
ctx
- theChannelHandlerContext
oversized
- the accumulated message up to this point, whose type isS
orO
- Throws:
java.lang.Exception
-
-