Package io.netty.handler.codec.http
Class HttpObjectAggregator
- java.lang.Object
-
- io.netty.channel.ChannelHandlerAdapter
-
- io.netty.channel.ChannelInboundHandlerAdapter
-
- io.netty.handler.codec.MessageToMessageDecoder<I>
-
- io.netty.handler.codec.MessageAggregator<HttpObject,HttpMessage,HttpContent,FullHttpMessage>
-
- io.netty.handler.codec.http.HttpObjectAggregator
-
- All Implemented Interfaces:
ChannelHandler,ChannelInboundHandler
- Direct Known Subclasses:
HttpClientUpgradeHandler,HttpServerUpgradeHandler
public class HttpObjectAggregator extends MessageAggregator<HttpObject,HttpMessage,HttpContent,FullHttpMessage>
AChannelHandlerthat aggregates anHttpMessageand its followingHttpContents into a singleFullHttpRequestorFullHttpResponse(depending on if it used to handle requests or responses) with no followingHttpContents. It is useful when you don't want to take care of HTTP messages whose transfer encoding is 'chunked'. Insert this handler afterHttpResponseDecoderin theChannelPipelineif being used to handle responses, or afterHttpRequestDecoderandHttpResponseEncoderin theChannelPipelineif being used to handle requests.ChannelPipelinep = ...; ... 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 thatHttpServerCodecbefore theHttpObjectAggregatoras it functions as both aHttpRequestDecoderand aHttpResponseEncoder.HttpObjectAggregatormay 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
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static classHttpObjectAggregator.AggregatedFullHttpMessageprivate static classHttpObjectAggregator.AggregatedFullHttpRequestprivate static classHttpObjectAggregator.AggregatedFullHttpResponse-
Nested classes/interfaces inherited from interface io.netty.channel.ChannelHandler
ChannelHandler.Sharable
-
-
Field Summary
Fields Modifier and Type Field Description private booleancloseOnExpectationFailedprivate static FullHttpResponseCONTINUEprivate static FullHttpResponseEXPECTATION_FAILEDprivate static InternalLoggerloggerprivate static FullHttpResponseTOO_LARGEprivate static FullHttpResponseTOO_LARGE_CLOSE
-
Constructor Summary
Constructors Constructor Description HttpObjectAggregator(int maxContentLength)Creates a new instance.HttpObjectAggregator(int maxContentLength, boolean closeOnExpectationFailed)Creates a new instance.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected voidaggregate(FullHttpMessage aggregated, HttpContent content)Transfers the information provided by the specified content message to the specified aggregated message.protected FullHttpMessagebeginAggregation(HttpMessage start, ByteBuf content)Creates a new aggregated message from the specified start message and the specified content.protected booleancloseAfterContinueResponse(java.lang.Object msg)Determine if the channel should be closed after the result ofMessageAggregator.newContinueResponse(Object, int, ChannelPipeline)is written.private static java.lang.ObjectcontinueResponse(HttpMessage start, int maxContentLength, ChannelPipeline pipeline)protected voidfinishAggregation(FullHttpMessage aggregated)Invoked when the specifiedaggregatedmessage is about to be passed to the next handler in the pipeline.protected voidhandleOversizedMessage(ChannelHandlerContext ctx, HttpMessage oversized)Invoked when an incoming request exceeds the maximum content length.protected booleanignoreContentAfterContinueResponse(java.lang.Object msg)Determine if all objects for the current request/response should be ignored or not.protected booleanisAggregated(HttpObject msg)Returnstrueif and only if the specified message is already aggregated.protected booleanisContentLengthInvalid(HttpMessage start, int maxContentLength)Determine if the messagestart's content length is known, and if it greater thanmaxContentLength.protected booleanisContentMessage(HttpObject msg)Returnstrueif and only if the specified message is a content message.protected booleanisLastContentMessage(HttpContent msg)Returnstrueif and only if the specified message is the last content message.protected booleanisStartMessage(HttpObject msg)Returnstrueif and only if the specified message is a start message.protected java.lang.ObjectnewContinueResponse(HttpMessage start, int maxContentLength, ChannelPipeline pipeline)Returns the 'continue response' for the specified start message if necessary.-
Methods inherited from class io.netty.handler.codec.MessageAggregator
acceptInboundMessage, channelInactive, channelReadComplete, ctx, decode, handlerAdded, handlerRemoved, isHandlingOversizedMessage, maxContentLength, maxCumulationBufferComponents, setMaxCumulationBufferComponents
-
Methods inherited from class io.netty.handler.codec.MessageToMessageDecoder
channelRead
-
Methods inherited from class io.netty.channel.ChannelInboundHandlerAdapter
channelActive, channelRegistered, channelUnregistered, channelWritabilityChanged, exceptionCaught, userEventTriggered
-
Methods inherited from class io.netty.channel.ChannelHandlerAdapter
ensureNotSharable, isSharable
-
-
-
-
Field Detail
-
logger
private static final InternalLogger logger
-
CONTINUE
private static final FullHttpResponse CONTINUE
-
EXPECTATION_FAILED
private static final FullHttpResponse EXPECTATION_FAILED
-
TOO_LARGE_CLOSE
private static final FullHttpResponse TOO_LARGE_CLOSE
-
TOO_LARGE
private static final FullHttpResponse TOO_LARGE
-
closeOnExpectationFailed
private final boolean closeOnExpectationFailed
-
-
Constructor Detail
-
HttpObjectAggregator
public HttpObjectAggregator(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.
-
HttpObjectAggregator
public HttpObjectAggregator(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 thentruemeans 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(HttpObject msg) throws java.lang.Exception
Description copied from class:MessageAggregatorReturnstrueif and only if the specified message is a start message. Typically, this method is implemented as a singlereturnstatement withinstanceof:return msg instanceof MyStartMessage;
- Specified by:
isStartMessagein classMessageAggregator<HttpObject,HttpMessage,HttpContent,FullHttpMessage>- Throws:
java.lang.Exception
-
isContentMessage
protected boolean isContentMessage(HttpObject msg) throws java.lang.Exception
Description copied from class:MessageAggregatorReturnstrueif and only if the specified message is a content message. Typically, this method is implemented as a singlereturnstatement withinstanceof:return msg instanceof MyContentMessage;
- Specified by:
isContentMessagein classMessageAggregator<HttpObject,HttpMessage,HttpContent,FullHttpMessage>- Throws:
java.lang.Exception
-
isLastContentMessage
protected boolean isLastContentMessage(HttpContent msg) throws java.lang.Exception
Description copied from class:MessageAggregatorReturnstrueif and only if the specified message is the last content message. Typically, this method is implemented as a singlereturnstatement withinstanceof:return msg instanceof MyLastContentMessage;
or withinstanceofand boolean field check:return msg instanceof MyContentMessage && msg.isLastFragment();
- Specified by:
isLastContentMessagein classMessageAggregator<HttpObject,HttpMessage,HttpContent,FullHttpMessage>- Throws:
java.lang.Exception
-
isAggregated
protected boolean isAggregated(HttpObject msg) throws java.lang.Exception
Description copied from class:MessageAggregatorReturnstrueif 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:
isAggregatedin classMessageAggregator<HttpObject,HttpMessage,HttpContent,FullHttpMessage>- Throws:
java.lang.Exception
-
isContentLengthInvalid
protected boolean isContentLengthInvalid(HttpMessage start, int maxContentLength)
Description copied from class:MessageAggregatorDetermine if the messagestart's content length is known, and if it greater thanmaxContentLength.- Specified by:
isContentLengthInvalidin classMessageAggregator<HttpObject,HttpMessage,HttpContent,FullHttpMessage>- Parameters:
start- The message which may indicate the content length.maxContentLength- The maximum allowed content length.- Returns:
trueif the messagestart's content length is known, and if it greater thanmaxContentLength.falseotherwise.
-
continueResponse
private static java.lang.Object continueResponse(HttpMessage start, int maxContentLength, ChannelPipeline pipeline)
-
newContinueResponse
protected java.lang.Object newContinueResponse(HttpMessage start, int maxContentLength, ChannelPipeline pipeline)
Description copied from class:MessageAggregatorReturns 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:
newContinueResponsein classMessageAggregator<HttpObject,HttpMessage,HttpContent,FullHttpMessage>- Returns:
- the 'continue response', or
nullif there's no message to send
-
closeAfterContinueResponse
protected boolean closeAfterContinueResponse(java.lang.Object msg)
Description copied from class:MessageAggregatorDetermine if the channel should be closed after the result ofMessageAggregator.newContinueResponse(Object, int, ChannelPipeline)is written.- Specified by:
closeAfterContinueResponsein classMessageAggregator<HttpObject,HttpMessage,HttpContent,FullHttpMessage>- Parameters:
msg- The return value fromMessageAggregator.newContinueResponse(Object, int, ChannelPipeline).- Returns:
trueif the channel should be closed after the result ofMessageAggregator.newContinueResponse(Object, int, ChannelPipeline)is written.falseotherwise.
-
ignoreContentAfterContinueResponse
protected boolean ignoreContentAfterContinueResponse(java.lang.Object msg)
Description copied from class:MessageAggregatorDetermine if all objects for the current request/response should be ignored or not. Messages will stop being ignored the next timeMessageAggregator.isContentMessage(Object)returnstrue.- Specified by:
ignoreContentAfterContinueResponsein classMessageAggregator<HttpObject,HttpMessage,HttpContent,FullHttpMessage>- Parameters:
msg- The return value fromMessageAggregator.newContinueResponse(Object, int, ChannelPipeline).- Returns:
trueif all objects for the current request/response should be ignored or not.falseotherwise.
-
beginAggregation
protected FullHttpMessage beginAggregation(HttpMessage start, ByteBuf content) throws java.lang.Exception
Description copied from class:MessageAggregatorCreates 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:
beginAggregationin classMessageAggregator<HttpObject,HttpMessage,HttpContent,FullHttpMessage>- Throws:
java.lang.Exception
-
aggregate
protected void aggregate(FullHttpMessage aggregated, HttpContent content) throws java.lang.Exception
Description copied from class:MessageAggregatorTransfers 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:
aggregatein classMessageAggregator<HttpObject,HttpMessage,HttpContent,FullHttpMessage>- Throws:
java.lang.Exception
-
finishAggregation
protected void finishAggregation(FullHttpMessage aggregated) throws java.lang.Exception
Description copied from class:MessageAggregatorInvoked when the specifiedaggregatedmessage is about to be passed to the next handler in the pipeline.- Overrides:
finishAggregationin classMessageAggregator<HttpObject,HttpMessage,HttpContent,FullHttpMessage>- Throws:
java.lang.Exception
-
handleOversizedMessage
protected void handleOversizedMessage(ChannelHandlerContext ctx, HttpMessage oversized) throws java.lang.Exception
Description copied from class:MessageAggregatorInvoked when an incoming request exceeds the maximum content length. The default behvaior is to trigger anexceptionCaught()event with aTooLongFrameException.- Overrides:
handleOversizedMessagein classMessageAggregator<HttpObject,HttpMessage,HttpContent,FullHttpMessage>- Parameters:
ctx- theChannelHandlerContextoversized- the accumulated message up to this point, whose type isSorO- Throws:
java.lang.Exception
-
-