Package org.playframework.netty.http
Class HttpStreamsServerHandler
java.lang.Object
io.netty.channel.ChannelHandlerAdapter
io.netty.channel.ChannelInboundHandlerAdapter
io.netty.channel.ChannelDuplexHandler
org.playframework.netty.http.HttpStreamsHandler<io.netty.handler.codec.http.HttpRequest,io.netty.handler.codec.http.HttpResponse>
org.playframework.netty.http.HttpStreamsServerHandler
- All Implemented Interfaces:
io.netty.channel.ChannelHandler
,io.netty.channel.ChannelInboundHandler
,io.netty.channel.ChannelOutboundHandler
public class HttpStreamsServerHandler
extends HttpStreamsHandler<io.netty.handler.codec.http.HttpRequest,io.netty.handler.codec.http.HttpResponse>
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 class org.playframework.netty.http.HttpStreamsHandler
HttpStreamsHandler.Outgoing
Nested classes/interfaces inherited from interface io.netty.channel.ChannelHandler
io.netty.channel.ChannelHandler.Sharable
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate boolean
private boolean
private final List
<io.netty.channel.ChannelHandler> private int
private io.netty.handler.codec.http.HttpRequest
private boolean
private HttpStreamsHandler<io.netty.handler.codec.http.HttpRequest,
io.netty.handler.codec.http.HttpResponse>.Outgoing -
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 void
bodyRequested
(io.netty.channel.ChannelHandlerContext ctx) Invoked every time a read of the incoming body is requested by the subscriber.private boolean
canHaveBody
(io.netty.handler.codec.http.HttpResponse message) void
channelRead
(io.netty.channel.ChannelHandlerContext ctx, Object msg) 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, org.reactivestreams.Publisher<io.netty.handler.codec.http.HttpContent> stream) Create a streamed incoming message with the given stream.void
handlerRemoved
(io.netty.channel.ChannelHandlerContext ctx) private void
handleWebSocketResponse
(io.netty.channel.ChannelHandlerContext ctx, HttpStreamsHandler<io.netty.handler.codec.http.HttpRequest, io.netty.handler.codec.http.HttpResponse>.Outgoing out) protected boolean
hasBody
(io.netty.handler.codec.http.HttpRequest request) Whether the given incoming message has a body.protected void
receivedInMessage
(io.netty.channel.ChannelHandlerContext ctx) Invoked when an incoming message is first received.protected void
sentOutMessage
(io.netty.channel.ChannelHandlerContext ctx) Invoked when an outgoing message is fully sent.protected void
unbufferedWrite
(io.netty.channel.ChannelHandlerContext ctx, HttpStreamsHandler<io.netty.handler.codec.http.HttpRequest, io.netty.handler.codec.http.HttpResponse>.Outgoing out) Methods inherited from class org.playframework.netty.http.HttpStreamsHandler
channelReadComplete, receivedOutMessage, subscribeSubscriberToStream, write
Methods inherited from class io.netty.channel.ChannelDuplexHandler
bind, close, connect, deregister, disconnect, flush, read
Methods inherited from class io.netty.channel.ChannelInboundHandlerAdapter
channelActive, channelInactive, channelRegistered, channelUnregistered, channelWritabilityChanged, exceptionCaught, userEventTriggered
Methods inherited from class io.netty.channel.ChannelHandlerAdapter
ensureNotSharable, handlerAdded, isSharable
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface io.netty.channel.ChannelHandler
handlerAdded
-
Field Details
-
lastRequest
private io.netty.handler.codec.http.HttpRequest lastRequest -
webSocketResponse
private HttpStreamsHandler<io.netty.handler.codec.http.HttpRequest,io.netty.handler.codec.http.HttpResponse>.Outgoing webSocketResponse -
inFlight
private int inFlight -
continueExpected
private boolean continueExpected -
sendContinue
private boolean sendContinue -
close
private boolean close -
dependentHandlers
-
-
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) Description copied from class:HttpStreamsHandler
Whether the given incoming message has a body.- Specified by:
hasBody
in classHttpStreamsHandler<io.netty.handler.codec.http.HttpRequest,
io.netty.handler.codec.http.HttpResponse>
-
createEmptyMessage
protected io.netty.handler.codec.http.HttpRequest createEmptyMessage(io.netty.handler.codec.http.HttpRequest request) Description copied from class:HttpStreamsHandler
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.- Specified by:
createEmptyMessage
in classHttpStreamsHandler<io.netty.handler.codec.http.HttpRequest,
io.netty.handler.codec.http.HttpResponse>
-
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) Description copied from class:HttpStreamsHandler
Create a streamed incoming message with the given stream.- Specified by:
createStreamedMessage
in classHttpStreamsHandler<io.netty.handler.codec.http.HttpRequest,
io.netty.handler.codec.http.HttpResponse>
-
channelRead
- Specified by:
channelRead
in interfaceio.netty.channel.ChannelInboundHandler
- Overrides:
channelRead
in classHttpStreamsHandler<io.netty.handler.codec.http.HttpRequest,
io.netty.handler.codec.http.HttpResponse> - Throws:
Exception
-
receivedInMessage
protected void receivedInMessage(io.netty.channel.ChannelHandlerContext ctx) Description copied from class:HttpStreamsHandler
Invoked when an incoming message is first received. Overridden by sub classes for state tracking.- Overrides:
receivedInMessage
in classHttpStreamsHandler<io.netty.handler.codec.http.HttpRequest,
io.netty.handler.codec.http.HttpResponse>
-
sentOutMessage
protected void sentOutMessage(io.netty.channel.ChannelHandlerContext ctx) Description copied from class:HttpStreamsHandler
Invoked when an outgoing message is fully sent. Overridden by sub classes for state tracking.- Overrides:
sentOutMessage
in classHttpStreamsHandler<io.netty.handler.codec.http.HttpRequest,
io.netty.handler.codec.http.HttpResponse>
-
unbufferedWrite
protected void unbufferedWrite(io.netty.channel.ChannelHandlerContext ctx, HttpStreamsHandler<io.netty.handler.codec.http.HttpRequest, io.netty.handler.codec.http.HttpResponse>.Outgoing out) - Overrides:
unbufferedWrite
in classHttpStreamsHandler<io.netty.handler.codec.http.HttpRequest,
io.netty.handler.codec.http.HttpResponse>
-
canHaveBody
private boolean canHaveBody(io.netty.handler.codec.http.HttpResponse message) -
consumedInMessage
protected void consumedInMessage(io.netty.channel.ChannelHandlerContext ctx) Description copied from class:HttpStreamsHandler
Invoked when an incoming message is fully consumed. Overridden by sub classes for state tracking.- Overrides:
consumedInMessage
in classHttpStreamsHandler<io.netty.handler.codec.http.HttpRequest,
io.netty.handler.codec.http.HttpResponse>
-
handleWebSocketResponse
private void handleWebSocketResponse(io.netty.channel.ChannelHandlerContext ctx, HttpStreamsHandler<io.netty.handler.codec.http.HttpRequest, io.netty.handler.codec.http.HttpResponse>.Outgoing out) -
bodyRequested
protected void bodyRequested(io.netty.channel.ChannelHandlerContext ctx) Description copied from class:HttpStreamsHandler
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.- Overrides:
bodyRequested
in classHttpStreamsHandler<io.netty.handler.codec.http.HttpRequest,
io.netty.handler.codec.http.HttpResponse>
-
handlerRemoved
- Specified by:
handlerRemoved
in interfaceio.netty.channel.ChannelHandler
- Overrides:
handlerRemoved
in classio.netty.channel.ChannelHandlerAdapter
- Throws:
Exception
-