       self.outboundState = .ignore
       self.inboundState = .ignore
     }
+  }
+
+  private func appendResponseText(_ buffer: ByteBuffer) {
+    if self.responseTextBuffers == nil {
+      self.responseTextBuffers = CircularBuffer()
+    }
+    self.responseTextBuffers!.append(buffer)
   }
 }
 

            allocator: context.channel.allocator,
            compressed: messageContext.compressed
          )
          self.responseTextBuffers.append(buffer)

          // Since we stored the written data, mark the write promise as successful so that the
          // ServerStreaming provider continues sending the data.

  // TODO(kaipi): Extract all gRPC Web processing logic into an independent handler only added on
  // the HTTP1.1 pipeline, as it's starting to get in the way of readability.
  private var requestTextBuffer: NIO.ByteBuffer!
  private var responseTextBuffers: CircularBuffer<ByteBuffer>?

  var inboundState = InboundState.expectingHeaders {
    willSet {
