void _trySendData()

in lib/src/flowcontrol/stream_queues.dart [97:148]


  void _trySendData() {
    var queueLenBefore = _messages.length;

    while (_messages.isNotEmpty) {
      var message = _messages.first;

      if (message is HeadersMessage) {
        _messages.removeFirst();
        connectionMessageQueue.enqueueMessage(message);
      } else if (message is DataMessage) {
        var bytesAvailable = streamWindow.peerWindowSize;
        if (bytesAvailable > 0 || message.bytes.isEmpty) {
          _messages.removeFirst();

          // Do we need to fragment?
          var messageToSend = message;
          var messageBytes = message.bytes;
          // TODO: Do not fragment if the number of bytes we can send is too low
          if (messageBytes.length > bytesAvailable) {
            var partA = viewOrSublist(messageBytes, 0, bytesAvailable);
            var partB = viewOrSublist(messageBytes, bytesAvailable,
                messageBytes.length - bytesAvailable);
            var messageA = DataMessage(message.streamId, partA, false);
            var messageB =
                DataMessage(message.streamId, partB, message.endStream);

            // Put the second fragment back into the front of the queue.
            _messages.addFirst(messageB);

            // Send the first fragment.
            messageToSend = messageA;
          }

          writtenBytes += messageToSend.bytes.length;
          streamWindow.decreaseWindow(messageToSend.bytes.length);
          connectionMessageQueue.enqueueMessage(messageToSend);
        } else {
          break;
        }
      } else if (message is ResetStreamMessage) {
        _messages.removeFirst();
        connectionMessageQueue.enqueueMessage(message);
      } else {
        throw StateError('Unknown messages type: ${message.runtimeType}');
      }
    }
    if (queueLenBefore > 0 && _messages.isEmpty) {
      bufferIndicator.markUnBuffered();
    }

    onCheckForClose();
  }