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

    Fields
    Modifier and Type
    Field
    Description
    private 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

    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.
    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

      private final List<io.netty.channel.ChannelHandler> dependentHandlers
  • 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)
      Description copied from class: HttpStreamsHandler
      Whether the given incoming message has a body.
      Specified by:
      hasBody in class HttpStreamsHandler<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 class HttpStreamsHandler<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 class HttpStreamsHandler<io.netty.handler.codec.http.HttpRequest,io.netty.handler.codec.http.HttpResponse>
    • channelRead

      public void channelRead(io.netty.channel.ChannelHandlerContext ctx, Object msg) throws Exception
      Specified by:
      channelRead in interface io.netty.channel.ChannelInboundHandler
      Overrides:
      channelRead in class HttpStreamsHandler<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 class HttpStreamsHandler<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 class HttpStreamsHandler<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 class HttpStreamsHandler<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 class HttpStreamsHandler<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 class HttpStreamsHandler<io.netty.handler.codec.http.HttpRequest,io.netty.handler.codec.http.HttpResponse>
    • 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