@Internal public class HttpStreamsServerHandler extends io.netty.channel.ChannelDuplexHandler
HttpRequest
messages followed by HttpContent
messages and produces
StreamedHttpRequest
messages, and converts written StreamedHttpResponse
messages into
HttpResponse
messages followed by HttpContent
messages.
This allows request and response bodies to be handled using reactive streams.
There are two types of messages that this handler will send down the chain, StreamedHttpRequest
,
and FullHttpRequest
. If ChannelOption.AUTO_READ
is false for the channel,
then any StreamedHttpRequest
messages must be subscribed to consume the body, otherwise
it's possible that no read will be done of the messages.
There are three types of messages that this handler accepts for writing, StreamedHttpResponse
,
WebSocketHttpResponse
and FullHttpResponse
. Writing any other messages
may potentially lead to HTTP message mangling.
As long as messages are returned in the order that they arrive, this handler implicitly supports HTTP pipelining.
Modifier and Type | Field and Description |
---|---|
static String |
HANDLER_BODY_PUBLISHER |
Constructor and Description |
---|
HttpStreamsServerHandler()
Default constructor.
|
HttpStreamsServerHandler(List<io.netty.channel.ChannelHandler> dependentHandlers)
Create a new handler that is depended on by the given handlers.
|
Modifier and Type | Method and Description |
---|---|
protected void |
bodyRequested(io.netty.channel.ChannelHandlerContext ctx)
Invoked every time a read of the incoming body is requested by the subscriber.
|
void |
channelRead(io.netty.channel.ChannelHandlerContext ctx,
Object msg) |
void |
channelReadComplete(io.netty.channel.ChannelHandlerContext ctx) |
void |
channelWritabilityChanged(io.netty.channel.ChannelHandlerContext ctx) |
protected void |
consumedInMessage(io.netty.channel.ChannelHandlerContext ctx)
Invoked when an incoming message is fully consumed.
|
protected io.netty.handler.codec.http.HttpRequest |
createEmptyMessage(io.netty.handler.codec.http.HttpRequest request)
Create an empty incoming message.
|
protected io.netty.handler.codec.http.HttpRequest |
createStreamedMessage(io.netty.handler.codec.http.HttpRequest httpRequest,
Publisher<? extends io.netty.handler.codec.http.HttpContent> stream)
Create a streamed incoming message with the given stream.
|
protected int |
getStreamId(Object msg)
Gets the stream ID from the message.
|
void |
handlerRemoved(io.netty.channel.ChannelHandlerContext ctx) |
protected boolean |
hasBody(io.netty.handler.codec.http.HttpRequest request)
Whether the given incoming message has a body.
|
protected boolean |
isClient() |
protected boolean |
isValidInMessage(Object msg) |
protected boolean |
isValidOutMessage(Object msg) |
protected void |
receivedInMessage(io.netty.channel.ChannelHandlerContext ctx)
Invoked when an incoming message is first received.
|
protected void |
receivedOutMessage(io.netty.channel.ChannelHandlerContext ctx)
Invoked when an outgoing message is first received.
|
protected void |
sentOutMessage(io.netty.channel.ChannelHandlerContext ctx)
Invoked when an outgoing message is fully sent.
|
protected void |
subscribeSubscriberToStream(StreamedHttpMessage msg,
Subscriber<io.netty.handler.codec.http.HttpContent> subscriber)
Subscribe the given subscriber to the given streamed message.
|
protected void |
unbufferedWrite(io.netty.channel.ChannelHandlerContext ctx,
io.netty.handler.codec.http.HttpResponse message,
io.netty.channel.ChannelPromise promise) |
void |
write(io.netty.channel.ChannelHandlerContext ctx,
Object msg,
io.netty.channel.ChannelPromise promise) |
bind, close, connect, deregister, disconnect, flush, read
channelActive, channelInactive, channelRegistered, channelUnregistered, exceptionCaught, userEventTriggered
ensureNotSharable, handlerAdded, isSharable
public static final String HANDLER_BODY_PUBLISHER
public HttpStreamsServerHandler()
public HttpStreamsServerHandler(List<io.netty.channel.ChannelHandler> dependentHandlers)
The list of dependent handlers will be removed from the chain when this handler is removed from the chain, for example, when the connection is upgraded to use websockets. This is useful, for example, for removing the reactive streams publisher/subscriber from the chain in that event.
dependentHandlers
- The handlers that depend on this handler.protected boolean hasBody(io.netty.handler.codec.http.HttpRequest request)
request
- The incoming messageprotected io.netty.handler.codec.http.HttpRequest createEmptyMessage(io.netty.handler.codec.http.HttpRequest request)
request
- The incoming messageprotected io.netty.handler.codec.http.HttpRequest createStreamedMessage(io.netty.handler.codec.http.HttpRequest httpRequest, Publisher<? extends io.netty.handler.codec.http.HttpContent> stream)
httpRequest
- The incoming messagestream
- The publisher for the Http Contentpublic void channelRead(io.netty.channel.ChannelHandlerContext ctx, Object msg) throws Exception
channelRead
in interface io.netty.channel.ChannelInboundHandler
Exception
protected void receivedInMessage(io.netty.channel.ChannelHandlerContext ctx)
Overridden by sub classes for state tracking.
ctx
- The channel handler contextprotected void sentOutMessage(io.netty.channel.ChannelHandlerContext ctx)
Overridden by sub classes for state tracking.
ctx
- The channel handler contextprotected void unbufferedWrite(io.netty.channel.ChannelHandlerContext ctx, io.netty.handler.codec.http.HttpResponse message, io.netty.channel.ChannelPromise promise)
ctx
- The channel handler contextmessage
- The messagepromise
- The promiseprotected boolean isValidOutMessage(Object msg)
msg
- The messageprotected void consumedInMessage(io.netty.channel.ChannelHandlerContext ctx)
Overridden by sub classes for state tracking.
ctx
- The channel handler contextprotected void bodyRequested(io.netty.channel.ChannelHandlerContext ctx)
Provided so that the server subclass can intercept this to send a 100 continue response.
ctx
- The channel handler contextprotected final boolean isClient()
public void handlerRemoved(io.netty.channel.ChannelHandlerContext ctx) throws Exception
handlerRemoved
in interface io.netty.channel.ChannelHandler
handlerRemoved
in class io.netty.channel.ChannelHandlerAdapter
Exception
protected void receivedOutMessage(io.netty.channel.ChannelHandlerContext ctx)
Overridden by sub classes for state tracking.
ctx
- The channel handler contextprotected void subscribeSubscriberToStream(StreamedHttpMessage msg, Subscriber<io.netty.handler.codec.http.HttpContent> subscriber)
Provided so that the client subclass can intercept this to hold off sending the body of an expect 100 continue request.
msg
- The streamed Http messagesubscriber
- The subscriber for the Http Contentprotected int getStreamId(Object msg)
msg
- The messagepublic void channelReadComplete(io.netty.channel.ChannelHandlerContext ctx) throws Exception
channelReadComplete
in interface io.netty.channel.ChannelInboundHandler
channelReadComplete
in class io.netty.channel.ChannelInboundHandlerAdapter
Exception
public void write(io.netty.channel.ChannelHandlerContext ctx, Object msg, io.netty.channel.ChannelPromise promise) throws Exception
write
in interface io.netty.channel.ChannelOutboundHandler
write
in class io.netty.channel.ChannelDuplexHandler
Exception
public void channelWritabilityChanged(io.netty.channel.ChannelHandlerContext ctx)
channelWritabilityChanged
in interface io.netty.channel.ChannelInboundHandler
channelWritabilityChanged
in class io.netty.channel.ChannelInboundHandlerAdapter
protected boolean isValidInMessage(Object msg)
msg
- The message