Class HttpStreamsServerHandler
java.lang.Object
io.netty.channel.ChannelHandlerAdapter
io.netty.channel.ChannelInboundHandlerAdapter
io.netty.channel.ChannelDuplexHandler
org.playframework.netty.http.HttpStreamsServerHandler
- All Implemented Interfaces:
io.netty.channel.ChannelHandler, io.netty.channel.ChannelInboundHandler, io.netty.channel.ChannelOutboundHandler
public class HttpStreamsServerHandler
extends io.netty.channel.ChannelDuplexHandler
Handler that reads
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.-
Nested Class Summary
Nested classes/interfaces inherited from interface io.netty.channel.ChannelHandler
io.netty.channel.ChannelHandler.Sharable -
Constructor Summary
ConstructorsConstructorDescriptionHttpStreamsServerHandler(List<io.netty.channel.ChannelHandler> dependentHandlers) Create a new handler that is depended on by the given handlers. -
Method Summary
Modifier and TypeMethodDescriptionprotected voidbodyRequested(io.netty.channel.ChannelHandlerContext ctx) Invoked every time a read of the incoming body is requested by the subscriber.voidchannelRead(io.netty.channel.ChannelHandlerContext ctx, Object msg) voidchannelReadComplete(io.netty.channel.ChannelHandlerContext ctx) protected voidconsumedInMessage(io.netty.channel.ChannelHandlerContext ctx) Invoked when an incoming message is fully consumed.protected io.netty.handler.codec.http.HttpRequestcreateEmptyMessage(io.netty.handler.codec.http.HttpRequest request) Create an empty incoming message.protected io.netty.handler.codec.http.HttpRequestcreateStreamedMessage(io.netty.handler.codec.http.HttpRequest httpRequest, org.reactivestreams.Publisher<io.netty.handler.codec.http.HttpContent> stream) Create a streamed incoming message with the given stream.voidhandlerRemoved(io.netty.channel.ChannelHandlerContext ctx) protected booleanhasBody(io.netty.handler.codec.http.HttpRequest request) Whether the given incoming message has a body.protected voidreceivedInMessage(io.netty.channel.ChannelHandlerContext ctx) Invoked when an incoming message is first received.protected voidreceivedOutMessage(io.netty.channel.ChannelHandlerContext ctx) Invoked when an outgoing message is first received.protected voidsentOutMessage(io.netty.channel.ChannelHandlerContext ctx) Invoked when an outgoing message is fully sent.protected voidsubscribeSubscriberToStream(StreamedHttpMessage msg, org.reactivestreams.Subscriber<io.netty.handler.codec.http.HttpContent> subscriber) Subscribe the given subscriber to the given streamed message.protected voidunbufferedWrite(io.netty.channel.ChannelHandlerContext ctx, org.playframework.netty.http.HttpStreamsHandler<io.netty.handler.codec.http.HttpRequest, io.netty.handler.codec.http.HttpResponse>.org.playframework.netty.http.HttpStreamsHandler.Outgoing out) voidwrite(io.netty.channel.ChannelHandlerContext ctx, Object msg, io.netty.channel.ChannelPromise promise) Methods inherited from class io.netty.channel.ChannelDuplexHandler
bind, close, connect, deregister, disconnect, flush, readMethods inherited from class io.netty.channel.ChannelInboundHandlerAdapter
channelActive, channelInactive, channelRegistered, channelUnregistered, channelWritabilityChanged, exceptionCaught, userEventTriggeredMethods inherited from class io.netty.channel.ChannelHandlerAdapter
ensureNotSharable, handlerAdded, isSharableMethods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface io.netty.channel.ChannelHandler
handlerAdded
-
Constructor Details
-
HttpStreamsServerHandler
public HttpStreamsServerHandler() -
HttpStreamsServerHandler
Create a new handler that is depended on by the given handlers. 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.- Parameters:
dependentHandlers- The handlers that depend on this handler.
-
-
Method Details
-
hasBody
protected boolean hasBody(io.netty.handler.codec.http.HttpRequest request) Whether the given incoming message has a body. -
createEmptyMessage
protected io.netty.handler.codec.http.HttpRequest createEmptyMessage(io.netty.handler.codec.http.HttpRequest request) Create an empty incoming message. This must be of type FullHttpMessage, and is invoked when we've determined that an incoming message can't have a body, so we send it on as a FullHttpMessage. -
createStreamedMessage
protected io.netty.handler.codec.http.HttpRequest createStreamedMessage(io.netty.handler.codec.http.HttpRequest httpRequest, org.reactivestreams.Publisher<io.netty.handler.codec.http.HttpContent> stream) Create a streamed incoming message with the given stream. -
channelRead
-
receivedInMessage
protected void receivedInMessage(io.netty.channel.ChannelHandlerContext ctx) Invoked when an incoming message is first received. Overridden by sub classes for state tracking. -
sentOutMessage
protected void sentOutMessage(io.netty.channel.ChannelHandlerContext ctx) Invoked when an outgoing message is fully sent. Overridden by sub classes for state tracking. -
unbufferedWrite
protected void unbufferedWrite(io.netty.channel.ChannelHandlerContext ctx, org.playframework.netty.http.HttpStreamsHandler<io.netty.handler.codec.http.HttpRequest, io.netty.handler.codec.http.HttpResponse>.org.playframework.netty.http.HttpStreamsHandler.Outgoing out) -
consumedInMessage
protected void consumedInMessage(io.netty.channel.ChannelHandlerContext ctx) Invoked when an incoming message is fully consumed. Overridden by sub classes for state tracking. -
bodyRequested
protected void bodyRequested(io.netty.channel.ChannelHandlerContext ctx) Invoked every time a read of the incoming body is requested by the subscriber. Provided so that the server subclass can intercept this to send a 100 continue response. -
handlerRemoved
-
receivedOutMessage
protected void receivedOutMessage(io.netty.channel.ChannelHandlerContext ctx) Invoked when an outgoing message is first received. Overridden by sub classes for state tracking. -
subscribeSubscriberToStream
protected void subscribeSubscriberToStream(StreamedHttpMessage msg, org.reactivestreams.Subscriber<io.netty.handler.codec.http.HttpContent> subscriber) Subscribe the given subscriber to the given streamed message. Provided so that the client subclass can intercept this to hold off sending the body of an expect 100 continue request. -
channelReadComplete
-
write
-