Package org.playframework.netty.http
Class HttpStreamsClientHandler
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.HttpResponse,io.netty.handler.codec.http.HttpRequest>
org.playframework.netty.http.HttpStreamsClientHandler
- All Implemented Interfaces:
io.netty.channel.ChannelHandler
,io.netty.channel.ChannelInboundHandler
,io.netty.channel.ChannelOutboundHandler
public class HttpStreamsClientHandler
extends HttpStreamsHandler<io.netty.handler.codec.http.HttpResponse,io.netty.handler.codec.http.HttpRequest>
Handler that converts written
StreamedHttpRequest
messages into HttpRequest
messages
followed by HttpContent
messages and reads HttpResponse
messages followed by
HttpContent
messages and produces StreamedHttpResponse
messages.
This allows request and response bodies to be handled using reactive streams.
There are two types of messages that this handler accepts for writing, StreamedHttpRequest
and
FullHttpRequest
. Writing any other messages may potentially lead to HTTP message mangling.
There are two types of messages that this handler will send down the chain, StreamedHttpResponse
,
and FullHttpResponse
. If ChannelOption.AUTO_READ
is false for the channel,
then any StreamedHttpResponse
messages must be subscribed to consume the body, otherwise
it's possible that no read will be done of the messages.
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 org.reactivestreams.Subscriber
<io.netty.handler.codec.http.HttpContent> private StreamedHttpMessage
private io.netty.channel.ChannelPromise
private boolean
private int
private int
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid
channelRead
(io.netty.channel.ChannelHandlerContext ctx, Object msg) void
close
(io.netty.channel.ChannelHandlerContext ctx, io.netty.channel.ChannelPromise future) protected void
consumedInMessage
(io.netty.channel.ChannelHandlerContext ctx) Invoked when an incoming message is fully consumed.protected io.netty.handler.codec.http.HttpResponse
createEmptyMessage
(io.netty.handler.codec.http.HttpResponse response) Create an empty incoming message.protected io.netty.handler.codec.http.HttpResponse
createStreamedMessage
(io.netty.handler.codec.http.HttpResponse response, org.reactivestreams.Publisher<io.netty.handler.codec.http.HttpContent> stream) Create a streamed incoming message with the given stream.protected boolean
hasBody
(io.netty.handler.codec.http.HttpResponse response) Whether the given incoming message has a body.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, org.reactivestreams.Subscriber<io.netty.handler.codec.http.HttpContent> subscriber) Subscribe the given subscriber to the given streamed message.Methods inherited from class org.playframework.netty.http.HttpStreamsHandler
bodyRequested, channelReadComplete, receivedInMessage, unbufferedWrite, write
Methods inherited from class io.netty.channel.ChannelDuplexHandler
bind, 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, handlerRemoved, 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, handlerRemoved
-
Field Details
-
inFlight
private int inFlight -
withServer
private int withServer -
closeOnZeroInFlight
private io.netty.channel.ChannelPromise closeOnZeroInFlight -
awaiting100Continue
private org.reactivestreams.Subscriber<io.netty.handler.codec.http.HttpContent> awaiting100Continue -
awaiting100ContinueMessage
-
ignoreResponseBody
private boolean ignoreResponseBody
-
-
Constructor Details
-
HttpStreamsClientHandler
public HttpStreamsClientHandler()
-
-
Method Details
-
hasBody
protected boolean hasBody(io.netty.handler.codec.http.HttpResponse response) Description copied from class:HttpStreamsHandler
Whether the given incoming message has a body.- Specified by:
hasBody
in classHttpStreamsHandler<io.netty.handler.codec.http.HttpResponse,
io.netty.handler.codec.http.HttpRequest>
-
close
public void close(io.netty.channel.ChannelHandlerContext ctx, io.netty.channel.ChannelPromise future) throws Exception - Specified by:
close
in interfaceio.netty.channel.ChannelOutboundHandler
- Overrides:
close
in classio.netty.channel.ChannelDuplexHandler
- Throws:
Exception
-
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.HttpResponse,
io.netty.handler.codec.http.HttpRequest>
-
receivedOutMessage
protected void receivedOutMessage(io.netty.channel.ChannelHandlerContext ctx) Description copied from class:HttpStreamsHandler
Invoked when an outgoing message is first received. Overridden by sub classes for state tracking.- Overrides:
receivedOutMessage
in classHttpStreamsHandler<io.netty.handler.codec.http.HttpResponse,
io.netty.handler.codec.http.HttpRequest>
-
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.HttpResponse,
io.netty.handler.codec.http.HttpRequest>
-
createEmptyMessage
protected io.netty.handler.codec.http.HttpResponse createEmptyMessage(io.netty.handler.codec.http.HttpResponse response) 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.HttpResponse,
io.netty.handler.codec.http.HttpRequest>
-
createStreamedMessage
protected io.netty.handler.codec.http.HttpResponse createStreamedMessage(io.netty.handler.codec.http.HttpResponse response, 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.HttpResponse,
io.netty.handler.codec.http.HttpRequest>
-
subscribeSubscriberToStream
protected void subscribeSubscriberToStream(StreamedHttpMessage msg, org.reactivestreams.Subscriber<io.netty.handler.codec.http.HttpContent> subscriber) Description copied from class:HttpStreamsHandler
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.- Overrides:
subscribeSubscriberToStream
in classHttpStreamsHandler<io.netty.handler.codec.http.HttpResponse,
io.netty.handler.codec.http.HttpRequest>
-
channelRead
- Specified by:
channelRead
in interfaceio.netty.channel.ChannelInboundHandler
- Overrides:
channelRead
in classHttpStreamsHandler<io.netty.handler.codec.http.HttpResponse,
io.netty.handler.codec.http.HttpRequest> - Throws:
Exception
-