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

    Constructors
    Constructor
    Description
     
    HttpStreamsServerHandler(List<io.netty.channel.ChannelHandler> dependentHandlers)
    Create a new handler that is depended on by the given handlers.
  • Method Summary

    Modifier and Type
    Method
    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)
     
    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)
     
    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
    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.
    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)
     
    void
    write(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, 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 Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods inherited from interface io.netty.channel.ChannelHandler

    handlerAdded
  • Constructor Details

    • HttpStreamsServerHandler

      public HttpStreamsServerHandler()
    • HttpStreamsServerHandler

      public HttpStreamsServerHandler(List<io.netty.channel.ChannelHandler> dependentHandlers)
      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

      public void channelRead(io.netty.channel.ChannelHandlerContext ctx, Object msg) throws Exception
      Specified by:
      channelRead in interface io.netty.channel.ChannelInboundHandler
      Throws:
      Exception
    • 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

      public void handlerRemoved(io.netty.channel.ChannelHandlerContext ctx) throws Exception
      Specified by:
      handlerRemoved in interface io.netty.channel.ChannelHandler
      Overrides:
      handlerRemoved in class io.netty.channel.ChannelHandlerAdapter
      Throws:
      Exception
    • 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

      public void channelReadComplete(io.netty.channel.ChannelHandlerContext ctx) throws Exception
      Specified by:
      channelReadComplete in interface io.netty.channel.ChannelInboundHandler
      Overrides:
      channelReadComplete in class io.netty.channel.ChannelInboundHandlerAdapter
      Throws:
      Exception
    • write

      public void write(io.netty.channel.ChannelHandlerContext ctx, Object msg, io.netty.channel.ChannelPromise promise) throws Exception
      Specified by:
      write in interface io.netty.channel.ChannelOutboundHandler
      Overrides:
      write in class io.netty.channel.ChannelDuplexHandler
      Throws:
      Exception