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();
}